假如我们有一个数据集:
(xi1,xi2,yi)
其中,i是从1到m。数据集总共有m组。
前两个是自变量,最后一个是因变量。我们可以这样理解,存在某种关系,使得y会随着x1和x2的变化而变化。这种理解跟函数是不是很像?实际上,我们确实可以假设存在这样一个函数,它跟数据集很拟合。所以即使数据集里没有的它也可以预测出结果。现在假设有一个线性的函数可以拟合:
我们希望能得到一组 θ ,使得 hθ(x(i)) 所表示的函数图像跟数据集拟合得很好。那么,如何刻画它们的拟合程度呢?
最直接的想法就是利用h(x)与y之间的差异来衡量,即定义一个代价(cost)函数:
而我们的目标就是,想办法在这个已知的数据集下,得到一组
θ
,使得
J(θ)
的值最小。如果把
J(θ)
和
θ
在坐标轴上画出来,它就是一个曲面,要找它的最小值,我们当然会想到最低点,要找到最低点,就是对
θ
求导,并且让导数为0,这样就找到最低点了。即令:
这样我们就可以找出最低点了。
梯度下降算法
在计算机的计算中,我们如何才能找到
θ0
和
θ1
使得
J(θ)
最小呢?
1 先随便给
θ0
和
θ1
初始化。比如都赋值为0。
2 改变
θ0
和
θ1
,使得
J(θ)
的值慢慢变小,最终收敛到最小。这时候
θ0
和
θ1
的值就是我们要的。
伪代码如下:
while()
{
temp0=
θ0
-
α∂∂θ0J(θ0,θ1)
temp1=
θ1
-
α∂∂θ1J(θ0,θ1)
θ0
=temp0
θ1
=temp1
}
由于每一次的
θ0
和
θ1
都是一个具体的数值,所以
α∂∂θ0J(θ0,θ1)
每一次都可以算出来的。
梯度下降算法的细节改进
特征缩放(Feature Scaling)
比如有数据集
(x(i)1,x(i)2,y(i))
其中有两个变量,x1和x2,假如x1的变化范围大概是0~2000,而x2的变换范围大概是1~5。显然x1和x2的取值范围差距很大,在画代价(cost)函数的时候图像会很奇怪,利用梯度下降算法找最小值的时候,下降的速度就会很慢,而且容易振荡。为了解决这个问题,可以使用归一化。即:
学习速率α的选择
α太小,收敛速度就会变慢,太大又有可能不会收敛。只能慢慢尝试了。