请和我一起学习机器学习算法(线性回归)_请使用课堂上讲解的线性回归算法对训练集进行训练,并基于测试集进行精度评估。-程序员宅基地

技术标签: 机器学习算法学习  机器学习  

线性回归灵魂三问

  • 什么是线性回归
    所谓线性回归实际上就是利用已知的样本(已知数据),选择一个线性方程,并对其进行拟合,并通过拟合得到的方程来对未知的数据进行预测
  • 线性回归能干什么
    线性回归主要是用来预测,和判断合理性。 比如用身高预测体重,利用广告投入预测商品销售额等等。
  • 线性回归的难点是什么
    难点即是重点:变量选择(多元下的重线性)、预防过拟合、模型检验。

NOTE: 一元线性回归就不在这里赘述了,一般来说想学机器学习算法的人都有一定的数学基础。

线性回归数学分析

一般线性回归

1.公式定义

就我们所知道的那样,多元的线性方程如下。
h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta_0x_0+\theta_{1}x_1+\theta_{2}x_2+...+\theta_{n}x_n hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn
其中 x 0 = 1 x_0=1 x0=1表示常数项。转化成向量表达为:
h θ ( x ) = Θ T X h_\theta(x)=\Theta^TX hθ(x)=ΘTX
Θ 、 X \Theta、X ΘX为一个一行n+1列的向量。
我们用参数x表示描述一个事物的属性,用h(x)表示我们对给定属性的预测。我们希望我们的预测结果符合客观事实,并且可以作为对未知事物的推测。

要使结果符合客观事实,则我们希望我们的预测结果h(x)和实际实物的标签(比如预测的类别和实际的类别)的误差尽可能的小。于是…

2. 参数求解之梯度下降

现在我们可以将问题转化成我们熟悉的数学表达模式了:
问题:我们有m个已知的样本( ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) (\boldsymbol x^1,y^1),(\boldsymbol x^2,y^2)...(\boldsymbol x^n,y^n) (x1,y1),(x2,y2)...(xn,yn)), 其中 x ( i ) x^{(i)} x(i)是一个n+1维的列向量。求一组参数 ( θ 0 , θ 1 , . . . , θ n ) (\theta_0,\theta_1,...,\theta_n) (θ0,θ1,...,θn),使得 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(\boldsymbol x^i)-y^i) m1i=1m(hθ(xi)yi)最小。

实际上对于上面公式的的推导,我们默认使用了一种叫做误差平方和的代价函数(预测误差的代价损失,我们希望代价函数越小越好,表示我们使用这个模型的成本越低)。也就是说如果使用不同的代价函数,则得到的误差损失的表达是不同的。 代价函数可以表示为
J ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x i ) − y i ) 2 J(\theta_0,\theta_1,...,\theta_n)=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(\boldsymbol x^i)-y^i)^2 J(θ0,θ1,...,θn)=2m1i=1m(hθ(xi)yi)2
NOTE: 对于权值 1 2 m \frac{1}{2m} 2m1 不必太过纠结,实际上应该是 1 m \frac{1}{m} m1,但是为了方便后续化简,添加了一个二分之一,实际上着这并不会影响我们对其参数进行求解。

接着就可以用梯度下降来优化这些参数了。对于初学者来说,可能对于像我这样的初学者来说,梯度下降不太好理解,但是在机器学习算法中,梯度下降是无处不在的。为了更加全面和完整,这里留个空位,到时如果有必要在专门来梳理一下梯度下降。
【梯度下降 】

θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , . . . , θ n ) \theta_j:=\theta_j-\alpha \frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1,...,\theta_n) θj:=θjαθjJ(θ0,θ1,...,θn)

上面这个公式,就是使用梯度下降对参数进行更新,其中 α \alpha α表示学习速率,也就是沿着低度方向,向下迈进的步幅。 ∂ ∂ θ j J ( θ 0 , θ 1 , . . . , θ n ) \frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1,...,\theta_n) θjJ(θ0,θ1,...,θn)表示代价函数的梯度方向。
θ j : = θ j − α ∂ ∂ θ j { 1 2 m ∑ i = 1 m ( h θ ( x i ) − y i ) 2 } \theta_j:=\theta_j-\alpha \frac{\partial}{\partial \theta_j}\{\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(\boldsymbol x^i)-y^i)^2 \} θj:=θjαθj{ 2m1i=1m(hθ(xi)yi)2}
加法的求导是可以分别求导的,所以我们可以对括号进行求导
∂ ∂ θ j ( h θ ( x i ) − y i ) 2 ) = 2 ⋅ x j ⋅ ( h θ ( x i ) − y i ) ) \frac{\partial}{\partial \theta_j}(h_{\theta}(\boldsymbol x^i)-y^i)^2) = 2 \cdot x_j \cdot (h_{\theta}(\boldsymbol x^i)-y^i)) θj(hθ(xi)yi)2)=2xj(hθ(xi)yi))
代入上面等式,(原来的引入的那个2,就是在这里消除掉的)
θ j : = θ j − α ⋅ 1 m ∑ i = 1 m ( x j ⋅ ( h θ ( x i ) − y i ) ) ) \theta_j:=\theta_j-\alpha \cdot \frac{1}{m} \sum_{i=1}^{m}(x_j \cdot (h_{\theta}(\boldsymbol x^i)-y^i))) θj:=θjαm1i=1m(xj(hθ(xi)yi)))
我们通过随机一组参数,并且通过上面的梯度下降的方式直接求解,直到收敛。

3. 参数求解之正规方程

我们也可以通过直接解方程的方式获得最后优化参数。
为了很好的解释我们下面所描述的方程,请记得我们最初的向量表达: h θ ( x ) = Θ T X h_\theta(x)=\Theta^TX hθ(x)=ΘTX
如果我们把各个学习样本的 y i y^i yi 组成一个向量Y,则我们需要求解的方程就可以变成
min ⁡ θ ∑ i = 1 m ( Y − Θ T X ) T ( Y − Θ T X ) \min_{\theta} \sum_{i=1}^{m}(Y-\Theta^TX)^T(Y-Θ ^TX) θmini=1m(YΘTX)T(YΘTX)
对向量 Θ \Theta Θ求导(这里又是一个不好理解的点,倍感数学知识不够用啊)
∂ ∂ Θ ∑ i = 1 m ( Y − Θ T X ) T ( Y − Θ T X ) = 2 ⋅ X T ( X Θ T − Y ) \frac{\partial}{\partial \Theta}\sum_{i=1}^{m}(Y-\Theta^TX)^T(Y-Θ ^TX)=2 \cdot X^{T}(X \Theta^T-Y) Θi=1m(YΘTX)T(YΘTX)=2XT(XΘTY)
令上式为0;当 ( X T X ) − 1 (X^TX)^{-1} (XTX)1存在的时候,
Θ T = ( X T X ) − 1 X T Y \Theta^T=(X^TX)^{-1}X^TY ΘT=(XTX)1XTY
如果不存在,则可以通过求伪逆的方式代替。
实际上如果从矩阵的映射的角度来分析的话,对于这个公式就好理解了,问题的关键是,但是矩阵的映射本身就不好理解。

4. 梯度下降和正规方程的对比

梯度下降 正规方程
需要选择合适的学习率 不需选择学习率
需要多次迭代获得参数 一次计算直接获得参数
使用与特征值多的模型 适用于特征值小的模型
使用于各个类型 只使用于线性模型,其他模型不适合

正规方程由于需要求矩阵的逆,一般情况,求n介矩阵的逆需要N的三次方的算法复杂度,所以当n很大的时候(一般>10000)选择梯度下降模型

对数几率回归

在分类任务中,我们希望将线性模型产生的连续的值转化为离散的0、1值用来标记各个样本。理想中我们使用单位阶跃函数来实现,如下图的红色部分。但是由于单位阶跃函数不可微,不变与计算和使用,我们找到一个可以替代单位阶跃函数的 函数。而 对数几率函数(logistic function)就是这样一种函数。

对数几率函数是一种典型的"sigmoid 函数",所谓sigmoid 函数,就是长相是S型的函数,而对数几率函数就是其中的一种。
y = 1 1 + e − Θ T X y=\frac{1}{1+e^{-\Theta^TX}} y=1+eΘTX1
通过简单的化简:
ln ⁡ y 1 − y = Θ T X \ln \frac{y}{1-y}=\Theta^TX ln1yy=ΘTX
如果把y 考虑为正例的概率,而1-y则为反例的概率。两者的比例反映了x作为正例的相对可能性,称为“几率”。对几率取对数,则称为对数几率

实际上,y实际上使我们在X的样本存在条件下认为其为正例的概率,则可以考虑y为在x条件下的后验概率。
ln ⁡ p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = Θ T X \ln \frac{p(y=1|x)}{p(y=0|x)}=\Theta^TX lnp(y=0x)p(y=1x)=ΘTX
则(直接计算解方程,这两货加起来为1)
p ( y = 1 ∣ x ) = e Θ T X 1 + e Θ T X p ( y = 1 ∣ x ) = 1 1 + e Θ T X p(y=1|x)=\frac{e^{\Theta^TX}}{1+e^{\Theta^TX}} \\ p(y=1|x)=\frac{1}{1+e^{\Theta^TX}} p(y=1x)=1+eΘTXeΘTXp(y=1x)=1+eΘTX1
我们希望的是,每个样本属于自己标记的概率越大越好。
接下来是一段复杂的方法,对于对数回归,先到这里,了解即可。

线性判别分析

线性判别分析 (Linear Discriminant Analysis,简称 LDA) 思想非常朴素,设法将给定样例投影到一条直 线上 ,使得同类样例的投影点尽可能接近、 异类样例 的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别. 如图
在这里插入图片描述

线性回归的变量选择

多元线性回归的核心问题应该是变量的选择。

变量选择

变量的选择也是模型的对比,我们希望用最小的变量数来获得最好的结果。

  • AIC 准则

AIC准则是由日本统计学家Akaike与1973年提出的,全称是最小化信息量准则(Akaike Information Criterion)。它是拟合精度和参数个数的加权函数:
AIC=2(模型参数的个数)-2ln(模型的极大似然函数)

这个不是太好理解,比如说模型的最大似然函数是什么呢? 在线性模型中所谓的最大似然函数指的就是残差的倒数。

  • BIC 准则

AIC为模型选择提供了有效的规则,但也有不足之处。当样本容量很大时,在AIC准则中拟合误差提供的信息就要受到样本容量的放大,而参数个数的惩罚因子却和样本容量没关系(一直是2),因此当样本容量很大时,使用AIC准则选择的模型不收敛与真实模型,它通常比真实模型所含的未知参数个数要多。BIC(Bayesian InformationCriterion)贝叶斯信息准则是Schwartz在1978年根据Bayes理论提出的判别准则,称为SBC准则(也称BIC),弥补了AIC的不足。
BIC = ln(n)(模型中参数的个数) - 2ln(模型的极大似然函数值)

  • 基于误差的准则

当把预测当成主要任务和目标的时候,通过预测误差作为判断模型的指标
P E = E ∣ ∣ y − y ′ ∣ ∣ 2 PE=E||y-y^{'}||^2 PE=Eyy2

线性回归的训练

多分类的学习

核心思路是拆解法,将类别分界,通过一对一,一对多,多对多
一对一
两两分类,选择分类多的一种
一对多
一和其余分类,选择正例
多对多
先对种类分组,而后在分

类别不平衡的问题

现有技术大体上有三类做法:

  1. 第一类是直接对训练集里的反类样例进行"欠采样" (undersampling) ,即去除一些反倒使得正、反例数日接近7 然后再进行学习;

  2. 第二类是对训练集里的正类样例进行"过来样" (oversampling) ,即增加一些正例使得正、反例数目接近,然后再进行学习;

  3. 第三类则是直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将类别比例关系嵌入到其决策过程中,称为"阔值移动" (threshold-moving)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Spring_Et/article/details/107228070

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签