前面的博客里写到了机器学习里有监督学习、无监督学习、强化学习三种。咱们先来学习一下监督学习里比较基础且重要的线性回归(Linear Regression)。
线性回归(Linear Regression)
监督学习里分为两类问题,回归和分类。其中回归就是前面提到的房价预测类的问题,想必大家对线性回归已经有了概念上的理解,下面咱们还是以房价预测为例子讲解一下线性回归。
我们目前手头有一组房子尺寸和房价的数据,
| 房子尺寸/平方米 | 房子价格/万 |
|---|---|
| 100 | 120 |
| 80 | 92 |
| 120 | 143 |
| 75 | 87 |
| 60 | 60 |
| 43 | 50 |
| … | … |
将这些数据用散点图表示的话如下图所示,
线性回归的方法就是我们预测一个模型,然后通过手头这组数据对这个模型进行训练,不断的去修正模型参数,最终得到一个最优的训练模型,然后根据新的输入房子尺寸的值,输出对应的预测价格。
用流程图的表示会更加直观,(该图摘自博主博临天下)
Traning Set就是我们手头有的房子大小和房价的数据,Learning Algorithm就是我们所构建的预测模型,x就是我们要预测的房子的大小,predict y就是通过我们的预测模型输出的房子的价格。
通过散点图我们可以发现,房子的大小和房价的关系类似一阶线性的关系。我们可以用一个最简单的初中学的一元一次方程来尝试去拟合这组数据:
这个公式就是我们的预测模型,其中
当然在现实中,影响房价的因素可能不止一个房子的大小
上式
在线性回归里,我们要做的就是让我们预测的模型更加能准确的拟合现有数据,使我们的误差最小。因此,在线性回归里,有个概念叫做代价函数(Cost Function),该函数用来描述我们预测的
公式可能看起来比较复杂,没关系,慢慢来讲解。
这样看起来是不是有点像我们中学里学的方差公式,用真实值减去预测值然后求平方,最终除以样本总数m取平均值,(其实有没有m都无所谓,因为现实中已有数据的组数是确定的,我们的目的是求代价函数的最小值,m为实数且为正数,只要求得后面一坨公式的最小值既可),乘以1/2的目的完全是为了求导方便。
这个复杂的公式简单点说就是,每一组预测值和真实值求差值平方然后相加,最终取平均即为代价函数的值。
因此为了让我们的预测模型最优,就要求得使代价函数
好了,现在我们的目标明确了,是不是觉得已经完全变成了数学问题,哈哈。好戏来了,我们怎么样来求得这个函数的最小值呢?下面就给大家介绍一个最基础且重要的方法——梯度下降法(Gradient Descent)
梯度下降法(Gradient Descent)
什么是梯度下降?举个简单的例子助于大家理解,假如我们现在站在一个陡峭的山顶,突然发现高处不胜寒,忘穿秋裤了,拍完照片发完朋友圈后,想用最快的方法走到山下去,山上有很多山路,有的山路比较陡,有的则比较平缓,当然在不考虑安全的情况下,我们想最快的走下山去,我们要做的就是每次走山路的时候都挑最陡峭的那条路来走(这不作死么0.0哈哈),因为只有每次走最陡峭的山路,我们才能以最快的速度到达山底。这里的一心求快,就是我们算法里的时间消耗,一套算法时间资源消耗最少则最优。
梯度下降法就是每次通过选择陡峭的山路往下走,走完一段后,再选择陡峭的山路,不断迭代的过程,最终走到山下。这里走到山下即求得函数的最小值。下面我们来更加学术的讲解梯度下降。
采用Andrew Wu授课的图来做讲解:
上图红色区域就可以理解为山顶,然后我们通过不断的选择陡峭的路下山,一点一点走到了山下蓝色区域。
现在我们要调整θ使得J(θ)取得最小值,为了达到这个目的,我们可以对θ取一个随机初始值,然后不断地迭代改变θ的值来使J(θ)减小,直到最终收敛取得一个θ值使得J(θ)最小。梯度下降法就采用这样的思想:对θ设定一个随机初值
直到收敛。这里的α称为学习率learning rate。梯度方向由J(θ)对θ 的偏导数决定,将J(θ)代入得到总的更新公式
公式中下标j代表第j个特征值(房子大小、朝向等),上标i代表第i组输入的数据(包含所有特征值的数据)。
假设我们有m组的样本数据,则上式表述为:
最终通过不断的迭代
以上所讲的梯度下降法还有个更准确的名字——批量梯度下降法(Batch Gradient Descent),通过上面的公式可以发现,我们每次迭代的过程中都需要遍历所有的已知数据,当我们已知的数据量很大的时候,无疑会很大的影响我们算法的效率,增加预测模型拟合的时间消耗。因此,有另外一种拟合的方法,称为增量梯度下降法(Incremental Gradient Descent)。
增量梯度下降法(Incremental Gradient Descent)
用代码来表示就是:
Repeat
{
for i = 0 to m
{
}
}
通过上述代码可以看出,第一次时使用第一组数据,第二次时在第一组数据结果的基础上进行迭代,即每次都仅使用一组数据在前n组数据的基础上进行迭代更新,不需要遍历所有的数据,速度大增。但是该算法可能会无法收敛到最小值,但最终会接近最小值。因为,该算法每次仅使用一组数据,所以拟合曲线可能会有所波动,如下图所示,直接上我的笔记了。。。
从左往右依次迭代,第一次的时候只有两组数据,拟合一条曲线出来,然后有了第三组数据后又根据前两组的拟合结果进行调整,然后不断的调整拟合的曲线,最终达到收敛。较大的数据量时使用增量梯度下降法的效率还是比批量梯度下降高很多的。
好了,一口气讲完了梯度下降,本来还想写一下python实现梯度下降,看来时间不早了,明天还要上班,今天就到这了,GoodNight。