多变量线性回归
从之前的单变量线性回归现在扩展到多变量线性回归,比如通过房子的多个属性来预测它的售价。
用n来表示变量的个数,m还是表示训练样本的数量;表示的是输入的是第i个样本,表示的是第i个样本的第j个特征的值。
支持多变量的假设h表示为:,也叫做多元线性回归(multivariate linear regression)
为了更方便的表示,使用矩阵乘法可以表示为:为了计算的方便, = 1,这样是为了让x和拥有一样的维度从而可以进行矩阵的操作。
多变量梯度下降更新
多变量线性回归的代价函数为:
其中,
梯度下降算法如下:
和单变量线性回归中梯度下降一样,多变量也是同步更新所有参数,在这里我们可以将所有的参数看做是一个矩阵,代价函数看作为J()。
python代码实现:
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)#power(x,y)实现的是x的y次方。
return np.sum(inner) / (2 * len(X))
特征缩放(Feature Scaling)
当进行多个变量的梯度下降时,如果各个变量的取值范围差别很大,即这些特征的尺度相差很大,那么梯度下降时收敛速度可能会非常慢,如下图所示,因此为了适当的提高收敛的速度,我们可以通过将所有特征通过缩放到统一尺度来加快收敛速度。
具体的我们可以将特征都乘以或者除以一个数,让其范围在-1<x<1之间,但是在-3<x<3,以及-0.3<x<0.3之间也是可以接受的。如果超出这个范围就要进行特征缩放了。
均值归一化(Mean normalization)是比较通用的特征缩放的方法:即通过让特征尽可能接近0,在除以特征取值范围的最大值减去最小值。
选择一个合适的学习率
为了更好地了解当前学习速率的值对问题收敛的影响,一般需要绘制代价函数与学习次数的对比图,如下图所示,可以证明,如果学习速率足够小的话,代价函数在每经过一次迭代后都会下降。。
如果学习速率太大可能会导致梯度下降时越过最低点,如果太小可能会导致收敛速度太慢。如果代价函数J()随着迭代次数的曲线如下图所示,一直上升或者呈振荡状态,一般的问题在于学习速率过大,此时应该减小学习速率。
学习速率的选择一般可以参照0.01, 0.03, 0.1, 0.3, 1, 3, 10
特征和多项式回归(Features and Polynomial Regression)
当涉及多个特征时,可以自己选择合适的特征或者将两个特征值结合到一起,比如房价预测时,可以将房子的长度和宽度结合成一个特征即房子的面积。
当我们的数据集用直线不能很好的拟合时,我们可以考虑用多项式进行拟合,即多项式回归。
一个很重要的事情,就是当你选择多项式回归以及合适的特征时,特征缩放会变得特别重要,记得要时刻记在心上。
正规方程(normal equation)
在一个线性回归的问题当中,采用梯度下降的方法是非常好的,还有一种方法叫做正规方程的解法,可以直接在数学上解出最优的值,其根本数学含义设计到《矩阵论》的相关知识,并且使用正规方程的解法时,是不需要进行特征缩放的。首先第一步要针对我们的样本数据构建特征矩阵,具体过程如下图所示:
则我们最优的数学表达式如上图所示,含义为矩阵A的左逆乘以这个实际样本数据的列向量,它在数学过程需要计算这个矩阵的逆矩阵。如果这个矩阵不可逆,通常可能是因为特征之间相互不独立,或者特征值的数量大于训练集的数量。因此此时就不能用正规方程的解法了。
如果矩阵是n*n的矩阵,那么计算矩阵的逆矩阵的时间复杂度大约为,梯度下降的时间复杂度大约在,n的值如果大于10000的话,梯度下降的方法可能就会更好一些了。正规方程的方法只是对线性回归这一类的问题,并且当特征的个数n较小的时候的另一种解法,一般不适用与更复杂的算法,而梯度下降在很多更复杂的算法中都能适用,因此,梯度下降更为重要。
下面比较一下梯度下降和正规方程两种方法:
正规方程的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
关于正规方程不可导的问题
上面已经说过,如果特征相互之间存在相关性或者特征的个数远大于训练样本的个数,那么可能会导致正规矩阵不可逆,这在实际情况中比较少见,因此我们在选择特征时应该注意这两点,可以删除线性相关的特征,或者适当的删除一些特征的个数,另外在Octave中对矩阵求逆时,注意用pinv()函数而不是inv()函数,虽然两个函数都可以求逆矩阵,但是pinv()函数也叫做求伪逆矩阵,它可以在即使正规矩阵不可逆的情况下也帮你求出相应的最优解。