个人blog https://verbf.github.io
本篇介绍了有关在多特征的情况下如何使用线性回归,以及一些相关的技巧。
场景描述
在多数时候我们的特征并不会只有一个。在预测房价的例子中,除了房屋的面积之外,房屋的房间数,楼层,房屋的年龄等也可以用于房价的预测。
| 面积(x1) |
房间数(x2) |
楼层(x3) |
房屋年龄(x4) |
价格(y) |
| 2101 |
3 |
2 |
20 |
460 |
| 1236 |
3 |
1 |
40 |
232 |
| 1514 |
2 |
2 |
50 |
315 |
符号注释 :
n : 特征的数量
x(i) : 第i个训练样本的特征向量
xj(i) : 第i个训练样本的第j个特征值
例 :
x(2)=⎣⎢⎢⎡12363140⎦⎥⎥⎤x3(2)=1
假设函数
因为特征的数量增加,假设函数也做出了相应的变化
hΘ(x)=Θ0+Θ1x1+Θ2x2+Θ3x3+...+Θnxn
为了书写的方便,我们定义一个x0=1 即 (x0(i)=1)
于是我们有 :
hΘ(x)=Θ0x1+Θ1x1+Θ2x2+Θ3x3+...+Θnxn
为进一步简化这个表达式,我们使用向量的方式来表示 :
X=⎣⎢⎢⎢⎢⎢⎢⎡x0x1x2x3...xn⎦⎥⎥⎥⎥⎥⎥⎤Θ=⎣⎢⎢⎢⎢⎢⎢⎡Θ0Θ1Θ2Θ3...Θn⎦⎥⎥⎥⎥⎥⎥⎤
hΘ(x)=ΘTXΘ0x0+Θ1x1+Θ2x2+Θ3x3+...+Θnxn
⇓
hΘ(x)=ΘTX
代价函数
J(Θ)=2m1i=1∑m(hΘ(x(i))−y(i))
梯度下降
Repeat{Θj=Θj−α∂Θj∂J(Θ0,...,Θn)}
需要注意的是,这里的Θj需要同步更新
| 同步更新 |
异步更新 |
temp0 = α∂Θ0∂J(Θ0,...,Θn) temp1 = α∂Θ1∂J(Θ0,...,Θn) Θ0 = temp0 Θ1 = temp1 |
temp0 = α∂Θ0∂J(Θ0,...,Θn) Θ0 = temp0 temp1 = α∂Θ1∂J(Θ0,...,Θn) Θ1 = temp1 |
特征缩放(Feature Scaling)
确保特征的数值大小在相似的规模下,这样梯度下降法可以更快的收敛。
在做特征缩放时并不需要太精确,只是为了使梯度下降法能更快的收敛。
| 缩放前 |
缩放后 |
| x1=size(0−2000feet2) |
x1=2000size(feet2)(0≤x1≤1) |
| x2=numberofbedrooms(1−5) |
x1=5numofbedrooms(0≤x2≤1) |
均值归一化(Mean normalization)
特征缩放的一种方法
x1⇒S1x1−μ1
μ1 表示训练集中特征x1的平均值
S1 表示该特征值的范围(max - min)
多项式回归
多项式回归就是用线性回归的方式去拟合更复杂的函数,甚至是非线性的函数。
特征选择
如图所示,我们有两个特征,房子的临街宽度和垂直深度。但我们通常使用面积来表示房屋的大小。所以我们可以使用房屋的面积(临街宽度 x 垂直深度)作为一个特征。

拟合多项式
对于下图中的数据集,我们继续使用一次函数来拟合的话,效果并不太好。
如果使用二次函数来拟合的话,效果可能也不是特别好,因为我们知道,二次函数的图像(图中蓝色的线)在后面是一个下降的趋势,然而现实中房价并不会随着房屋面积的增加而减少。
所以这里我们可以使用三次函数(图中绿色的线)来拟合。

我们只要做一些简单的修改就可以将线性回归应用到多项式上。
hΘ(x)=Θ0+Θ1x1+Θ2x2+Θ3x3
⇓
hΘ(x)=Θ0+Θ1size+Θ2(size)2+Θ3(size)3
我们令
x1=(size)x2=(size)2x3=(size)3
即可。
需要强调的是,在这种情况下特征缩放就显得尤为重要。
检验方法
我们如何判断梯度下降法是否正常工作呢?
通常可以观察代价函数的值与迭代次数的关系来判断。
当梯度下降法正常运行时,如下图所示,随着迭代次数的增加,代价函数的值越来越小,当梯度下降算法迭代60次左右时,代价函数的值几乎不再变化,说明此时算法已经收敛。

当出现以下两种情况时,代价函数的值上下震荡,或是逐渐变大,这都说明梯度下降法并没有正常工作。
通常出现这两种情况的原因都是学习率 α 过大。

学习率选择
总的来说学习率过小的话,会导致收敛过慢
而学习率过大的话,可能导致无法收敛,代价函数 J(Θ) 并不会在每次迭代之后都下降。
我们可以通过多次试验的方式找出合适的学习率值的大小。
另:按照吴恩达老师的推荐,我们可以如下依次选择学习率的大小。
… 0.001,0.03,0.1,0.3 …
正规方程
正规方程可以让我们再某些情况下,更快的求解出参数 Θ。
假设我们有m个样本,(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n)) ,n 个特征。
我们将单个样本的特征写成向量形式,再将所有的向量转置后,写成矩阵形式。
{% raw %}
x(i)=⎣⎢⎢⎢⎢⎢⎡x0(i)x1(i)x3(i)...xn(i)⎦⎥⎥⎥⎥⎥⎤X=m∗(n+1)⎣⎢⎢⎢⎢⎡−−−(x(1))T−−−−−−(x(2))T−−−−−−(x(3))T−−−−−−−−−−−−−−−(x(m))T−−−⎦⎥⎥⎥⎥⎤
{% endraw %}
接着,只要求解如下这个矩阵表达式,就可得到参数Θ的值
Θ=(XTX)−1XTy
在上式中需要对矩阵求逆,那么如果矩阵不可逆呢?
一般来说,大部分矩阵都是可逆的,出现了以下两种情况时,会导致矩阵不可逆:
-
多余特征
如下所示,显然x1和x2两个特征是线性相关的,那么这时就会导致矩阵不可逆
x1=size in feet2x2=size in m2
-
太多特征
如果我们的特征数量较多,而样本数量较少,造成特征数量大于样本数量,这种情况下也会导致矩阵不可逆。例如,生物信息学的基因芯片数据中常有成千上万个属性,但往往只有几十,上百个样例。
正规方程与梯度下降法比较
|
梯度下降 |
|
正规方程 |
| 缺点 |
需要多次迭代 需要选择学习率 |
优点 |
不需要多次迭代 不需要选择学习率 |
| 优点 |
当特征数量n很大时, 也能运行的很好 |
缺点 |
当特征数量n较大时, 速度很慢 |
吴恩达老师推荐,当n大于10000时选择梯度下降法,小于10000时选择正规方程法。