梯度下降优化&线性回归的正规方程解法(Normal Equation)

1.梯度下降算法的几点优化
梯度下降算法在实际应用时,可以关注某些特征来确保它正常工作,使它更快速地收敛。

(1)特征缩放(Feature Scaling):
假设现有两个特征值 x1 x2 , 在训练集中,x1的范围为(-1000,1000),而x2的范围为(-1,1) ,那么可以预想到误差函数J(θ) 的轮廓一定是非常细长的图形,而收敛的步伐也会增加很多。总之,这样的数据会导致J(θ) 收敛地较为缓慢,从而增加了运行的开支。

若将x1 重新定义为 x1/1000 (这里的x1范围还是(-1000,1000)),那么新得到的x1就具有和x2 相似的取值范围,而此时的J(θ)的轮廓也就更加接近圆形,这样应该可以更快地收敛,从而减少运行的开支。

若一个回归问题中包含多个特征值,而这些特征值可能具有相差很大的取值范围,那么合理地进行缩放可以在一定程度上加快 J(θ) 收敛的速度。

(2)学习速率α的取值:
在我创作我的上一篇博客时,我就深深感到了学习速率α的重要性。α过大,可能会导致发散,而α过小又会导致消耗的增加。然而对于不同的数据,α是大是小的界定也不尽相同,还是应当首先选取一个较小的值(例如 0.001),然后根据程序的反馈情况,成倍地增大或调小,直到找到一个比较合适的α

(3)合理地选择特征值:
合理地选择特征值,意即不要选择多余的特征值,例如可能存在重复意义的特征值(例如:一个房屋的面积,与这个房屋的长与宽),这一点可能对线性回归问题的正规解法(Normal Equation)尤为重要。


2.线性回归问题的正规方程解法(Normal Equation):

假设对一个线性回归问题,有x0 x1 x2 x3 x4五个特征值(默认x0=1),那么我们的拟合方程就为:y = x0*θ0 + x1*θ1 + x2*θ2 + x3*θ3 + x4*θ4

(1)构建一个矩阵X:
每一个特征值的训练集占一列,也就是说第一列从上到下就是x0的所有数据(当然x0=1,这一列全为1),同理第二列就是x1的所有数据,因而在这里矩阵X的规格为m*5 ,从而拥有n个特征值,有m组数据的回归问题就具有一个规格为m*n 的矩阵X.

(2)构建一个矩阵y:
这是一个m*1 的矩阵(或者说一个列向量),从上到下依次放置着训练集中所有y的数据.

(3)设θ为一个列向量:
这里写图片描述
这个公式给出了最优拟合的参数 θ=(θ0;θ1;θ2;θ3;θ4)的值。通过矩阵运算,所得到的结果与通过梯度下降算法得到的结果完全相同。


3.实例
以我的上一篇博客中提到的应用于多元线性回归的梯度下降算法来预测房价为例,通过两种不同的方式求解。
(1)梯度下降法:
结果:
这里写图片描述


(2)正规方程法:
θ:

ans =

   5.378775957762028    %θ0
  -0.268669813269866    %θ1
   0.190405865191038    %θ2
   0.132288005547467    %θ3
  -0.359818097236177    %θ4

可以看到两种方法得到的结果相同,而在速度上显然正规方程法更胜一筹
其实对于特征个数在1000个以下的回归问题,正规方程法在速度上要快于梯度下降。而如果特征个数到了10000个以上时(这样的问题应该不多见吧 :) ),使用梯度下降或许更加合适,但是梯度下降算法可以应对数据的大量增加,当训练集膨胀到十万,甚至百万,千万级别的时候,再去通过矩阵运算的方式可能就有些耗时耗力。二者都有利有弊,还是应根据情况合理选择。

你可能感兴趣的:(Machine,Learning,C++算法)