线性回归是由代价函数和梯度下降算法组成的,上一篇文章已经介绍过代价函数,这一篇我来介绍如何使用梯度下降算法来找到代价函数最小值。
梯度下降的场景假设:
梯度下降算法的基本思想可以类比为一个下山过程。一个人在山顶,想要下山,他无法直接看到整个山的全貌,最好的方法就是以他当前所在的位置为基准,找到下山离这个基准线最远的地方(局部最优解),然后朝这个方向下山。
梯度下降和下山类比:
梯度下降的基本过程就和下山的场景很类似。首先,我们有一个损失函数,这个函数可微,即可导。这个损失函数就代表一座山。梯度下降的目的就是获得损失函数最小值(到达山底),从而确定假设函数。现在根据下山的场景,先找到下山最陡峭的地方,然后往这个方向下山,对应到函数中,就是找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快,因为梯度的方向就是函数变化最快的方向。重复利用上述的方法,最后就能使损失函数取得局部最小值。
具体类比:
定义代价函数:J(θ0,θ1) (也可以是J(θ0,θ1,......θn))
目标:通过求得J(θ0,θ1)的最小值,获得θ0,θ1的值。
过程:1.设定一个初始的θ0,θ1的值;2.通过不断的改变θ0,θ1的值来不断的减小J(θ0,θ1)的值,直到求得J(θ0,θ1)的最小值。(使用梯度下降算法)
梯度下降算法图解:
图1
图2
如上面图1,图2,随机设定一对θ0,θ1的值,然后使用梯度下降算法,设定不同的学习率,代价函数的值会在三维图像上随机找到一个方向往下下降。最终会找到代价函数的局部最优处。
梯度下降中梯度的方向:
为什么梯度的方向就是下降最快的方向呢?
考研数学复习全书上给出的梯度定义为:
先说一下梯度的意义:(1) 在单变量的函数中,梯度是对这个函数的单个变量求导,代表着函数在某个给定点切线的斜率。(2) 在多变量函数中,梯度是一个向量,向量是有方向,梯度的方向指出了函数在给定点的上升最快的方向。
现在介绍一下梯度的通俗解释:在单变量函数中,它表示一个函数的变化率,然后,在函数图像中,它表示函数上某点切线的斜率。在多变量函数中,它由该函数中每个变量的偏导数组成。
对函数求导与偏导数的知识补充:
求
对x求偏导数
关于y的偏导数
梯度的实际例子:
将代价函数与梯度下降结合形成简单的线性回归的例子:
(1),单变量函数(代价函数)的梯度下降
对该函数求导:
初始化,θ0=1,学习率a=0.4
梯度下降算法公式:
单变量函数进行梯度下降的迭代计算过程(这里只计算含有一个θ):
这里经过四步迭代,目的就是要找到这个代价函数的最小值。
(2),多变量函数(代价函数)的梯度下降
初始化,θ0=(1,3),学习率a=0.1
该多变量函数的梯度为:
进行多次迭代:
该多变量函数进行迭代,会不断的靠近函数的最小值。
线性回归算
下面是梯度下降算法和线性回归模型:
将h(x)带入到J函数中,然后求出J关于θ0,θ1的偏导数
将求偏导数后的代价函数方程带入到梯度下降算法中,并进行展开
我们有两个变量,为了对这个公式进行矩阵化运算,我们可以给每一个点x增加一个维度,这一维的值固定为1,这一维将会与θ0相乘,这样就方便我们统一矩阵化的计算,将代价函数和梯度转换为矩阵向量相乘的形式如下:
假设函数h(x)表示为矩阵形式为
则代价函数和对代价函数求偏导后的方程表达式为
将求导后代价函数进行矩阵化并带入到线性回归方程中,便可进行矩阵化运算。
总结
以上内容通过下山的方式来类比梯度下降算法,代价函数相当于山,通过找到梯度的方向可以找到下山最快的方向,即求得代价函数的最小值。同时介绍了,如何使用矩阵的方法来进行线性回归算法的计算。
这篇文章只是介绍了线性回归整体的思路,但是没有涉及到更加详细的实际代码编程以及有关训练集特征值归一化的问题。还有就是如何直接使用正规方程的方法而不是通过迭代的方法直接求θ值。以及如何确定学习率的问题。以上这些问题,我会在后续的文章中解析。
下一篇文章我会介绍求θ值的正规方程方法,以及使用代码实现线性回归算法和正规方程方法。