第 2 课
← 返回系列列表

Lecture 3:正规方程与矩阵推导

Stanford CS229 — 斯坦福机器学习

正规方程的矩阵形式推导、计算复杂度分析。

Lecture 3:正规方程与矩阵推导

课程简介

正规方程的矩阵形式推导、计算复杂度分析。

🎬 本课程视频:Stanford CS229 — 斯坦福机器学习


一、正规方程

1.1 从迭代到闭式解

梯度下降通过迭代方式逐步逼近最优参数。然而,对于线性回归这样的凸优化问题,存在一种不需要迭代的闭式解法——正规方程(Normal Equations)。它通过直接求解代价函数的导数零点,一步给出最优参数。

回顾我们的代价函数:

$$J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2$$

用矩阵形式改写。定义设计矩阵 $X \in \mathbb{R}^{m \times n}$,其中第 $i$ 行是第 $i$ 个训练样本的转置 $(x^{(i)})^T$;定义目标向量 $y \in \mathbb{R}^m$,其中第 $i$ 个元素是 $y^{(i)}$。

则预测向量为 $X\theta$,代价函数可以写为:

$$J(\theta) = \frac{1}{2m} (X\theta - y)^T (X\theta - y)$$

1.2 矩阵形式的推导

展开 $J(\theta)$:

$$J(\theta) = \frac{1}{2m} [ (X\theta)^T X\theta - (X\theta)^T y - y^T (X\theta) + y^T y ]$$

由于 $(X\theta)^T y = y^T (X\theta)$(标量),所以:

$$J(\theta) = \frac{1}{2m} [ \theta^T X^T X \theta - 2\theta^T X^T y + y^T y ]$$

对 $\theta$ 求梯度,使用矩阵微积分公式 $\nabla_\theta (\theta^T A \theta) = 2A\theta$(当 $A$ 对称时)和 $\nabla_\theta (\theta^T b) = b$:

$$\nabla_\theta J(\theta) = \frac{1}{2m} [ 2X^T X \theta - 2X^T y ] = \frac{1}{m} (X^T X \theta - X^T y)$$

令梯度为零:

$$X^T X \theta = X^T y$$

这就是正规方程。如果 $X^T X$ 可逆,最优参数为:

$$\theta^* = (X^T X)^{-1} X^T y$$

这个公式给出了线性回归参数的闭式解——一步计算即可得到全局最优参数,无需选择学习率或迭代。

1.3 几何解释

正规方程有优雅的几何解释。预测值 $\hat{y} = X\theta$ 是 $y$ 在 $X$ 的列空间上的投影。正规方程 $X^T X \theta = X^T y$ 的几何意义是:预测残差 $y - X\theta$ 与 $X$ 的所有列正交。

在二维情况下:$X$ 有两列,张成一个平面。$y$ 是这个平面外的一个向量。最优的 $\hat{y}$ 就是 $y$ 在这个平面上的投影——使得残差向量垂直于这个平面。

1.4 计算复杂度分析

正规方程的计算复杂度:
- 计算 $X^T X$:$O(n^2 m)$
- 求逆 $(X^T X)^{-1}$:$O(n^3)$
- 总体复杂度:$O(n^2 m + n^3)$

梯度下降($k$ 次迭代)的计算复杂度:
- BGD 每次迭代:$O(nm)$
- 总体复杂度:$O(knm)$

方法 复杂度 适用场景
正规方程 $O(n^2 m + n^3)$ $n$ 较小($n < 10000$)
梯度下降 $O(knm)$ $n$ 较大,$m$ 可很大

当特征数量 $n$ 很大时(如 $n > 10000$),计算 $O(n^3)$ 的矩阵求逆非常昂贵,此时梯度下降更合适。

def normal_equation(X, y):
    # 正规方程求解线性回归参数
    # X: m x n 设计矩阵, y: m 维目标向量
    # 返回: n 维参数向量
    theta = np.linalg.inv(X.T @ X) @ X.T @ y
    return theta

    # 更稳定的做法:使用 np.linalg.solve 避免显式求逆
    # theta = np.linalg.solve(X.T @ X, X.T @ y)

1.5 $X^T X$ 不可逆的情况

当 $X^T X$ 是奇异矩阵(不可逆)时,正规方程无法直接使用。常见原因:

  1. 特征之间存在线性相关性:如一列是另一列的倍数,或多列线性组合为零。此时特征矩阵的秩小于 $n$。

  2. 样本数少于特征数:$m < n$ 时,$X^T X$ 是 $n \times n$ 矩阵但秩最多为 $m$,必然奇异。

解决方案:
- 使用伪逆 $\theta = (X^T X)^\dagger X^T y$
- 添加正则化项:$\theta = (X^T X + \lambda I)^{-1} X^T y$(岭回归)
- 删除冗余特征

二、特征缩放

2.1 为什么要特征缩放

在线性回归中,特征的尺度差异会显著影响梯度下降的收敛速度。

假设有 $x_1$ = 房屋面积(50-500 平方米)和 $x_2$ = 卧室数量(1-5 间)。如果直接使用原始值,$\theta_1$ 的尺度会远小于 $\theta_2$ 的尺度,导致代价函数的等高线呈狭长椭圆形——梯度下降会在参数空间中反复震荡,收敛极慢。

2.2 均值归一化

将每个特征减去均值并除以标准差:

$$x_j^{(i)} := \frac{x_j^{(i)} - \mu_j}{\sigma_j}$$

其中 $\mu_j$ 是特征 $j$ 的均值,$\sigma_j$ 是特征 $j$ 的标准差。

归一化后,所有特征都近似分布在 $[-1, 1]$ 范围内,等高线接近圆形,梯度下降可以快速收敛。

def feature_normalize(X):
    mu = np.mean(X, axis=0)
    sigma = np.std(X, axis=0)
    X_norm = (X - mu) / sigma
    return X_norm, mu, sigma

2.3 学习率自动选择技巧

通过特征缩放,我们可以为所有特征使用统一的学习率。Andrew Ng 推荐的做法:从 $\alpha = 0.01$ 开始,如果收敛太慢就尝试 $0.03, 0.1, 0.3, 1.0$,每次约 3 倍的增量。

三、多项式回归

3.1 特征扩展

线性回归无法捕捉非线性关系。但我们可以通过对特征进行非线性变换来扩展模型能力。例如,对于一维数据,我们可以创建多项式特征:

$$h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + ...$$

这本质上仍然是对参数 $\theta$ 线性的模型,因此正规方程和梯度下降仍然适用。

from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)
# X_poly 包含 [1, x, x^2, x^3] 作为特征

3.2 欠拟合与过拟合

多项式回归引出了机器学习中最重要的权衡之一——偏差与方差的权衡。

选择合适的多项式次数是模型选择的核心问题。

四、概率补充:矩阵微积分

4.1 常用矩阵导数公式

正规方程的推导需要一些矩阵微积分工具。以下是 CS229 中常用的公式:

$$\nabla_\theta (\theta^T a) = a$$
$$\nabla_\theta (a^T \theta) = a$$
$$\nabla_\theta (\theta^T A \theta) = (A + A^T) \theta$$
$$\nabla_A (AB) = B^T$$

如果 $A$ 是对称矩阵,则 $\nabla_\theta (\theta^T A \theta) = 2A\theta$。

4.2 迹算子

迹算子 $\text{tr}(A)$ 是方阵 $A$ 的对角线元素之和。在矩阵微积分中,迹算子有很多便利的性质:

$$\text{tr}(ABC) = \text{tr}(CAB) = \text{tr}(BCA)$$
$$\nabla_A \text{tr}(AB) = B^T$$
$$\nabla_A \text{tr}(ABA^T C) = CAB + C^T AB$$

这些性质在推导更复杂的模型(如高斯判别分析)时会用到。

五、总结

本章的核心结论:

  1. 正规方程 $\theta = (X^T X)^{-1} X^T y$ 给出了线性回归参数的闭式解
  2. 正规方程的复杂度为 $O(n^2 m + n^3)$,适合特征数较少的场景
  3. 当 $n > 10000$ 时,梯度下降比正规方程更高效
  4. 特征缩放可以显著加速梯度下降收敛
  5. 多项式回归通过特征扩展让线性模型拟合非线性数据

六、正规方程与梯度下降的对比总结

6.1 综合对比

对比维度 正规方程 梯度下降
求解方式 闭式解,一步到位 迭代逼近
需要选择学习率 不需要 必须选择
需要特征缩放 不需要(但对求逆数值稳定性有好处) 强烈建议
计算复杂度 $O(n^3 + n^2 m)$ $O(knm)$,k 是迭代次数
当 $n$ 很大时 计算 $(X^T X)^{-1}$ 很慢 每次迭代 $O(nm)$,依然可行
当 $m$ 很大时 $O(n^2 m)$ 的矩阵乘法可能很慢 SGD 每次只用一个样本,可以处理大数据
数值稳定性 当特征高度相关时 $X^T X$ 可能接近奇异 相对稳定
推广性 仅适用于线性回归 适用于各种模型

6.2 实践中的选择策略

6.3 高级优化算法

除了梯度下降和正规方程,还有一些更高级的优化算法值得了解:

共轭梯度法(Conjugate Gradient):避免了梯度下降的震荡问题,收敛速度介于梯度下降和牛顿法之间。

BFGS / L-BFGS:拟牛顿法,不需要计算完整的海森矩阵,通过梯度信息近似海森矩阵的逆,兼具牛顿法的快速收敛和梯度下降的低计算成本。

Adam:深度学习中广泛使用的自适应学习率优化算法。它不仅为每个参数设置不同的学习率,还利用动量(Momentum)来加速收敛。Adam 在深度学习中几乎是默认选择。

实际实现中的数值稳定性

在实际代码实现中,我们很少直接计算 $X^TX$ 的逆矩阵,因为矩阵求逆在数值上是不稳定的。更常用的方法是通过求解线性方程组 $X^TX\theta = X^Ty$ 来得到参数,这可以通过以下数值方法实现:

  1. LU 分解:将 $X^TX$ 分解为下三角矩阵 L 和上三角矩阵 U 的乘积,然后通过前代和回代求解。
  2. Cholesky 分解:当 $X^TX$ 对称正定时,可以分解为 $LL^T$,计算量仅为 LU 分解的一半。
  3. SVD 分解:对设计矩阵 X 直接进行奇异值分解 $X = U\Sigma V^T$,则 $\theta = V\Sigma^+ U^T y$,其中 $\Sigma^+$ 是伪逆。SVD 是数值最稳定的方法,即使 $X^TX$ 接近奇异也能给出合理的结果。

这三种方法各有优劣:LU 分解计算最快但稳定性较差,SVD 最稳定但计算量最大,Cholesky 在两者之间取得了良好平衡。

延伸阅读

← Lecture 1-2:线性回归与梯度下降 Lecture 4-5:逻辑回归与感知机 →