跳到内容

第 10 卷 / 第 10 章 / 第 3 课

10.3 最小二乘、特征分解与 SVD:从精确解到最佳近似 ​

真实观测通常无法同时满足一个精确线性方程。上千次请求提供的负载与延迟记录,可能要由几十个特征近似解释;方程数量远多于未知数。线性代数把“不可能全对”转化为一个可度量的最佳近似问题。

本课目标 ​

  • 从投影理解最小二乘;
  • 解释特征值和特征向量表达的不变方向;
  • 理解奇异值分解适用于任意矩阵;
  • 说清 PCA 的中心化、降维和信息损失边界。

1. 最小二乘:让残差尽可能小 ​

当 Ax=b 无解时,最小二乘选择:

x^=arg⁡minx‖Ax−b‖22.

残差 r=b−Ax^ 与 A 的每个列向量正交,因此:

AT(b−Ax^)=0,

得到正规方程:

ATAx^=ATb.

几何上,Ax^ 是 b 在 A 的列空间上的正交投影。

投影 Ax^ 总是唯一,但参数 x^ 只有在 A 满列秩时才唯一。若存在非零零空间向量 z,加上它不改变预测:A(x^+z)=Ax^。lstsq 在多个最优解中返回二范数最小者;最小二乘也适用于有精确解的系统。

对满列秩 A,二范数条件数满足 κ2(ATA)=κ2(A)2。因此正规方程虽便于推导,直接形成它可能放大舍入问题。常用计算方法包括 QR 和 SVD;下面调用 NumPy 2.x 的 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(f"{slope:.2f} {intercept:.2f} {rank}")  # 1.94 1.09 2
residual = y - A @ solution
print(f"{residual @ residual:.3f}")            # 0.082
print(np.allclose(A.T @ residual, 0.0))       # True

最小二乘隐含误差度量:大残差被平方后惩罚更重,因此对离群点敏感。数据机制不符合独立、同方差等假设时,参数仍可算出,但统计解释需要额外检验。

residuals 返回残差平方和,而非每个样本的残差;当矩阵秩小于列数或行数不大于列数时,它是空数组,空数组不表示拟合误差为零。需要时直接计算 y - A @ solution。本例显式传入 rcond=None,按机器精度乘最大矩阵维度确定秩阈值;NumPy 文档 也记录了 2.0 的默认值变化。

2. 特征向量:变换中的不变方向 ​

对方阵 A,若存在非零向量 v 满足

Av=λv,

则 v 是特征向量,λ 是对应特征值。沿这个方向,变换只进行缩放;负特征值还会翻转方向。

特征值可用于理解:

  • 线性动态系统在不同方向上的增长或衰减;
  • 图的邻接矩阵、拉普拉斯矩阵所编码的结构;
  • 对称协方差矩阵的主要变化方向。

并非所有矩阵都能在实数域中找到一组完整的特征向量。矩阵也可能有复特征值,或因缺少足够多的线性无关特征向量而不能对角化。因此“求特征分解”不是任意矩阵都能无条件完成的步骤。

例如二维旋转 90° 在实数域没有特征向量,而矩阵 [[1,1],[0,1]] 只有一维特征空间,不能对角化。实对称矩阵则保证可用正交特征向量对角化,数值库可选专门的 eigh。重复特征值对应的基可能不唯一。

3. SVD:任意矩阵的方向与强度 ​

任意实矩阵 A∈Rm×n 都存在奇异值分解:

A=UΣVT.
  • V 的列给出输入空间中的正交方向;
  • Σ 的非负对角元素是奇异值,描述各方向的缩放强度;
  • U 的列给出输出空间中的正交方向。

可以把变换理解成三步:先按 VT 旋转或反射输入,再按 Σ 沿坐标轴缩放,最后按 U 旋转或反射到输出空间。

完整 SVD 中 U 为 m×m、Σ 为 m×n、V 为 n×n;中间步骤也会舍去或补上坐标。紧凑形式取 r=min(m,n),形状改为 (m,r)、(r,r)、(r,n)。NumPy 返回的是一维奇异值数组和 Vh,对实矩阵 Vh=V.T,不能把它当作 V 再直接相乘。

精确算术中,非零奇异值的数量等于秩。对可逆方阵,κ2(A)=σmax/σmin;奇异方阵不可逆,通常记条件数为无穷大,不能删掉零奇异值后宣称条件数有限。只看非零方向得到的比值描述受限子空间,回答的是另一个问题。

4. 低秩近似与压缩 ​

将奇异值从大到小排列,只保留前 k 个:

Ak=UkΣkVkT.

Ak 是秩不超过 k 的近似。对二范数和 Frobenius 范数,它达到最佳低秩近似误差,但最优矩阵不一定唯一。直觉上,较大的奇异值对应矩阵中更强的变化模式,较小的奇异值对应较弱方向。

当 0≤k<min(m,n) 时,谱范数误差为 σk+1,Frobenius 误差平方为 ∑i>kσi2。这些保证针对无附加约束的矩阵近似;若还要求元素非负、稀疏或符合某种业务规则,就不是同一个优化问题了。

这能用于图像近似、潜在语义表示和推荐模型,但“较小”不自动等于“噪声”。少数群体或异常模式也可能落在能量较低的方向,压缩前仍需看任务含义。

5. PCA 与 SVD 的关系 ​

主成分分析寻找数据方差最大的正交方向。设数据矩阵 X 的每行是一个样本,第一步必须按列中心化:

Xc=X−1μT.

协方差矩阵与 XcTXc 成比例。对中心化数据做 SVD:

Xc=UΣVT,

V 的前几列就是主成分方向,奇异值平方与各方向解释的方差相关。

若样本数 N>1,样本协方差为 XcTXc/(N−1),对应方差为 σi2/(N−1)。解释方差比例是 σi2/∑jσj2;所有样本相同导致分母为零,此时没有非零方差可分配。

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
ratio = singular_values[0] ** 2 / np.sum(singular_values ** 2)
error = np.linalg.norm(X - reconstructed, "fro")
print(f"{ratio:.4%} {error:.6f}")  # 99.0588% 0.301962
print(np.isclose(error, singular_values[1]))  # True

若特征尺度差异很大,是否先标准化取决于问题:PCA 对尺度敏感,标准化会改变“方差最大”的含义。训练数据得到的均值、尺度和主成分必须固定后应用于新数据。

本例只保留一个方向,舍弃奇异值恰好给出重建的 Frobenius 误差。奇异向量整体换号不会改变重建;若奇异值相等,对应子空间内的方向还可以旋转。比较不同实现时应检查重建和子空间,不能只要求向量逐项同号。形状约定见 NumPy SVD 文档。

6. 该选哪一种工具 ​

问题常用工具关键提醒
满秩方阵线性系统LU、专用 solve不要显式求逆
超定方程与拟合QR、SVD、lstsq检查残差、秩与数据假设
对称矩阵的主要方向特征分解利用对称结构
任意矩阵的秩与低秩近似SVD关注条件数和截断损失
数据降维中心化后的 PCA/SVD缩放策略属于模型定义

常见误区 ​

  • PCA 会自动发现最重要的业务特征:它最大化方差,不知道业务目标。
  • 保留 95% 方差就保留了 95% 信息:这是任务相关性的启发式,不是普遍等价关系。
  • 特征值最大的方向总最稳定:稳定性还取决于矩阵性质、谱间隔和扰动。
  • SVD 只是理论分解:它是最小二乘、伪逆、降维和条件分析的核心数值工具。

练习 ​

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

小结 ​

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

Built with VitePress | Software Systems Atlas