10.3 最小二乘、特征分解与 SVD:从精确解到最佳近似
真实观测通常互相矛盾。你记录了上千次请求的负载与延迟,希望用几十个特征解释结果,方程数量远多于未知数,也几乎不可能同时精确成立。线性代数的价值正在这里:把“不可能全对”转化为一个可度量的最佳近似问题。
本课目标
- 从投影理解最小二乘;
- 解释特征值和特征向量表达的稳定方向;
- 理解奇异值分解适用于任意矩阵;
- 说清 PCA 的中心化、降维和信息损失边界。
1. 最小二乘:让残差尽可能小
当 $A\mathbf{x}=\mathbf{b}$ 无解时,最小二乘选择:
$$ \hat{\mathbf{x}} =\arg\min_{\mathbf{x}}\lVert A\mathbf{x}-\mathbf{b}\rVert_2^2. $$
残差 $\mathbf{r}=\mathbf{b}-A\hat{\mathbf{x}}$ 与 $A$ 的每个列向量正交,因此:
$$ A^\mathsf{T}(\mathbf{b}-A\hat{\mathbf{x}})=0, $$
得到正规方程:
$$ A^\mathsf{T}A\hat{\mathbf{x}}=A^\mathsf{T}\mathbf{b}. $$
几何上,$A\hat{\mathbf{x}}$ 是 $\mathbf{b}$ 在 $A$ 的列空间上的正交投影。
正规方程适合推导,却不总适合直接计算。形成 $A^\mathsf{T}A$ 会平方条件数,可能放大数值问题。工程中常使用 QR 分解或 SVD;NumPy 的 lstsq 会选择相应的数值方法。
import numpy as np
# y ≈ slope * x + intercept
x = np.array([0.0, 1.0, 2.0, 3.0])
y = np.array([1.1, 2.9, 5.2, 6.8])
A = np.column_stack([x, np.ones_like(x)])
solution, residuals, rank, singular_values = np.linalg.lstsq(
A, y, rcond=None
)
slope, intercept = solution
print(slope, intercept, rank)最小二乘隐含误差度量:大残差被平方后惩罚更重,因此对离群点敏感。数据机制不符合独立、同方差等假设时,参数仍可算出,但统计解释需要额外检验。
2. 特征向量:变换中的不变方向
对方阵 $A$,若存在非零向量 $\mathbf{v}$ 满足
$$ A\mathbf{v}=\lambda\mathbf{v}, $$
则 $\mathbf{v}$ 是特征向量,$\lambda$ 是对应特征值。沿这个方向,变换只进行缩放;负特征值还会翻转方向。
特征值可用于理解:
- 线性动态系统在不同方向上的增长或衰减;
- 图的邻接矩阵、拉普拉斯矩阵所编码的结构;
- 对称协方差矩阵的主要变化方向。
并非所有矩阵都能在实数域中找到一组完整的特征向量。矩阵也可能有复特征值,或因缺少足够多的线性无关特征向量而不能对角化。因此“求特征分解”不是任意矩阵都能无条件完成的步骤。
3. SVD:任意矩阵的方向与强度
任意实矩阵 $A\in\mathbb{R}^{m\times n}$ 都存在奇异值分解:
$$ A=U\Sigma V^\mathsf{T}. $$
- $V$ 的列给出输入空间中的正交方向;
- $\Sigma$ 的非负对角元素是奇异值,描述各方向的缩放强度;
- $U$ 的列给出输出空间中的正交方向。
可以把变换理解成三步:先按 $V^\mathsf{T}$ 旋转或反射输入,再按 $\Sigma$ 沿坐标轴缩放,最后按 $U$ 旋转或反射到输出空间。
非零奇异值的数量等于矩阵的秩。最大与最小非零奇异值之比还与条件数相关:比例越悬殊,某些方向越容易把输入误差放大到解中。
4. 低秩近似与压缩
将奇异值从大到小排列,只保留前 $k$ 个:
$$ A_k=U_k\Sigma_kV_k^\mathsf{T}. $$
$A_k$ 是秩不超过 $k$ 的近似。对二范数和 Frobenius 范数,它具有严格的最佳低秩近似性质。直觉上,较大的奇异值对应矩阵中更强的变化模式,较小的奇异值对应较弱方向。
这能用于图像近似、潜在语义表示和推荐模型,但“较小”不自动等于“噪声”。少数群体或异常模式也可能落在能量较低的方向,压缩前仍需看任务含义。
5. PCA 与 SVD 的关系
主成分分析寻找数据方差最大的正交方向。设数据矩阵 $X$ 的每行是一个样本,第一步必须按列中心化:
$$ X_c=X-\mathbf{1}\boldsymbol{\mu}^\mathsf{T}. $$
协方差矩阵与 $X_c^\mathsf{T}X_c$ 成比例。对中心化数据做 SVD:
$$ X_c=U\Sigma V^\mathsf{T}, $$
$V$ 的前几列就是主成分方向,奇异值平方与各方向解释的方差相关。
import numpy as np
X = np.array([
[2.0, 1.0],
[3.0, 2.0],
[4.0, 2.5],
[5.0, 4.0],
])
mean = X.mean(axis=0)
centered = X - mean
_, singular_values, vt = np.linalg.svd(centered, full_matrices=False)
principal_direction = vt[0]
one_dimensional = centered @ principal_direction
reconstructed = np.outer(one_dimensional, principal_direction) + mean若特征尺度差异很大,是否先标准化取决于问题:PCA 对尺度敏感,标准化会改变“方差最大”的含义。训练数据得到的均值、尺度和主成分必须固定后应用于新数据。
6. 该选哪一种工具
| 问题 | 常用工具 | 关键提醒 |
|---|---|---|
| 方阵线性系统 | LU、专用 solve | 不要显式求逆 |
| 超定方程与拟合 | QR、SVD、lstsq | 检查残差、秩与数据假设 |
| 对称矩阵的主要方向 | 特征分解 | 利用对称结构 |
| 任意矩阵的秩与低秩近似 | SVD | 关注条件数和截断损失 |
| 数据降维 | 中心化后的 PCA/SVD | 缩放策略属于模型定义 |
常见误区
- PCA 会自动发现最重要的业务特征:它最大化方差,不知道业务目标。
- 保留 95% 方差就保留了 95% 信息:这是任务相关性的启发式,不是普遍等价关系。
- 特征值最大的方向总最稳定:稳定性还取决于矩阵性质、谱间隔和扰动。
- SVD 只是理论分解:它是最小二乘、伪逆、降维和条件分析的核心数值工具。
练习
- 解释最小二乘残差为何与列空间正交。
- 对对角矩阵
diag(4, 1)写出特征值和特征向量,并描述几何变换。 - 用 SVD 将一幅灰度矩阵近似为秩 1,比较重建误差。
- 对同一数据分别执行“只中心化”和“标准化后中心化”的 PCA,解释主方向为何变化。
小结
线性方程追求精确命中,最小二乘处理无法精确命中的观测;特征分解揭示方阵的特殊方向,SVD 则为任意矩阵提供输入方向、缩放强度和输出方向。PCA 是这套结构在数据降维中的一种应用,不是自动理解数据含义的魔法。
下一章从静态变换走向连续变化:函数在一点附近怎样变化,许多局部变化又怎样累积成整体。