在一元线性回归中虽然只有一个房屋面积的特征,但是相对来说我们更倾向于多元线性回归,因为要预测一个值,往往不是一个特征就能够将其描述完整的,我们需要一个能够支持多个特征的模型来完善我们的线性回归算法,就是接下来的多元线性回归(Linear Regression with Multiple Variables, Multivariate Linear Regression)

多维特征(Multiple Features)

在多元线性回归建模之前,首先要为我们的房价数据集增加更多的特征,例如房间的楼层数、使用年份、卧室数等,这些都对房屋价格有着关键性的影响,所以我们应该把它们作为特征加入到我们的训练集中,构成一个含有多的变量的线性回归模型:

Size(feet2)Number of bedroomsNumber of floorsAge of home(years)price($1000)
21045145460
14163240232
15343230315
8522136178

接着用矩阵来表示它们:

$$
X=\left[\begin




\vdots & \vdots & \vdots & \vdots & \vdots
\end2104 & 5 & 1 & 45 & 460 \1416 & 3 & 2 & 40 & 232 \1534 & 3 & 2 & 30 & 315 \852 & 2 & 1 & 36 & 178 \
\right]
$$

  • $x_^{(i)}$ 代表特征矩阵中第 $i$ 行的第 $j$ 个特征。
  • $m$ 为样本数量。
  • $n$ 为特征数量。

和一元线性回归一样,引入 $x_{0}=1$ 来简化公式:

$$
\begin

h_{\theta}(x)&=\theta_{0} x_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\cdots+\theta_
x_
&=\theta^{\top} X
\end \

$$

此时模型中的参数 $\theta$ 是一个 $n+1$ 维的向量,特征矩阵 $X$ 的维度是 $m \times(n+1)$ 。

特征缩放(Feature Scaling)

观察我们的数据集,房屋面积的值大约是 0 ~ 2000 之间,而房屋数量则是在 0 ~ 5 之间,两者差别三位数量级,如果以这两个参数作为横纵坐标,绘制代价函数的等高线图的话,可以看出图像会非常的扁,梯度下降算法需要很多次的迭代才能收敛。

进行特征缩放(Feature Scaling) 操作可以减小样本数据的波动,使得梯度下降能够更快速的寻找到一条“捷径”,从而到达最小值处。特征缩放的方法有很多种,目的大都是把值缩小于 0 ~ 1 之间,便于梯度下降算法的工作。

min-max 归一化(Min-Max Normalization):

$$
X_
=\frac{X-X_}{X_{\max }-X_{\min }}
$$

均值归一化(Mean Normalization):

$$
X_
=\frac{X-\mu}{X_} \quad \text \quad X_{\text }=\frac{X-\mu}{X_{\text }-X_{\text }}
$$

  • $\mu$ 为该特征所有样本数据的均值(mean)

Z-score 标准化(Z-score Standardization):

$$
X_
=\frac{X-\mu}{\sigma}
$$

  • $\mu$ 为该特征所有样本数据的均值(mean)
  • $\sigma$ 为该特征所有样本数据的标准差(Standard Deviation)

其中,标准差也被成为标准偏差:

$$
\sigma=\sqrt{\frac{1}
\sum_\left(x_-\mu\right){2}}
$$

归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。

在使用梯度下降时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。

多变量梯度下降(Gradient Descent For Multiple Variables)

现在梯度下降算法需要变更为支持多变量迭代的形式,之前单变量梯度下降的公式为:

循环 {
$$
\begin

\theta_{0}:=\theta_{0}-\alpha \frac{1}
\sum_\left(h_{\theta}\left(x
\theta_{1}:=\theta_{1}-\alpha \frac{1}{(i)}\right)-y^{(i)}\right) \
\sum_\left(\left(h_{\theta}\left(x{(i)}\right)-y{(i)}\right) \cdot x{(i)}\right)
\end

$$
}

以上是支持 $\theta_0$ 与 $\theta_1$ 两个参数的梯度下降,其实如果 $\theta_0$ 的式子变成这样:

$$
\theta_{0}:=\theta_{0}-\alpha \frac{1}
\sum_\left(\left(h_{\theta}\left(x{(i)}\right)-y{(i)}\right) \cdot x{(i)}\right)
$$

那它也是等价于之前的式子的,因为在我们的特征矩阵中始终约定了 ,现在我们需要让它支持更多的变量:

循环 {
$$
\theta_
:=\theta_-\alpha \frac{1} \sum_\left(\left(h_{\theta}\left(x{(i)}\right)-y{(i)}\right) \cdot x_{(i)}\right)
$$
}

这样的梯度下降理论上支持任意数量的特征参数。使用 Python 描述为:

# 单变量梯度下降
for ... in ... :
    error = X.dot(theta) - y
    theta[0] -= (alpha / m) * np.sum(error)
    theta[1] -= (alpha / m) * np.sum(error.dot(X))
    # theta 需要逐个运算
    ...
​
# 多变量梯度下降
for ... in ... :
    theta -= (alpha / m) * (X.dot(theta) - y).dot(X)
    # 直接将整个 theta 作为向量运算
    ...

从一元线性回归到多元线性回归最重要的是梯度下降算法的改变。

正规方程(Normal Equation)

到目前为止,求解参数最小值时一直在使用梯度下降的相关算法,其实还存在能与梯度下降比肩的算法,就是 正规方程(Normal Equation) 。正规方程在某些线性问题上更加适合于求解参数最小值,且它要比梯度下降这种迭代法更为简便,正规方程工作方式是一步求解出参数最小值,当然梯度下降也有优于正规方程的地方。

$$
\theta=\left(X{\top} X\right){-1} X^{\top} y
$$

  • $X$ 为训练集特征矩阵(包含了 $X_0=1$ )。
  • $y$ 为训练集结果标签向量。
  • Matlab 中的正规方程:pinv(X'*X)*X'*y
  • Numpy 包中的正规方程:np.linalg.inv(X.T@X)@X.T@y
  • TensorFlow 中的正规方程:
    	mat = tf.matmul(tf.transpose(X), X)
    	inv = tf.matrix_inverse(mat)
    	vec = tf.matmul(tf.transpose(X), y)
    	solution = tf.matmul(inv, vec)
    

虽然正规方程与梯度下降截然不同,但他们的作用都是用于求解参数最小值。

梯度下降正规方程
需要选择学习率 $\alpha$不需要选择学习率 $\alpha$
需要进行多次迭代运算求解一次求解运算即可得出结果
当特征数量 $n$ 较大时也能较好适用需要计算 $\left(X{\top} X\right)$ 的逆,如果特征数量 $n$ 越大,则运算代价越大,因为涉及到矩阵的逆运算,计算时间复杂度为 $O\left(n{3}\right)$ 
适用于各种类型的模型只适用于线性模型,不适用于逻辑回归模型等其他模型

对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),是无法使用正规方程方法的。

小结

到目前为止,简单的线性回归模型俨然建立完毕。对于特征缩放并不是每种算法都需要做的,只是梯度下降会很需要特征缩放这种操作,因为特征缩放会影响到梯度下降的效率,但在正规方程或者是神经网络中是不需要进行特征缩放的。

References

[1]Andrew Ng.Machine Learning.Coursera.2014

[2]深度碎片.吴恩达机器学习图解笔记.Bilibili.2018-3

[3]黄海广.斯坦福大学2014机器学习教程笔记.GitHub.2018-5

[4]brucep3.归一化、标准化和中心化/零均值化.简书.2018-6

[5]周志华.机器学习.清华大学出版社.2016-1


《吴恩达机器学习系列课程》笔记