上一篇我们知道了线性回归的理论知识,如果看懂了就有大干一场的冲动。于是上代码,这时,很多问题可能就浮出水面了。
Feature Scaling
多个特征变量的情况下,这些特征变量五花八门,数值上从几千到个位数,总觉得不靠谱。
这里,NG大神用等高图给我们分析了这种情况,特征变量的差距,只会增加我们的迭代次数,是的学习性能下降。等高图画出来,是个狭长的椭圆,要到圆心自然经历颇多,所以,通过对特征向量的优化,使得等高图变得更圆,迭代次数自然就更少,能够更快的到达圆心(最小成本)(收敛)。这类问题叫做Feature Scaling
这里提供了两种算法:(min-max)
第一种,把特征值控制在[-1,1]之间。
(x-mean(x))/(max(x)-min(x))
这里mean是平均值,max是最大值,min是最小值。对每一个特征值做这样的处理,得到的就是新的特征值,符合[-1,1]的要求。
第二种,把特征值控制在[-0.5,0.5]之间。(z-score)
x-mean(x)/std(x)
这里的std是标准方差,公式如下
N就是训练数量。μ是算数平均值
在我们使用特征向量时,可以统一先做Feature scaling
但是这里如果用了bias,偏置的话,是不需要对偏置做feature scaling的,因为偏置的特征向量是常数1,已经在我们的范围了。
这里NG给的例子,还是房价预测,我们的特征向量可能是房屋面积(50-200),也可能是房间数(1.5),所以这里可以使用feature scaling,如果特征值都很阶级,在同一个数量级,那么可以忽略。
第二个问题,则是 α
这个是我们用在梯度下降算法中,放在对参数求导前面的,我们叫学习率(Learning rate)
这个数值的大小,该取多少呢?
这里,NG通过分析迭代次数,和cost 函数的关系曲线,来分析。前提是确保算法实现无误。
理论上,只要α 足够小,我们的算法就可以正常工作。如果随着迭代次数上升,cost函数值增大,或者反复,那么就需要更小的 α 值。
α 过大为什么会是的梯度下降有问题呢? 可以理解为步子太大,越过了收敛,结果反复后,cost值越来越大。
还有一个问题,我们的cost 函数是不可能小到0的,因为实际情况和模型永远不可能完美拟合。为了确保达到我们的要求,那么当cost值的变化小于某个数值时,我们就可以认为,我们已经找到合适的模型参数。
这个值的选取,如下图NG说的,可以在10的负三次方内,就是0.001-0.009之间吧。其实这个参数如果太大,那么我们学的不是很完美,如果太小,那么可能学习时间又会太长。这就是需要衡量考虑率的问题。
实际运用中需要根据实际情况不断尝试。
正常的情况应该是图上这个。当然迭代次数有可能会是上千,或者上万。
你也许会觉得,这个线性回归很复杂,那么多东西需要考虑。
这里也有一种便捷的方法,不需要feature scaling,不需要学习率,直接计算,这就是
Normal Equation
实际上这就是用正规方程法求解θ参数
这种方法,不用学习率,也不用做feature scaling
θ = (X^TX)^(-1)X^Ty
这里T表示转置,-1表示逆。所以这里有个问题,求逆矩阵。并非所有矩阵都有逆矩阵。(奇异矩阵,非方阵)
如果用octave来计算,就可以忽略有无逆矩阵。
pinv(X'*X)*X'*y
既然有这样的方法,那么是否不需要用梯度递减了?
看Andrew NG 老师为我们总结的。
也就是说,主要看features的个数,如果在1000个以内,可以用Normal Equation。