跳到内容

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 会选择相应的数值方法。

python
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$ 的前几列就是主成分方向,奇异值平方与各方向解释的方差相关。

python
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 只是理论分解:它是最小二乘、伪逆、降维和条件分析的核心数值工具。

练习

  1. 解释最小二乘残差为何与列空间正交。
  2. 对对角矩阵 diag(4, 1) 写出特征值和特征向量,并描述几何变换。
  3. 用 SVD 将一幅灰度矩阵近似为秩 1,比较重建误差。
  4. 对同一数据分别执行“只中心化”和“标准化后中心化”的 PCA,解释主方向为何变化。

小结

线性方程追求精确命中,最小二乘处理无法精确命中的观测;特征分解揭示方阵的特殊方向,SVD 则为任意矩阵提供输入方向、缩放强度和输出方向。PCA 是这套结构在数据降维中的一种应用,不是自动理解数据含义的魔法。

下一章从静态变换走向连续变化:函数在一点附近怎样变化,许多局部变化又怎样累积成整体。

Built with VitePress | Software Systems Atlas