4.1 多维特征
在之前的内容中,只探讨了单一特征的回归模型,也就是 m 个样本实例中,每个样本实例 x 只有一个特征,比如房价预测中的 m 个样本中,每个样本只有“房间尺寸”这一个特征。
在实际情况中,更多的是涉及到多维特征模型,比如影响房价的因素(即特征)除了房间尺寸外,还有房间数、楼层等等。这时就需要引入多维特征。
多维特征:在 m 个样本实例中,每个样本实例 x 都有 n 个特征。注释表示为:x j(i),代表特征矩阵中的第 i 行的第 j 个特征,也就是第 i 个训练实例的第 j 个特征。
支持多变量的假设函数 h 可以表示为:hθ(x) = θ0x0+θ1x1+θ2x2+...+θnxn ,其中 x0 为人为引入,x0 = 1。此时模型中的参数 θ 是一个 n+1 维的向量,任何一个训练实例也都是 n+1 维的向量,特征矩阵X的维度是 m*( n+1 )。 因此公式可以简化为:hθ(x) = θTX,其中上标T代表矩阵转置。
4.2 多元梯度下降法
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:
接下来就是要通过梯度下降的方法来使得代价函数最小:
公式中的 ( hθ(x(i)) - y(i) ) * xj(i) 是代价函数 J(θ) 对 θ 的导数。
matlab代码示例:
theta = theta - alpha * ( 1 / m ) * X' * ( ( theta' * X' )' - y ) 其中X:( m , n + 1 ) ,theta:( n + 1 , 1 ) ,y:( m , 1 ) ,m 代表样本数,n代表特征数。
4.3 (归一化)特征缩放
在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
归一化(特征缩放)的优点:
(1)归一化后加快了梯度下降求最优解的速度。
(2)归一化有可能提高精度(归一化是让不同维度之间的特征在数值上有一定的比较性)。
下图能更清晰的体现归一化和未归一化时最优解寻解过程的区别:
未归一化:
归一化:
从上面可以看出,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。
两种归一化的方法:
(1)min-max标准化
定义:也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间。
本质:把数变为【0,1】之间的小数。
转换函数:(X-Min)/(Max-Min)
如果想要将数据映射到-1,1,则将公式换成:(X-Mean)/(Max-Min)
其中:max为样本数据的最大值,min为样本数据的最小值,Mean表示数据的均值。
(2)Z-score(0均值)标准化方法
定义:这种方法给与原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1.
本质:把有量纲表达式变成无量纲表达式。
转换函数:(X-Mean)/(Standard deviation)
其中,Mean为所有样本数据的均值。Standard deviation为所有样本数据的标准差。
4.4 学习率
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
梯度下降算法的每次迭代受到学习率的影响,如果学习率 过小,则达到收敛所需的迭代次数会非常高;如果学习率 过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。
蓝色线正确的情况,绿色和黑色为错误的情况(一般需要使用更小的学习率 )
通常可以考虑尝试些学习率:
= 0.01,0.03,0.1,0.3,1,3,10
4.5 特征和多项式回归
如下图所示,线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型 h(x) = 0 + 1x1 + 2x22 或者三次方模型。
如果假设中出现了高阶项,那么这个模型还是线性模型吗?
如果把假设函数看成是特征 x 的方程,那么该方程就是非线性方程;如果看出是参数 的方程,那么 x 的高阶项都可以认为是 的参数。很明显,在线性回归中采用了后一种的解释方式。
4.6 正规方程
区别于利用迭代的方式求解最优解,正规方程是求解下面的方程来找出使得代价函数最小的参数:
假设我们的训练集特征矩阵为 X(包含了 x0 = 1)并且我们的训练集结果为向量 y,则利用正规方程解出向量 = ( XT X )−1 XT y 。
推导过程如下:
matlab程序: pinv ( X' * X ) * X' * y
python程序:
梯度下降与正规方程的比较:
4.7 正规方程在矩阵不可逆情况下的解决办法
利用正规方程解出向量 = ( XT X )−1 XT y 时,如果 XT X 不可逆,该如何处理呢?
首先不可逆的情况非常少见,当矩阵的特征是线性相关,以及特征远远大于样本数量(m < n)时会出现不可逆的情况。
在matlab中有两个函数可以求解矩阵的逆,一个是 pin() 函数,一个是 inv() 函数。前者是所谓的伪逆,后者是逆。使用 pinv() 函数可以展现数学上的过程,即便矩阵 X'X 是不可逆的,也将计算出 的值。
以上,就是吴恩达机器学习课程第四章的主要内容。