机器学习算法手撕系列(一)----回归算法

一.回归算法是啥子?

回归算法是一种有监督算法(有监督是指有确定标签(Y))

用来建立“解释”变量(自变量X)和观测值(因变量Y)之间的关系;从机器学习的角度来讲,用于构建一个算法模型(函数)来做属性(X)与标签(Y)之间的映射关系,在算法的学习过程中,试图寻找一个函数使得参数之间的关系拟合性最好。回归算法中算法(函数)的最终结果是一个连续的数据值,输入值(属性值)是一个d维度的属性(数值向量)

二.算法原理

1.最简单的单变量线性回归算法

针对数据集x跟y,预测函数会根据输入的特征输出一个预测值h(x),其输入和输出的函数关系假设如下:

                            h_{\Theta }(x)=\Theta _{0}+\Theta _{1}x

从函数角度来说这是一条直线,表达一个线性关系,事实上我们的任务是构造一个h_{\Theta }函数,用来拟合数据集中输入特征x与输出值y,同时使得通过预测函数计算出来的值h_{\Theta }(x)与真实值y的整体误差最小,构造h_{\Theta }函数的关键是找到合适的\Theta _{0}\Theta _{1},\Theta _{0}\Theta _{1}称为模型参数.

假设我们有如下数据集:

                   特征x:1,2,3,4     输出y:4,6,10,15

假设模型参数\Theta _{0}=1, \Theta _{1}=3,则模型函数为h_{\Theta }=1+3x,针对数据集中的第一个样本,输入为1,模型预测值为4,与数据真实值吻合,对于第二个样本,输入为二,模型预测值为7,实际数据值为6,可以看出误差为1,模型参数求解过程就是找出一组最合适的模型参数\Theta _{0}\Theta _{1},以便能最好的拟合数据集.

1.1成本函数

单变量线性回归算法的成本函数是:

                                                         J(\Theta )=J(\Theta _{0},\Theta _{1})=\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^{2}(m个样本求和)

其中,h(x^{(i)})-y^{(i)}是预测值与实际值的差,故成本就是预测值和实际值的差的平方的平均值,之所以乘以1/2是为了计算方便,这个函数称为均方差方程,成本函数是为了精确的测量模型对训练样本拟合的好坏程度

1.2梯度下降算法

有了预测函数跟成本函数,我们怎么求解模型参数\Theta _{0}\Theta _{1}?那么我们的梯度下降算法就派上用场了,我们的任务是找到最合适的\Theta _{0}\Theta _{1},使得成本函数J(\Theta )最小.设在一个三维空间里,\Theta _{0}为x轴,\Theta _{1}为y轴,成本函数J(\Theta _{0},\Theta _{1})为z轴,,我们就是要找出当z轴的值最小的时候所对应的x轴上的值跟y轴上的值.

梯度下降法的原理:先随机选择一组\Theta _{0}\Theta _{1},同时选择一个参数\alpha作为移动的步长,然后让x轴上的\Theta _{0}跟y轴上的\Theta _{1}分别向特定的方向移动一小步,这个步长的大小由参数\alpha指定,经过多次迭代,X轴跟y轴上的值决定的点就慢慢靠近z轴上的最小值处.那么我们怎么知道往哪个方向移动,才能靠近z轴上最小值附近?答案是往成本函数变小的方向移动?那么又怎么保证成本函数逐渐变小的方向呢?那就是偏导数!!!

可以先简单的把偏导数理解为斜率,我们让\Theta _{j}不停地迭代,由当前的\Theta _{j}值,根据J(\Theta )的偏导数函数,算出J(\Theta )\Theta _{j}上的斜率,然后再乘以学习率\alpha,就可以让\Theta _{j}J(\Theta )变小的方向迈一小步.

梯度下降过程的公式描述为:

                                                                                    \Theta _{j}=\Theta _{j}-\alpha \frac{\partial J(\Theta )}{\partial \Theta _{j}}

公式中,下标j就是参数的序号,针对单变量线性回归,即0和1,\alpha称为学习率,它决定每次要移动的幅度大小,它乘以成本函数对参数\Theta _{j}的偏导数,以这个结果作为参数移动的幅度,如果幅度过小,意味着要计算很多次才能到达目的地,如果幅度太大,可能会直接跨过目的地,从而无法收敛

把成本函数J(\Theta )的定义式代入上面的公式中,推导出梯度下降算法公式:

                                                                      \Theta _{0}=\Theta _{0}-\frac{\alpha }{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})

                                                                      \Theta _{1}=\Theta _{1}-\frac{\alpha }{m}\sum_{i=1}^{m}((h(x^{(i)})-y^{(i)})x_{1}^{(i)})

2.多变量线性回归算法

工程应用中往往不止一个输入特征,那么我们由单变量推广到多变量线性回归算法

2.1预测函数

多个输入特征,此时输出y的值由n个输入特征x1,x2,x3,...,xn决定,那么预测函数的模型可以改写如下:

                                                                          h_{\Theta }(x)=\Theta _{0}+\Theta _{1}x_{1}+\Theta _{2}x_{2}+\cdot \cdot \cdot +\Theta _{n}x_{n}

若x0为常数1,用累加运算符重写上面的预测函数:

                                                                        h_{\Theta }(x)=\sum _{j=0}^{n}\Theta _{j}x_{j}

\Theta _{0},\Theta _{1},\Theta _{2},\cdot \cdot \cdot ,\Theta _{n}统称为\Theta,是预测函数的参数,即一组\Theta值就决定了一个预测函数,记做h_{\Theta }(x),在不引起误解的轻况下我们也把它简写为h(x),理论上讲,预测函数有无穷多个,我们求解的目标就是找出一个最优的\Theta

(1)向量形式的预测函数

根据向量的乘法运算法则,成本函数可重新写为:

                                                                   h_{\Theta }(x)=[\begin{matrix} \Theta _{0} &\Theta _{1} &\cdot \cdot \cdot &\Theta _{n} ][\begin{matrix} x_{0}\\ x_{1}\\ \cdot \cdot \cdot \\ x_{n} \end{matrix} \end{matrix}]=\Theta ^{T}x

此处,依然假设x_{0}=1,x_{0}称为模型偏置.为什么要写成向量形式的预测函数?一是因为简洁,二是因为在实现算法时,要用到数值计算里面的矩阵运算来提高效率.

2.2成本函数

多变量线性回归算法的成本函数:

                                                                 J(\Theta )=\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^{2}

其中,模型参数\Theta为n+1维的向量,h(x^{(i)})-y^{(i)})是预测值和实际值的差,这个形式和单变量线性回归算法类似

成本函数有其对应的矩阵样式版本:

                                                                J(\Theta )=\frac{1}{2m}(X\Theta -\vec{y})^{T}(X\Theta -\vec{y})

其中,X为m\times(n+1)维的训练样本矩阵,上标T表示转置矩阵;\vec{y}表示由所有的训练的样本输出y^{(i)}构成的向量,这个公式的优势是:由矩阵乘法化掉了累加,不需要循环,直接使用矩阵运算,可以一次性计算出对特定的参数\Theta下模型的拟合成本.

2.3梯度下降法

根据单变量线性回归算法的介绍,梯度下降公式为:

                                                                                   \Theta _{j}=\Theta _{j}-\alpha \frac{\partial J(\Theta )}{\partial \Theta _{j}}

公式中,下标j是参数的序号,其值从0到n;\alpha为学习率.把成本函数代入上式,利用偏导数的计算法则,易得梯度下降法的参数迭代公式:

                                                                                 \Theta _{j}=\Theta _{j}-\frac{\alpha }{m}\sum_{i=1}^{m}((h(x^{(i)})-y^{(i)})x_{j}^{(i)})

这个公式有些符合直觉的地方,比如( h(x^{(i)})-y^{(i)}) 表示的是预测值与真实值的误差,当误差比较大时,经过一轮的迭代,\Theta _{j} 的步幅就迈得比较大。即当我们的参数\Theta离我们的目标值很远的时候,迭代一次的值变化比较大,可以快速地收敛,而当\Theta离目标值比较近的时候,迭代一次的值变化比较小,即慢慢地收敛到目标值.

这个公式怎么样用编程语言来实现呢?在编写机器学习算法的时候,一般步骤如下:

  • 确定学习率\alpha
    \alpha太大可能会使成本函数无法收敛,太小计算太多,机器学习算法效率就比较低。
  • 确定参数起始点
    比如让所有的参数都为1作为起点,即\theta _{0}=\theta _{1}=\cdot \cdot \cdot =\theta _{n}=1,这样就得到了我们的预测函数:h_{\theta }(x)=\sum _{i=1}^{m}x^{(i)}.根据预测值和我们的成本函数,就可以算出我们在参数起始位置的成本. 需要注意的是,参数起始点可以根据实际情况灵活选择,以便让机器学习算法的性能更高,比如选择比较靠近极点的位置.
  • 计算参数的下一组值
    根据 LSM 算法,分别同时算出新的\theta _{j}的值.然后用新的 θ 值得到新的预测函数h_{\theta }(x),再根据新的预测函数,代入成本函数就可以算出新的成本.
  • 确认成本函数是否收敛
    拿新的成本和旧的成本进行比较,看成本是不是变得越来越小. 如果两次成本之间的差异小于误差范围,即说明我们已经非常靠近最小成本附近了. 就可以近似地认为我们找到了最小成本了. 如果两次成本之间的差异在误差范围之外,重复步骤 3 继续计算下一组参数 θ. 直到找到我们的最优解.

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值