【机器学习】线性回归与梯度下降

线性回归是利用数理统计学中的回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。它试图学得一个通过属性的线性组合来进行预测的函数,如下图所示


二维平面上的点是我们的数据,那么线性回归能根据这些数据得到一条直线,这条直线我们用来做什么呢?答案是预测。根据样本拟合出来的这条直线,我们可以对之后的各种输入,得到对应的输出,从而做出预测。

线性回归的一般形式如下

 

观察上述式子,如果将θ0看成是θ0*1是不是有点类似求向量内积的形式?于是我们可以做如下变形:

 

线性回归拟合出来的是一条直线,其中x1到xn是我们输入的参数,那为什么每个参数都要跟不同的θ相乘呢?这里的θ可以看成是该输入变量对输出结果的贡献率,比如说,一个西瓜的好坏可能跟敲声,色泽还有根蒂有关,其中根蒂最要紧,而敲声比色泽更重要,那么拟合出来的直线可能是hθ(x)=0.2*x(色泽)+0.5*x(根蒂)+0.3*x(敲声)+1。也就是说,θ越大,对结果的影响程度越大,如果θ为0,那么说明这个输入参数并不会影响结果。

hθ(x)是我们的一个预测函数,通过这个函数,我们可以得到相应的预测值。那么相对的,有预测值就会有一个真实值。那么,预测值跟实际值之间也就会存在差距,因此我们可以得到下列式子,其中ε(i)指的是预测值与实际值的误差



这里我们做出一个假设:ε(i)是独立的并且具有相同的分布,通常认为服从于均值为0,方差为θ^2的高斯分布(正态分布)。为什么做出这样一个假设呢?实际上,我们现实生活中很多的统计量都符合正态分布。比如,人的身高,大部分人都是某个区间内,高的人不会太多,矮的人也不会太多。又比如能力的高低,学生成绩的好坏等都属于正态分布这种,“中间高、两头低”的现象,可以被高斯分布很好的吻合,所以这里的假设是有道理的。

既然要预测,那么我们当然希望误差降到最小,也就是ε(i)我们希望它最小。根据正态分布的概率密度函数,我们就得到了ε(i)的概率。那么什么样的θ,跟我的x(i)组合完之后,能够预测结果成为y(i)的可能性最大? 对于每一个样本来说,我们都需要做这样一件事,所以我们需要把每一个样本都考虑进来,因此进行了一个累乘。我们管它叫似然函数。我们希望每一个p值都是最大的,因此似然函数也是最大的,也就是说,我们的目标是让似然函数越大越好。由于累乘的极值非常难以计算得到,所以通过对似然函数取对数,可以将累乘变为累加,将其展开后得到图上式子。简单的推导过程如下



左边是一个常数值,那么我们只需要关注后面带参数的值。可以知道它是一个恒为正的值,那么减去这个正值要得到整体最大值的话,我们希望这个值越小越好。我们将其设为j(θ),即我们希望j(θ)越小越好。通过对j(θ)求导后得到j(θ)最小时θ的值,最终我们得到结论θ=(X^T*X)^-1*X^T*Y。这些都是已知值,X是样本的数据,Y是样本的输出,也就是说我们可以一步就得到θ。上述等式也称作正规方程。下面给出推导过程,有兴趣的可以研究一下。


 

 

然而,上面得出的θ有一个条件,X^T*X必须为满秩矩阵(满秩矩阵才有逆矩阵)。但是在许多任务中我们会遇到大量的变量,其数目甚至超过样例数,导致X的列数多于行数。因此我们介绍另外一种算法——梯度下降算法用来计算上面的代价函数J(θ)。

梯度下降是一个用来求函数最小值的方法,它的思路是,开始时我们随机选择一个参数的组合(θ0,θ1,……,θn),计算代价函数,然后我们寻找下一个能让代价函数下降最多的参数组合,不断重复,直到找到一个局部最小值。什么是梯度呢?



简单的想象一下你正站在山上某一点,你环顾四周,想知道从哪个方向下去可以最快下山。当你迈出一步之后,你又再次环顾四周,查看哪个方向下山最快,依次类推,知道你到达某一个局部最低点为止。那么从哪个方向下山最快呢?易知沿着切线方向是最快的,也就是说我们需要对θ求偏导。梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。那假如我一开始就是一个最低点了呢?此时,最优点的导数为0,θ将不再进行变化。



上面是推导过程,感兴趣的可以看一下。最下方是我们通过推导得到的最终的更新式子。其中η是学习率,决定着我们沿着能让代价函数下降最大的方向迈出的步伐有多大。如果η太小,那么整个算法需要迭代很多次才能达到最低点。如果η太大,那么算法可能会越过最低点,甚至可能无法收敛。在该算法中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。我们要得到的是代价函数的最小值,因此θ应该是下降的,而η*代价函数的导数为一个正数,因此我们需要减去这个正数,才能接近最小值。当η保持不变时,每次迭代都会使得梯度下降,即偏导数求得的值会不停变小,因此变化的幅度也会越来越小,最终收敛到最小值。


这就是梯度下降算法,它可以用来最小化任何代价函数J,不只是线性回归中的代价函数。上述梯度下降算法被称为批梯度下降。如果我们的样本非常大,比如数百万到数亿,那么计算量异常巨大。因此,实用的算法是随机梯度下降算法(Stochastic Gradient Descent,SGD)。在SGD算法中,每次更新的迭代,只计算一个样本。这样对于一个具有数百万样本的训练数据,完成一次遍历就会对更新数百万次,效率大大提升。由于样本的噪音和随机性,每次更新并不一定按照减少的方向。然而,虽然存在一定随机性,大量的更新总体上沿着减少的方向前进的,因此最后也能收敛到最小值附近。需要注意的是,这种随机性有时候也可以给我们带来好处。我们知道批梯度下降每次都会到达一个局部最小值,它不一定是全局最小值。对于一个非凸函数(有许多坑坑洼洼的函数)来说存在许多局部最小值,这样我们运行批梯度下降之后不一定就能到达全局最小值,而随机梯度下降有时候可以让我们逃离某些比较糟糕的局部最小值,从而得到一个更好的模型。

 

只要特征变量的数目并不大,正规方程算法是一个很好的计算参数θ的替代方法。然而对一些复杂算法,我们将不得不使用梯度下降法,它是一个很有用的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值