6 · 奇异值分解 SVD 与降维
本节是整个线性代数的集大成。SVD 把特征值思想推广到任意矩阵,是降维、压缩、推荐背后的核心。
本节是整个线性代数的「集大成」。SVD 被誉为线性代数最实用的定理,几乎所有降维、压缩、推荐背后都是它。
一、从特征值到奇异值
特征值只能用于方阵。但现实数据很少是方的:用户×电影评分表、词×文档矩阵、图像像素阵都是长方形。奇异值分解(SVD)把特征值的思想推广到任意 矩阵。
二、定义
任意矩阵 都可分解为:
- (右奇异向量):输入空间里一组正交方向。
- (左奇异向量):输出空间里一组正交方向。
- :对角阵,对角元 是奇异值。
几何直觉:任何线性变换都可拆成三步——先旋转()→ 沿各轴缩放()→ 再旋转()。奇异值就是中间那步「每个方向拉多长」,它们按重要性从大到小排好。
三、低秩近似:为什么 SVD 这么有用
把 写成秩一块的加权和:
奇异值越大的项贡献越多。只保留前 k 大项,就得到原矩阵的最佳低秩近似(Eckart–Young 定理:在所有秩 k 矩阵中,截断 SVD 误差最小)。这就是「最优压缩」的数学保证。
与 PCA 的关系:对中心化后的数据矩阵做 SVD,右奇异向量就是主成分方向,奇异值平方正比于方差。PCA 本质上就是 SVD。
四、跨领域应用
AI —— 降维与压缩:把 1000 维特征压到 50 维而保留绝大部分信息;图像、模型权重的低秩压缩都靠它。大模型微调的 LoRA(低秩适配)就是把权重更新限制为一个低秩矩阵 ,大幅减少参数,背后正是低秩近似思想。
AI / 推荐系统 —— 矩阵补全:用户×商品评分表大部分是空的。假设它是低秩的(偏好由少数隐因子决定),用 SVD/矩阵分解填补空位,就能预测评分——Netflix 推荐算法的经典思路。
区块链 —— 数据可用性与纠删码:在有限域上,纠删码(Reed–Solomon)用线性编码加冗余,使得丢失部分数据仍可恢复;思路与「用低维结构表达高维数据」一脉相承。以太坊 Danksharding 的数据可用性采样正是靠这种线性结构让轻节点只抽查少量样本就能高概率确信数据完整。
五、全章收尾:一张图串起所有概念
数据先成为向量(第1节)→ 用矩阵/线性变换加工(第2节)→ 需要求解时靠方程组与逆(第3节)→ 衡量相似与近似靠内积与投影(第4节)→ 找变换的主方向靠特征值(第5节)→ 最优压缩一切靠SVD(本节)。
掌握这条主线,你看神经网络、零知识证明、纠删码、推荐系统时,就能认出同一套语言。
六、小结
| 概念 | 一句话理解 | 典型应用 |
|---|---|---|
| SVD | 任意矩阵 = 旋转×缩放×旋转 | 通用分解 |
| 奇异值 | 各方向的重要性 | 排序、取舍 |
| 低秩近似 | 保留大项即最优压缩 | 降维、LoRA、推荐 |
| PCA=SVD | 主成分就是右奇异向量 | 特征提取 |
七、进阶:伪逆与条件数
伪逆(Pseudoinverse,Moore–Penrose):非方阵或不可逆矩阵没有真正的逆,但可用 SVD 造一个「最佳替代」:
其中 把非零奇异值取倒数。最小二乘解可一步写成 ——这就是回归、超定方程的统一解法。
条件数(Condition Number):最大奇异值与最小奇异值之比 。它衡量「输入的微小扰动会被放大多少倍」。 很大(病态矩阵)意味着求解对噪声极敏感,结果不可靠。这是数值稳定性的核心指标(详见第 10 节)。
八、数字例题(步步算)
对
直接读出 SVD。
它已是对角且元素非负,所以 ,奇异值 。条件数 (良态)。
若秩-1 近似只保留 :
,丢掉了第二个方向的信息,误差正好等于被丢弃的 。
九、NumPy 代码
import numpy as np
A = np.array([[3.0, 0.0], [0.0, 1.0]])
U, S, Vt = np.linalg.svd(A)
print("奇异值 =", S) # [3. 1.]
print("条件数 =", S[0]/S[-1]) # 3
print("伪逆 =\n", np.linalg.pinv(A))
# 低秩近似:保留前 k 个奇异值
def low_rank(M, k):
U, S, Vt = np.linalg.svd(M, full_matrices=False)
return U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
M = np.random.randn(50, 30)
for k in [1, 5, 30]:
err = np.linalg.norm(M - low_rank(M, k))
print(f"保留 {k} 个奇异值,重构误差 = {err:.2f}")
# LoRA 思想:用两个瘦矩阵的乘积近似权重更新
r = 4 # 低秩
B = np.random.randn(50, r); Aa = np.random.randn(r, 30)
delta_W = B @ Aa # 只需 (50+30)*4 个参数,而非 50*30
print("LoRA 参数量", B.size + Aa.size, "vs 全量", 50*30)
十、动手算一算
- 一张 1000×1000 灰度图,保留前 50 个奇异值,存储量从多少降到多少?压缩比约几倍?
- 为什么 PCA 等价于对中心化数据做 SVD?
- LoRA 把秩限制为 r,参数量从 降到多少?
答案:(1) 原始 个数;低秩近似存 ,压缩约 10 倍。(2) 数据矩阵的右奇异向量正是协方差矩阵的特征向量,奇异值平方正比于方差,所以二者等价。(3) 从 降到 (两个 矩阵), 时大幅缩减。