码迷,mamicode.com
首页 > 编程语言 > 详细

机器学习(Andrew Ng)笔记(二):线性回归模型 & 梯度下降算法

时间:2016-07-13 17:22:19      阅读:619      评论:0      收藏:0      [点我收藏+]

标签:

线性回归模型

回忆一下第一节课提出的预测房屋每平方单位价格的例子。在这个例子中,我们可以画一条直线,尽量符合数据点的分布趋势。我们已经知道这是一个回归问题,即预测连续值的输出。实际上,这是一个典型的线性回归模型。之所以这样定义,大概是因为回归方程可以用一个线性函数来表示。

我们可以假设这个线性函数为:

技术分享

这是一个关于x的一元一次方程。其中两个参数的值我们还不知道,要根据训练集中的数据求解出来。这里要定义几个概念,我们已经有的数据,即房屋面积与单价的对应数据对,被称作训练集。x作为房屋面积,称作输入;y作为房屋单价,成为输出。可以用(x,y)表示一个训练样本。训练样本的数量定义为m。像上面这种只有一个变量x的模型叫做单变量线性回归模型。

用机器学习方法解决这个问题的过程,实际上就是用训练算法对训练集中的数据进行处理,得到我们的回归方程h,然后有了新数据的时候,我们就可以在只知道输入x的情况下,用回归方程h计算出对应的输出y的值。在这里x就是房屋大小,y就是房屋每平方单位的单价。

那么如何求解刚才的那个方程h(x)呢?当然我们之前用肉眼去直觉判断,然后画一条线的方法是非常不准确的。求解h(x)的关键,其实在于求解两个未知参数技术分享的值。直觉上来看,我们的目的是,让求得的h函数,能够让训练集中x根据h函数对应的y,与真实的y值尽量接近,越接近越好。我们可以根据这个标准,来计算h函数的参数。

于是,我们引入了代价函数的概念。

技术分享

上面这个公式中的代价函数J,就是刚才我们说的“目的”的数学表达。首先我们计算训练集中x根据h函数对应的y值,减去真实的y值的差。因为这个差可能为正也可能为负,而我们并不在意正负,只在意这个差值的大小,所以对其进行平方,这样就都为正了。然后我们把训练集中所有的数据都如此处理,把求得的平方和加起来,再除以2m。为什么不是除以训练集中数据个数m,而是除以其2倍呢?这其实是一个统计学上的考虑,可以减小误差。

函数J实际上是一个平方误差函数。作为代价函数,J当然也可以是其他的函数类型,但是对这个线性回归的问题来说,使用平方误差函数作为代价函数,是最为合理的。那么我们的目标也呼之欲出了,就是求代价函数J的最小值。

技术分享

为了能够直观地理解这个问题,可以先简化问题,然后从图上看。如果我们将问题简化为第一个参数为0的情况,那么h函数就会变成一条经过原点的直线,而J函数也会只与一个变量有关,其函数图像是一个一元二次函数,我们只要定位到一元二次函数图像的最低点,就是我们要求的参数,能够让代价函数J取得最小值。

回到原问题,如果第一个参数不为0,那么此时函数J就有了两个参数,也就是说,变成了一个二元二次函数的问题,显然这时的函数图像就不能在二维平面上表示出来了。实际上这个函数的图像表示在三维图中是这样的。

技术分享

直觉来看,其实也是有一个最低点的,不过这个最低点应该怎么求呢?

在这里引入了一个轮廓图(Contour plot),其实这个不是必须要知道的知识,但是了解一下有助于理解。上面的三维图其实可以以一种巧妙的方式用二维图来表示。下面的图中,右边的图就是一个典型的轮廓图,一条线表示了x和y取得的函数值相同的点,也就是说,在这条线上,虽然x和y的值不同,但是对应的函数值是相同的。红色小×表示的那个点代表的代价函数J,其原本的h函数就是左图所示的图像。那么右图中,最低点在哪里呢?回顾一下刚才的三维图,可以直觉认为,最低点就是蓝紫色圆圈最中心的那个点。

技术分享

让我们回到问题,如何通过数学的方法,求出代价函数最低点的两个参数值呢?

梯度下降算法

是的,我们使用的算法那就是梯度下降算法(Gradient descnet)。这个算法的运行过程是这样的:

(1)猜想两个参数的值,也就是给定参数技术分享一个初值,比如说都初始化为0,我们的目标是从这个值渐渐逼近我们想要的值;

(2)不断修改两个参数,直到得到代价函数J的局部最小值。

我们尝试在三维图上直观地考虑这个问题。假设我们随便取了一个值,在某个位置,然后我们要修改两个参数,如何修改呢?肯定是让这两个参数在函数图像上的点更接近最低点。这就有点像爬山,只不过反过来,我们是在下山,要想下到最低点,那么就一步一步地走,每一步都在往下走,低一点再低一点,最后就到达最低点了。

这个算法的表达式是这样的。

技术分享

注意递归下降算法的关键是,两个参数要同时更新。这个很好理解,因为J函数是与两个参数都有关的,如果不同时更新,那么一个更新的参数必然会影响到另一个参数的值。同时更新在代码中的实现可以见图的下半部分。

对于这个图中的计算公式,有两点非常非常值得注意。第一就是参数α,为什么要在代价函数J前面乘以这个参数呢?实际上α代表learning rate,可以这样理解,在函数图上“下山”的时候,我们是小碎步走,还是大踏步走?也就是说,α定义了我们每次修改两个参数值的大小间隔多少。在实际应用中,α是应该随着对目标的接近而不断减小的,但是α固定大小也可以保证收敛到最小值,因为随着接近局部最小值,函数的偏导数也会逐渐变小。

偏导数,就是第二个值得注意的地方,即

技术分享

可能学过微积分的才知道这个具体代表什么,不过没学过也没关系,直观来看,这个分数所代表的,就是三维图上某一点的斜率,通俗点说,就是陡峭程度,以及陡峭的方向。在公式中,这个偏导数的存在确保了我们的算法会逐渐向最小值也就是斜坡下降的部位逼近。

梯度下降法其实也可以用于别的算法,而不单单是线性回归模型。下面我们就讨论用于线性回归的梯度下降算法。

用于线性回归的梯度下降

我们把代价函数J的公式代入梯度下降算法的公式,然后利用偏导数的概念对公式进行化简,最后可以得到这个公式。具体的推导需要一些微积分的知识。

技术分享

我们其实可以直接拿来用了。也就是说,算法大概就是这样写的,我们利用这两个公式不断地修正两个参数的值,直到函数J到达了一个最小值。我们现在有了这个公式,就可以应用梯度下降算法了。

如果在这个过程中,每一步都用到了所有的训练集中数据,那么就叫做批量梯度下降(Batch gradient descent)。

机器学习(Andrew Ng)笔记(二):线性回归模型 & 梯度下降算法

标签:

原文地址:http://blog.csdn.net/r1ce_mars/article/details/51886828

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!