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$ 是奇异矩阵(不可逆)时,正规方程无法直接使用。常见原因:
-
特征之间存在线性相关性:如一列是另一列的倍数,或多列线性组合为零。此时特征矩阵的秩小于 $n$。
-
样本数少于特征数:$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$$
这些性质在推导更复杂的模型(如高斯判别分析)时会用到。
五、总结
本章的核心结论:
- 正规方程 $\theta = (X^T X)^{-1} X^T y$ 给出了线性回归参数的闭式解
- 正规方程的复杂度为 $O(n^2 m + n^3)$,适合特征数较少的场景
- 当 $n > 10000$ 时,梯度下降比正规方程更高效
- 特征缩放可以显著加速梯度下降收敛
- 多项式回归通过特征扩展让线性模型拟合非线性数据
六、正规方程与梯度下降的对比总结
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 实践中的选择策略
- 当 $n \leq 10000$ 时,正规方程是一个不错的选择,实现简单,一步到位
- 当 $n > 10000$ 或 $m$ 极大时,选择梯度下降
- 当模型不是线性回归时(如逻辑回归、神经网络),只能使用梯度下降或更高级的优化算法
6.3 高级优化算法
除了梯度下降和正规方程,还有一些更高级的优化算法值得了解:
共轭梯度法(Conjugate Gradient):避免了梯度下降的震荡问题,收敛速度介于梯度下降和牛顿法之间。
BFGS / L-BFGS:拟牛顿法,不需要计算完整的海森矩阵,通过梯度信息近似海森矩阵的逆,兼具牛顿法的快速收敛和梯度下降的低计算成本。
Adam:深度学习中广泛使用的自适应学习率优化算法。它不仅为每个参数设置不同的学习率,还利用动量(Momentum)来加速收敛。Adam 在深度学习中几乎是默认选择。
实际实现中的数值稳定性
在实际代码实现中,我们很少直接计算 $X^TX$ 的逆矩阵,因为矩阵求逆在数值上是不稳定的。更常用的方法是通过求解线性方程组 $X^TX\theta = X^Ty$ 来得到参数,这可以通过以下数值方法实现:
- LU 分解:将 $X^TX$ 分解为下三角矩阵 L 和上三角矩阵 U 的乘积,然后通过前代和回代求解。
- Cholesky 分解:当 $X^TX$ 对称正定时,可以分解为 $LL^T$,计算量仅为 LU 分解的一半。
- SVD 分解:对设计矩阵 X 直接进行奇异值分解 $X = U\Sigma V^T$,则 $\theta = V\Sigma^+ U^T y$,其中 $\Sigma^+$ 是伪逆。SVD 是数值最稳定的方法,即使 $X^TX$ 接近奇异也能给出合理的结果。
这三种方法各有优劣:LU 分解计算最快但稳定性较差,SVD 最稳定但计算量最大,Cholesky 在两者之间取得了良好平衡。
延伸阅读
- 📺 B 站播放列表:Stanford CS229 — 斯坦福机器学习
- 📚 更多学习资源,请访问 deeplearning.ai 官网