10.3 最小二乘、特征分解与 SVD:从精确解到最佳近似
真实观测通常无法同时满足一个精确线性方程。上千次请求提供的负载与延迟记录,可能要由几十个特征近似解释;方程数量远多于未知数。线性代数把“不可能全对”转化为一个可度量的最佳近似问题。
本课目标
- 从投影理解最小二乘;
- 解释特征值和特征向量表达的不变方向;
- 理解奇异值分解适用于任意矩阵;
- 说清 PCA 的中心化、降维和信息损失边界。
1. 最小二乘:让残差尽可能小
当
残差
得到正规方程:
几何上,
投影 lstsq 在多个最优解中返回二范数最小者;最小二乘也适用于有精确解的系统。
对满列秩 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(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. 特征向量:变换中的不变方向
对方阵
则
特征值可用于理解:
- 线性动态系统在不同方向上的增长或衰减;
- 图的邻接矩阵、拉普拉斯矩阵所编码的结构;
- 对称协方差矩阵的主要变化方向。
并非所有矩阵都能在实数域中找到一组完整的特征向量。矩阵也可能有复特征值,或因缺少足够多的线性无关特征向量而不能对角化。因此“求特征分解”不是任意矩阵都能无条件完成的步骤。
例如二维旋转 90° 在实数域没有特征向量,而矩阵 [[1,1],[0,1]] 只有一维特征空间,不能对角化。实对称矩阵则保证可用正交特征向量对角化,数值库可选专门的 eigh。重复特征值对应的基可能不唯一。
3. SVD:任意矩阵的方向与强度
任意实矩阵
的列给出输入空间中的正交方向; 的非负对角元素是奇异值,描述各方向的缩放强度; 的列给出输出空间中的正交方向。
可以把变换理解成三步:先按
完整 SVD 中 Vh,对实矩阵 Vh=V.T,不能把它当作 V 再直接相乘。
精确算术中,非零奇异值的数量等于秩。对可逆方阵,
4. 低秩近似与压缩
将奇异值从大到小排列,只保留前
当
这能用于图像近似、潜在语义表示和推荐模型,但“较小”不自动等于“噪声”。少数群体或异常模式也可能落在能量较低的方向,压缩前仍需看任务含义。
5. PCA 与 SVD 的关系
主成分分析寻找数据方差最大的正交方向。设数据矩阵
协方差矩阵与
若样本数
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 只是理论分解:它是最小二乘、伪逆、降维和条件分析的核心数值工具。
练习
- 解释最小二乘残差为何与列空间正交。
- 对对角矩阵
diag(4, 1)写出特征值和特征向量,并描述几何变换。 - 用 SVD 将一幅灰度矩阵近似为秩 1,比较重建误差。
- 对同一数据分别执行“只中心化”和“标准化后中心化”的 PCA,解释主方向为何变化。
小结
下一章从静态变换走向连续变化:函数在一点附近怎样变化,许多局部变化又怎样累积成整体。