梯度下降法作为机器学习中很基础的方法,是我们必须要掌握的。
随机以一组数据作为例子:
x1
|
x2
|
x3
|
… |
xn
|
… |
y |
720 |
1136 |
3 |
… |
26 |
… |
232 |
916 |
1201 |
5 |
… |
33 |
… |
384 |
187 |
2157 |
2 |
… |
51 |
… |
573 |
… |
… |
… |
… |
… |
… |
… |
以上角标作为行索引,以下角标作为列索引
第二行可以写成:
x(2)=⎣⎢⎢⎢⎢⎡91612015⋯33⎦⎥⎥⎥⎥⎤
位于第二行第一列位置的数写成:
x1(2)=916
以上下角标来区分位置,以便于后期运算。
假设函数
设置一个回归方程:
hθ(x)=θ0+θ1x1+θ2x2+θ3x3+⋯+θnxn
添加一个列向量 x0:
x0=[1111⋯1]T
这样方程可以写为:
hθ(x)=θ0x0+θ1x1+θ2x2+θ3x3+⋯+θnxn
既不会影响到方程的结果,而且使 x 与 θ 的数量一致以便于矩阵计算。
为了更方便表达,分别记为:
X=⎣⎢⎢⎢⎢⎢⎢⎡x0x1x2x3⋯xn⎦⎥⎥⎥⎥⎥⎥⎤,θ=⎣⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2θ3⋯θn⎦⎥⎥⎥⎥⎥⎥⎤
这样方程就变为:
hθ(x)=[θ0θ1θ2θ3⋯θn]⎣⎢⎢⎢⎢⎢⎢⎡x0x1x2x3⋯xn⎦⎥⎥⎥⎥⎥⎥⎤
代价函数
由回归方程推导出代价方程:
J(θ0,θ1,⋯,θn)=2m1i=1∑m(hθ(x(i))−y(i))2 J(θ)=2m1i=1∑m(θTX−y(i))2 =2m1i=1∑m((j=1∑nθjxj(i))−y(i))2)
梯度下降
接下来对 θ 进行梯度下降 ( α为学习率 ):
θj=θj−α∂θj∂J(θ)(j=1,2,⋯,n)
计算下来:
θ0=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)θ1=θ1−αm1i=1∑m(hθ(x(i))−y(i))x1(i)θ2=θ2−αm1i=1∑m(hθ(x(i))−y(i))x2(i) ⋯ θn=θn−αm1i=1∑m(hθ(x(i))−y(i))xn(i)
计算时要从 θ0 一直计算到 θn 后,再从头由 θ0 开始计算,以确保数据统一变化。
在执行次数足够多的迭代后,我们就能取得达到要求的 θj 的值。
特征缩放和均值归一化
在特征数量很大时,梯度下降算法可能会计算得非常慢。而且在数据 xj(j=1,2,⋯,n) 之间取值范围相差很大的情况下,梯度会变化得很快,不会朝着某一个方向比较平滑地收敛,而是会左右摇摆以至于计算次数增多。
把特征数据处理之后,可以让梯度下降更快地收敛,提高算法效率。
即改变特征的取值范围,使轮廓近似一个圆。左侧为未进行缩放的情况,右侧为进行缩放后的情况:
即减均值,再除以标准差,或简单地直接除以最大值与最小值的差,减少特征值取值范围对迭代的影响: