我们的回归方程常写成如下形式:
hθ(x)=θ0+θ1*X
代价函数:J(θ)=12∑i=1m(hθ(x(i)−y(i))2
看看代价函数到底是在干什么,如图
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求代价函数最小
例如:想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转 360 度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
批量梯度下降算法的公式为:
其中是α学习率,它决定了我们沿着能让代价函数下降程度最大的方向
向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
下面这两种情况都是α值(学习率)较大,应减小α值,通常可以考虑尝试些学习率: = 0.01,0.03,0.1,0.3,1,3,10
在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新θ0+θ1 ,应该同步更新,如下图
完整过程如下:
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。
例:还是用一开始的房价的例子。假设房价影响因素有房屋大小(size)、卧室数量(number of bedrooms)、楼层数(number of floors)、房龄(age of home)四个。
多变量线性回归的批量梯度下降算法为:
Python 代码:
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法
是更好的解决方案。如:
运用正规方程方法求解参数:
总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数的替代方法。具体地说,只要特征变量数量小于一万,我通常使用标准方程法,而不使用梯度下降法。随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到,实际上对于那些算法,并不能使用标准方程法。对于那些更复杂的学习算法,
我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。或者我们以后在课程中,会讲到的一些其他的算法,因为标准方程法不适合或者不能用在它们上。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的
正规方程的 python 实现:
import numpy as np
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X 等价于 X.T.dot(X)
return theta