本节属“补充篇 · 数值线性代数工具箱”:2.x 是补充篇内部编号,不是课堂第 2 章的节号。课堂第 2 章是线性方程组的解法。
本节把前面所有工具收拢到一个分解里。SVD 是现代数值线性代数的中心:它同时给出四个基本子空间的标准正交基(2.2)、2-范数与条件数(2.4)、对称谱理论向任意矩阵的推广(2.5)、低秩逼近的最优答案(2.6.5)、伪逆与秩亏最小二乘(2.6.4),也是 PCA、推荐系统、图像压缩的方法基础。线索是:SVD 怎样从对称矩阵的谱里长出来 → 两种几何读法 → 四个基本子空间、伪逆与数值秩、最优低秩逼近 → 压缩与 PCA 两个应用。一句话:如果只能带一件工具走,就带 SVD。
图解读图:SVD 把任意矩阵拆成旋转 → 沿坐标轴拉伸 → 再旋转:Vᵀ 转过去,Σ 把单位圆拉成椭圆,U 再转回来。奇异值就是椭圆半轴的长度;只保留最大的 k 个,就得到秩 k 的最优近似(Eckart–Young)。
直觉 · 从 ATA 里「偷」一个答案
对长方形矩阵 A(m=n)根本谈不上特征值——Av=λv 这个式子两头维数就对不上。但 ATA∈Rn×n 不一样:它既是方阵,又对称半正定,而它的谱理论(2.5.4)我们已经完全掌握。于是可以问:
ATA 的特征值都非负(≥0,所以能开方),它们能告诉我们 A 有多「大」吗?
能。λmax(ATA)=∥A∥22 这条公式 1.3.4 已经用过。现在把全部特征值都用上,再对 AT 做一次同样的分解,就得到 SVD。奇异值就是「把长方形矩阵变成对称方阵之后,特征值再开方」。
定理 2.6.1(新增) · 奇异值分解的存在性
设 A∈Rm×n(m,n 任意,m≥n 或 m<n 均可),则存在正交矩阵 U∈Rm×m、V∈Rn×n 与非负对角阵 Σ∈Rm×n,使
A=UΣVT,(2.29)
其中 Σ 的对角元 σ1≥σ2≥⋯≥σmin(m,n)≥0 称为 A 的奇异值(singular values)。
结构形式(m≥n 情形): 写成列向量形式
U=[U1u1,…,un, U0un+1,…,um],Σ=(Σ1O) (Σ1=diag(σ1,…,σn) 取前 n 个,列满秩时全部非零),V=[v1,…,vn],
则
AV=UΣ⟺Avi=σiui (i=1,…,n),ATui=σivi (i=1,…,n).
特别地,{vi} 是 ATA 的标准正交特征向量(特征值 σi2),{ui} 是 AAT 的标准正交特征向量(同样对应 σi2)。
证明
第一步:对称化。 ATA 对称半正定(xTATAx=∥Ax∥22≥0)。由谱定理(定理 2.5.1 第 5 条)存在正交矩阵 V 使
VT(ATA)V=Λ=diag(λ1,…,λn),λ1≥⋯≥λn≥0.
记 σi=λi。设前 r 个特征值为正,即 λ1,…,λr>0(r=rankA,因为 rank(ATA)=rankA,见 定理 2.2.6 的证明),λr+1=⋯=λn=0。
第二步:构造 U 的前 r 列。 令 vi 为 V 的第 i 列。对 i≤r,定义
ui=σiAvi∈Rm.
验证 {u1,…,ur} 标准正交:
uiTuj=σiσjviTATAvj=σiσjλjviTvj=σiσjλjδij=δij.
第三步:补全 U。 把标准正交组 {u1,…,ur} 扩充为 Rm 的标准正交基(Gram–Schmidt,2.3.1),得 U=[u1,…,um] 正交。则对 i≤r,Avi=σiui;而对 i>r,ATAvi=0 给出
∥Avi∥22=viTATAvi=0 ⟹ Avi=0=σiui.
于是对所有 i=1,…,n 都有 Avi=σiui,写成矩阵形式即 AV=UΣ,两边右乘 VT 得(2.29)。
关键观察:构造 U 的方式是「被动」的。 我们没有去解 AAT 的特征值问题,而是从 ATA 的特征向量 vi 出发,用 ui=Avi/σi 把 ui 顺手算出来。这比分别解两个特征值问题省事得多,数值上也更稳——ui 和 σi 都来自 ATA 的信息,不必另起炉灶。
∎
三种情形,一个公式
- 「瘦」SVD(经济型): 只保留非零的奇异值,以及 U、V 各自的前 r 列,得 A=UrΣrVrT(Ur 为 m×r、Σr 为 r×r、Vr 为 n×r,r=rankA——注意这里的下标 r 指秩,与上文结构形式里表示「前 n 列」的 U1,Σ1 是两套记号)。存储最省,工程上用的就是它。
- 「满」SVD: 如(2.29),U,V 都是方阵、正交。理论推导用它。
- 秩亏 / 长方形: 若 r<n,Σ 的对角元从 σr+1 起全为零;若 m<n,把 AT 的 SVD 转置就得到 A 的 SVD(A=UΣVT 依然成立,只是 Σ 变成「矮」的)。
例 2.6.1(新增) · 手算一个 SVD
求
A=(3405)
的 SVD(写出 σi、U、V,并验证)。
解
第 1 步:算 ATA。
ATA=(3045)(3405)=(25202025).
第 2 步:特征值。 det(ATA−λI)=(25−λ)2−400=0⇒λ=25±20,即 λ1=45, λ2=5。故
σ1=45=35≈6.7082,σ2=5≈2.2361.
第 3 步:特征向量(V)。 对 λ1=45:(25−45)v1+20v2=0⇒−20v1+20v2=0⇒v1=v2,归一化得 v1=21(1,1)T。对 λ2=5:(25−5)v1+20v2=0⇒20v1+20v2=0⇒v1=−v2,得 v2=21(1,−1)T。
V=21(111−1).
第 4 步:U 由公式 ui=Avi/σi 得到。
u1=σ1Av1=351⋅21(34+5)=3101(39)=101(13),
u2=σ2Av2=51⋅21(34−5)=101(3−1).
U=101(133−1).
验证:
UΣVT=101(133−1)(35005)21(111−1)=205(133−1)(313−1)=21(3+39−13−39+1)=(3405) ✓
顺带得到的量: ∥A∥2=σ1=6.7082;∥A∥F=σ12+σ22=45+5=50=7.0711(核对:9+0+16+25=50 ✓);cond2(A)=σ1/σ2=3;detA=3×5−0=15=σ1σ2=6.7082×2.2361 ✓(=15)。
外积形式(下面要用):
A=σ1u1v1T+σ2u2v2T=6.7082u1v1T+2.2361u2v2T.
截去第二项后,误差 ∥A−A1∥2=σ2=2.2361 恰好等于被丢掉的奇异值——见 定理 2.6.4。
∎
直觉 · 读法一:旋转 → 拉伸 → 旋转
A=UΣVT 不只是计算公式,还可以按从右到左的顺序「读」出来:
x VT 换坐标 Σ 沿坐标轴拉伸 U 再换坐标.
第一步和第三步都是正交变换,只旋转或镜像、不改变长度(2.1.3);只有中间的 Σ 在做真正的拉伸,而且只沿坐标轴拉,第 i 根轴的拉伸倍数正是 σi(取零就等于把这根轴压扁)。因此:
任何矩阵 = 一次旋转 + 一次沿轴拉伸 + 一次旋转。
这是矩阵最本质的几何图像,它立刻解释了两件事:① 单位球被 A 映成椭球,各个半轴长就是 σi(于是 ∥A∥2=σ1 就是最大拉伸);② 只要有某个 σi=0,就有一个方向被压扁到零——这正是 A 奇异、矩阵降秩的几何含义。
直觉 · 读法二:两组「配对」的正交方向
Avi=σiui 说明:输入方向 vi(V 的第 i 列)经过 A 之后,恰好落在输出方向 ui(U 的第 i 列)上,长度乘上 σi。于是 A 做的事就是「把 V 这组标准正交基映到 U 这组标准正交基,并逐轴缩放」。
这是 SVD 最有用的一种读法:它把矩阵拆成「一组输入方向 + 一组输出方向 + 一组缩放倍数」。只改缩放倍数 σi、方向全部保留,就得到最优低秩逼近(2.6.5)——这也是 SVD 在数据科学里全部用法(PCA、压缩、去噪、推荐)的共同原理。
图 2-1 · SVD 的几何:A 把单位球映成椭球,vi 方向被映射到 ui 方向并乘以 σi。σ1 是最大拉伸(∥A∥2),若某轴被压成零则矩阵奇异。
例 2.6.2(新增) · 用几何读法看一个「压扁」的矩阵
A=123246(一眼就能看出第 2 列 =2×第 1 列,秩 1)。求 SVD 并解释几何。
解
ATA=(122436)123246=(14282856)=14(1224)。
特征值:tr=70,det=142(4−4)=0,故 λ1=70, λ2=0。于是
σ1=70≈8.3666,σ2=0.
λ1=70 的特征向量:(14−70)v1+28v2=0⇒v1=v2/2 方向,v1=51(1,2)T(注意恰好是列方向);v2=51(2,−1)T。
u1=σ1Av1=701⋅511+42+83+12=701⋅55123=141123.
几何解释: σ2=0 意味着 v2 这个方向被 A 压扁到零,于是整个单位圆被映成一条线段(退化的一维椭球)。线段的方向是 u1=(1,2,3)T/14,长度 2σ1=16.7(直径)。
验证: rankA=1(恰有一个非零奇异值);detA 无从谈起(A 不是方阵),但 AAT 的秩也是 1 ✓。∥A∥2=8.3666,∥A∥F=70=8.3666(秩 1 时两者相等,因为 ∥A∥F2=∑σi2=σ12)。
数据含义: 这个矩阵的两列完全相关(第 2 列是第 1 列的 2 倍),所以它携带的信息本质上只有 1 维——SVD 只用一个非零奇异值就把这件事精确说了出来。「有效维度 = 非零奇异值的个数」,这就是 SVD 在数据分析里的核心读法。
∎
上一小节的两种读法告诉我们,vi 和 ui 是一对一对配好的方向。这些方向还有另一重身份:它们恰好就是四个基本子空间的标准正交基。SVD 一口气把这四组基全部交出来——这是它的「结构性回报」,其他任何分解都没有这么完整。
定理 2.6.2(新增) · SVD 与四个基本子空间
设 A∈Rm×n,rankA=r,SVD 为 A=UΣVT,σ1≥⋯≥σr>0=σr+1=⋯。则
| 子空间 |
维数 |
标准正交基 |
出处 |
| C(A)(列空间) |
r |
u1,…,ur |
U 的前 r 列 |
| N(AT)(左零空间) |
m−r |
ur+1,…,um |
U 的后 m−r 列 |
| C(AT)(行空间) |
r |
v1,…,vr |
V 的前 r 列 |
| N(A)(零空间) |
n−r |
vr+1,…,vn |
V 的后 n−r 列 |
且
∥A∥2=σ1,∥A∥F=σ12+⋯+σr2,cond2(A)=σrσ1 (可逆时).(2.30)
证明
列空间: 由 A=UΣVT 与 Σ 的结构,A 的列是 U 前 r 列的线性组合(系数来自 ΣrVT 的行),且 rankA=r,故 C(A)=span{u1,…,ur};这 r 个向量标准正交,故是标准正交基。
行空间: 同法对 AT=VΣTUT 得 C(AT)=span{v1,…,vr}。
零空间: Avi=σiui=0 对 i>r 成立,故 vr+1,…,vn∈N(A);又 dimN(A)=n−r(定理 2.2.1),故它们构成标准正交基。
左零空间: ATui=σivi=0(i>r),同法。
(2.30): ∥A∥2=σ1 由 定理 1.3.5 与 λmax(ATA)=σ12(课堂第 3 讲讲矩阵范数时把 2-范数留作自学——这一式就是那处留白的兑现);∥A∥F2=tr(ATA)=∑iλi(ATA)=∑iσi2;条件数由 定理 2.4.1 第 4 条。
这张表就是 2.2 节「四个基本子空间」问题的完整答案——而且它比手算行简化稳定得多(行简化在病态矩阵上会丢有效数字,SVD 不会)。实践判据:要四个基本子空间,用 SVD;只想知道秩,用列主元 QR 省点代价即可。
∎
例 2.6.3(新增) · 从 SVD 读出四个子空间
对例 2.2.1 的 A=121242363132(r=2)用 SVD 求出四个基本子空间的标准正交基,并与例 2.2.1 的手算结果对照。
解
import numpy as np
A = np.array([[1.,2,3,1],[2,4,6,3],[1,2,3,2]])
U, s, Vt = np.linalg.svd(A)
print("sigma =", np.round(s, 6))
print("rank =", (s > 1e-12*s[0]).sum())
sigma = [9.877729 0.656096 0. ]
rank = 2
完整数值(∥A∥F=98=9.8995 与 σ12+σ22=9.87772+0.65612=98 ✓,这一条是自检):
U=−0.3892−0.8162−0.4270−0.7178−0.02180.69590.5774−0.57740.5774,VT=−0.2479−0.0999−0.9634−0.0187−0.4958−0.19980.13210.8348−0.7437−0.29970.2331−0.5503−0.37380.927500.
(虚线以下为 VT 的后 n−r=2 行。)
四个基本子空间(标准正交基):
| 子空间 |
维数 |
SVD 给出的标准正交基 |
例 2.2.1 的手算基 |
| C(A) |
2 |
U 的前 2 列 |
(1,2,1)T, (1,3,2)T(不正交,需再正交化) |
| N(AT) |
1 |
U 第 3 列 =(0.5774,−0.5774,0.5774)T |
(1,−1,1)T——单位化后完全相同 ✓ |
| C(AT) |
2 |
V 的前 2 列 |
(1,2,3,0)T, (0,0,0,1)T |
| N(A) |
2 |
V 的后 2 列 |
(−2,1,0,0)T, (−3,0,1,0)T |
SVD 与手算给出的是同样的子空间(子空间本身唯一,这是必然的);差别只在基的选择:
- N(AT) 那一行完全吻合:U 的第 3 列恰好就是 (1,−1,1)T/3(一维子空间,两组基只差单位化)。
- 后两行不同:SVD 给出的基是标准正交的,而手算的 (−2,1,0,0) 与 (−3,0,1,0) 内积 =6=0(不正交);C(A) 那一行的手算基同理。
这正是 SVD 优于手算的实质: 它不仅告诉你「哪些向量张成子空间」,还直接把一组标准正交的坐标轴送到手上——可以直接拿来做投影(2.2.3)、判正交、算距离,不必再补一次 Gram–Schmidt。
顺带核对几个范数关系: ∥A∥2=σ1=9.8777(大于 ∥A∥F/2=7.0,因为 ∥A∥2 量的是最大拉伸、∥A∥F 量的是全部奇异值的平方和开方);∥A∥2≤∥A∥F ✓(1.3.4 的结论)。
∎
例 2.6.4(新增) · von Neumann 迹不等式
证明:对任意 A,B∈Rm×n(同形),
∣tr(ATB)∣≤i=1∑min(m,n)σi(A)σi(B).(2.31)
用途: 它是许多扰动界证明的起点(信号处理里的匹配滤波、矩阵近似理论都会用到它),而且很容易做数值验证。
证明(归约到「对称情形 + 奇异子空间的对齐」;完整推导见附录)
核心是三条工具链,全部细节在附录 A.2.3–A.2.4:
- 对称迹不等式(附录引理 A.3.3):对称阵 S,T 满足 tr(ST)≤∑iλi(S)λi(T)(特征值降序配对)。它由「特征基展开 ⟹ 系数方阵 (uiTvj)2 双随机 ⟹ Birkhoff 定理拆成置换的凸组合 ⟹ 逐个置换用标量重排不等式」四步组成;
- 对称化膨胀:把矩形问题化为对称问题——令 S=(OATAO)、T=(OBTBO),则 S,T 对称,S 的特征值恰为 ±σi(A),且 tr(ST)=2tr(ATB);
- 对 S,T 套用第 1 步(特征值降序逐项相乘,两块恰好各贡献一个 ∑σi(A)σi(B)),除以 2 即得(2.31);对 −B 再用一次得绝对值版本。
数值验证:
import numpy as np
rng = np.random.default_rng(3)
for m, n in [(5, 4), (4, 5)]:
A, B = rng.normal(size=(m, n)), rng.normal(size=(m, n))
lhs = abs(np.trace(A.T @ B))
rhs = np.linalg.svd(A, compute_uv=False) @ np.linalg.svd(B, compute_uv=False)
print(f"|tr(A^T B)| = {lhs:.6f} ≤ Σσ_i(A)σ_i(B) = {rhs:.6f}")
|tr(A^T B)| = 7.009041 ≤ Σσ_i(A)σ_i(B) = 26.317431
|tr(A^T B)| = 0.839841 ≤ Σσ_i(A)σ_i(B) = 19.541253
注意两者的差距很大(7.0 对 26.3):随机矩阵的 ∣tr(ATB)∣ 通常远小于这个上界,因为取等要求 A,B 的左右奇异子空间完全对齐(取等条件的讨论见附录 A.2.4)。特例 B=AT:tr(ATA)=∥A∥F2=∑σi2 恰好取等——(2.31)是紧界。
∎
直觉 · 伪逆 = 「能求逆的地方求逆,不能求逆的地方记零」
四个子空间把 A 的「结构」说清楚了;接下来该解方程了——A 不可逆时怎么办?若 A 奇异(或者根本就是长方形),A−1 就不存在。但在 SVD 给出的两组基下,A 做的事很简单:「沿 vi 方向乘 σi」——那么只要把非零的 σi 取倒数、把为零的 σi 还记为零,就得到一个「最接近逆」的矩阵:伪逆 A+。A+ 满足 Penrose 四条件,是唯一的最优「广义逆」。
对秩亏最小二乘,A+b 给出的是最小范数最小二乘解——在所有能最小化 ∥Ax−b∥ 的 x 中,它挑出「∥x∥ 最小」的那一个。这样一来,2.2.4 里「列满秩时最小二乘解才唯一」的结论就被补全了。
定义 2.6.1 · Moore–Penrose 伪逆
设 A=UΣVT∈Rm×n 的 SVD,Σ=diag(σ1,…,σr,0,…,0)。定义
Σ+=diag(σ11,…,σr1,0,…,0)∈Rn×m,A+=VΣ+UT∈Rn×m.(2.32)
称 A+ 为 A 的 Moore–Penrose 伪逆(pseudoinverse)。
定理 2.6.3(新增) · 伪逆的性质与秩亏最小二乘
A+ 由(2.32)定义,则
- Penrose 四条件: AA+A=A;A+AA+=A+;(AA+)T=AA+;(A+A)T=A+A。满足这四条的唯一矩阵就是 A+;
- 若 A 可逆,A+=A−1;
- AA+ 是到 C(A) 上的正交投影;A+A 是到 C(AT) 上的正交投影;
- 秩亏最小二乘: 对任意 b∈Rm,x^=A+b 是唯一的最小范数最小二乘解
x^=argmin{∥x∥2:x 最小化 ∥Ax−b∥2};
- 列满秩时 A+=(ATA)−1AT;行满秩时 A+=AT(AAT)−1。
证明(3 与 4 的要点)
(3): AA+=UΣIVTVΣ+UT=UΣΣ+UT=Udiag(1,…,1,0,…,0)UT——这是一个「保留 U 前 r 列、丢掉其余」的对角投影矩阵,对称、幂等,列空间 =C(Ur)=C(A),故由 定理 2.2.5(反之部分)它正是到 C(A) 的正交投影。同法可得 A+A=Vdiag(1,…,1,0,…,0)VT。
(4): 在 SVD 坐标下令 y=VTx、c=UTb,则 ∥Ax−b∥2=∥Σy−c∥2、∥x∥2=∥y∥2(这就是正交不变性),问题就此完全解耦成逐个分量:
(σiyi−ci)2(i=1,…,n).
- 若 σi>0(i≤r):取 yi=ci/σi 使该项为零(最优);
- 若 σi=0:该项为 ci2,与 yi 无关,最小范数要求取 yi=0;
- 若 i>n(m>n 时的多余行):不影响。
故最优解 y=Σ+c,即 x=VΣ+UTb=A+b,且在每个「自由」分量上都取了零(这正是最小范数条件)。
(1)的唯一性:满足 Penrose 四条件的矩阵唯一(标准事实,见 习题 B4)。
∎
例 2.6.5(新增) · 秩亏最小二乘的伪逆解
求
A=123246,b=111
的最小范数最小二乘解。
解
由例 2.6.2 已得 A 的 SVD:σ1=70、σ2=0,v1=51(1,2)T、v2=51(2,−1)T,u1=141(1,2,3)T。
伪逆(只用 σ1 一项):
A+=v1σ11u1T=51(12)⋅701⋅141(123)=49001(122436)=701(122436)=701AT.
(秩 1 矩阵的伪逆就是转置除以 ∥A∥F2=70。)
x^=A+b=701(122436)111=701(612)=(0.08570.1714).
核对正交条件 ATr=0: Ax^=3531+42+83+12=353(5,10,15)T=73(1,2,3)T=(0.4286,0.8571,1.2857)T,故
r=b−Ax^=(0.5714, 0.1429, −0.2857)T,ATr=(0.5714+0.2857−0.85711.1429+0.5714−1.7143)=(00) ✓
残差平方和 =∥r∥22=0.4286=3/7。
验证「最小范数」: 正态方程 ATAx=ATb 是
(14282856)x=(612) ⟺ x1+2x2=73,
一条直线——最小二乘解不唯一。取此直线上的另一点 x2=0⇒x1=3/7,得 x′=(3/7,0)T:残差同样是 3/7(同为最小二乘解),但 ∥x′∥2=0.4286>∥x^∥2=0.1917。伪逆给出的是这条直线上离原点最近的点 ✓(x^ 沿 (1,2) 方向,正是直线的法方向)。
这个例子重要在哪里: A 的列相关(第 2 列 =2×第 1 列),最小二乘解因此成为一条直线。np.linalg.lstsq 与 np.linalg.pinv 默认返回这条直线上最小范数的那一点;而直接消元解正态方程,得到的是直线上任意一点(取到哪一点取决于主元选择)——这就是伪逆与正态方程在秩亏问题上的本质区别。
∎
思考 · 伪逆的截断参数:数值秩的判定
真实数据里没有「精确为零的奇异值」,只有「相对很小的奇异值」。np.linalg.pinv(A, rcond=t) 会把满足 σi≤t⋅σ1 的奇异值直接当作零。t 该怎么选? 常用准则有三条:
- 机器精度准则: t=max(m,n)⋅u(LAPACK 默认 u 的若干倍)。适合矩阵本身精确、只是数值上降秩的情形。
- 噪声水平准则: 若数据带噪声(真实场景大多如此),t≈ 噪声幅度 /σ1。这才是实践中更常见的情形:低于噪声水平的那些奇异值,对应的方向携带的只是噪声,不该被放大——截断伪逆做的就是「去掉噪声子空间」,这是正则化的雏形。
- 能量准则: 保留前 k 个使 ∑i≤kσi2/∑iσi2≥99% 的奇异值(工程常用)。
注意:不截断的伪逆可能给出荒谬的结果。 若最小的非零奇异值 σr 相对 σ1 很小,1/σr 就会把 b 中对应方向的分量放大 σ1/σr=cond(A) 倍——和直接求逆一样危险。这就是非截断不可的原因,也是 Tikhonov 正则化(习题 D2)的动机。
直觉 · SVD 按「重要性」排序,砍掉尾巴就是最优删减
读法二已经预告过:保留方向、只改缩放倍数,就能得到最优低秩逼近。这一小节把这句话变成一条定理,先看外积和:
A=i=1∑rσiuiviT.
每一项 σiuiviT 都是一个秩 1 矩阵,贡献大小由 σi 度量。于是要找「秩 k 的最佳逼近」,最自然的做法就是保留最大的 k 项、砍掉其余的。Eckart–Young 定理断言:这个自然做法恰好就是最优的——不存在别的秩 k 矩阵比它更接近 A;而且误差精确等于被砍掉的第一个奇异值。
这就是 SVD 在数据科学里占据统治地位的理论根据:凡是「用低维结构近似高维数据」的任务(压缩、去噪、降维、推荐),最优答案都是截断 SVD。
定理 2.6.4(新增) · Eckart–Young–Mirsky 定理
设 A∈Rm×n 的 SVD 为 A=UΣVT,rankA=r。对 k<r 记
Ak=i=1∑kσiuiviT(2.33)
(A 的秩 k 截断 SVD),则
rankB≤kmin∥A−B∥2=∥A−Ak∥2=σk+1,(2.34)
rankB≤kmin∥A−B∥F=∥A−Ak∥F=σk+12+⋯+σr2.(2.35)
即 Ak 是 A 在 ∥⋅∥2 与 ∥⋅∥F 意义下的最佳秩 k 逼近。
证明(∥⋅∥2 情形,用 Courant–Fischer)
先证上界 ∥A−Ak∥2=σk+1。 A−Ak=∑i>kσiuiviT 是「把后 r−k 项留下来」的形式,它的奇异值就是 σk+1,…,σr(后面补零),故 ∥A−Ak∥2=σk+1。
再证下界(任何秩 ≤k 的 B 都不可能更好)。 设 rankB≤k,则 dimN(B)≥n−k(定理 2.2.1)。考虑
S=span{v1,…,vk+1},dimS=k+1.
由维数公式 dim(S∩N(B))≥(k+1)+(n−k)−n=1,故存在单位向量 x∈S∩N(B)。写 x=∑i≤k+1civi。则 Bx=0,故
∥A−B∥22≥∥(A−B)x∥22=∥Ax∥22=i≤k+1∑σiciui22=i≤k+1∑σi2ci2 ≥ σk+12i≤k+1∑ci2=σk+12.
(最后一步用了 σi≥σk+1(i≤k+1),以及 ∥x∥22=∑ci2=1。)故 ∥A−B∥2≥σk+1。上下界合起来即得(2.34)。
Frobenius 情形((2.35))的证法走另一条路(对称化膨胀 + Hoffman–Wielandt 不等式),见 习题 B6 与附录 A.2.5。
这个证明值得记住: 只用一次「维数计数」,加上一个 Courant–Fischer 型的二次型估计,就把「最优低秩逼近」这件看起来非用优化理论不可的事彻底解决了。这是线性代数结构力量的又一次展示。
∎
例 2.6.6(新增) · 低秩逼近的误差恰好等于下一个奇异值
构造一个奇异值指数衰减的 60×40 矩阵,对 k=1,2,3,5,8,10 计算 ∥A−Ak∥2、∥A−Ak∥F,与理论值对照。
解
import numpy as np
rng = np.random.default_rng(0); m, n = 60, 40
# 先随机取正交基,再指定奇异值(指数衰减)——精确控制谱
U_, _, Vt_ = np.linalg.svd(rng.normal(size=(m, n)), full_matrices=False)
dec = np.exp(-np.arange(n) / 2.5)
A = (U_ * dec) @ Vt_ # 奇异值 = dec
U, S, Vt = np.linalg.svd(A)
for k in [1, 2, 3, 5, 8, 10]:
Ak = (U[:, :k] * S[:k]) @ Vt[:k]
e2 = np.linalg.norm(A - Ak, 2); eF = np.linalg.norm(A - Ak, 'fro')
print(f"k={k:2d} ||A-Ak||_2={e2:.6e} (=σ{k+1}={S[k]:.6e}) "
f"||A-Ak||_F={eF:.6e} (=√Σσ²={np.sqrt((S[k:]**2).sum()):.6e}) "
f"能量={((S[:k]2).sum()/(S2).sum()):.4%}")
k= 1 ||A-Ak||_2=6.703200e-01 (=σ2=6.703200e-01) ||A-Ak||_F=9.033085e-01 (=√Σσ²=9.033085e-01) 能量=55.07%
k= 2 ||A-Ak||_2=4.493290e-01 (=σ3=4.493290e-01) ||A-Ak||_F=6.055058e-01 (=√Σσ²=6.055058e-01) 能量=79.81%
k= 3 ||A-Ak||_2=3.011942e-01 (=σ4=3.011942e-01) ||A-Ak||_F=4.058827e-01 (=√Σσ²=4.058827e-01) 能量=90.93%
k= 5 ||A-Ak||_2=1.353353e-01 (=σ6=1.353353e-01) ||A-Ak||_F=1.823748e-01 (=√Σσ²=1.823748e-01) 能量=98.17%
k= 8 ||A-Ak||_2=4.076220e-02 (=σ9=4.076220e-02) ||A-Ak||_F=5.493025e-02 (=√Σσ²=5.493025e-02) 能量=99.83%
k=10 ||A-Ak||_2=1.831564e-02 (=σ11=1.831564e-02) ||A-Ak||_F=2.468175e-02 (=√Σσ²=2.468175e-02) 能量=99.97%
每行的两个等号都精确成立到机器精度——这是 定理 2.6.4 最直接的验证。再看能量列: 只用 k=3 个奇异值就抓住了 90.9% 的能量,k=8 就有 99.8%——这正是「低秩结构」的定量含义:少数几个奇异值就主导了整个矩阵。
# 用随机秩 k 矩阵「挑战」最优性:误差必然不小于 σ_{k+1}
for k in [3, 5]:
best = np.inf
for _ in range(200):
B = rng.normal(size=(m, n)) @ rng.normal(size=(n, n)) # 一般满秩
Bk = (lambda u, s, vt: (u[:, :k] * s[:k]) @ vt[:k])(*np.linalg.svd(B, full_matrices=False))
best = min(best, np.linalg.norm(A - Bk, 2))
print(f"k={k}: 200 个随机秩 {k} 阵的最小误差 = {best:.6e} ≥ σ{k+1} = {S[k]:.6e}")
结论: 随机秩 k 矩阵的误差都严格大于(通常是远大于)σk+1,从没有更小的——Eckart–Young 保证 Ak 的误差最小。
∎
应用一 · 图像与矩阵的低秩压缩
Eckart–Young 说截断 SVD 是最优的,那么它到底怎么用?先看最直观的一类:压缩。
Ak 的存储代价是 k(m+n) 个数(k 个 σi + U 的 k 列 + V 的 k 列),而原矩阵需要 mn 个数。压缩比
mnk(m+n).
本章实测(合成图像,120×120,包含几个二维正弦叠加与一条亮带):
| k |
存储占比 2k/120 |
∥E∥F/∥A∥F |
RMSE |
PSNR |
| 1 |
1.7% |
0.7243 |
0.6642 |
17.3 dB |
| 2 |
3.3% |
0.3182 |
0.2917 |
24.4 dB |
| 3 |
5.0% |
0.2336 |
0.2142 |
27.1 dB |
| 5 |
8.3% |
0.1938 |
0.1777 |
28.7 dB |
| 8 |
13.3% |
0.1122 |
0.1029 |
33.5 dB |
| 12 |
20.0% |
0.0152 |
0.0140 |
50.8 dB |
读表: 只花 20% 的存储就达到 50.8 dB(肉眼几乎看不出差别),用 13% 达到 33.5 dB(一般图像压缩的水平)。注意 k=3→5 的收益很小(27.1→28.7),因为 σ4,σ5 彼此接近(表里 σ4–σ7≈10.1 三个近似相等——图像中那条亮带是低秩的,只贡献少数几个奇异值);k=8→12 收益巨大(33.5→50.8),因为这里跨过了一段奇异值陡降区。这条「奇异值谱的形状」,就是「这张图能压到什么程度」的答案。
应用二 · PCA(主成分分析)
第二个应用面向数据分析。给定数据中心化后的数据矩阵 X∈Rn×d(n 个样本、d 个特征,每列均值为零),PCA 要做的事很直接:把样本投影到「方差最大的几个方向」上。步骤只有四步:
- 算协方差矩阵 C=n−11XTX(对称半正定);
- 对 X 做 SVD:X=UΣVT;
- 主方向 = V 的列(即 C 的特征向量);主成分方差 = σi2/(n−1)(C 的特征值);
- 取前 k 列降维:z=VkTx∈Rk,方差解释比 =∑i≤kσi2/∑iσi2。
为什么用 SVD,而不直接对 C 做特征值分解? 因为 cond(XTX)=cond(X)2:对协方差矩阵做特征值分解,等于把条件数平方(2.4.4 已经讲过的老问题)。SVD 直接在 X 上算,误差只经过 cond(X) 一次。这正是「正态方程 vs QR」之争在统计领域的翻版。
本章实测(400 个二维样本,真实协方差 (3222),其理论特征值 4.5616/0.4384): 样本协方差 (3.05042.08622.08622.0822),其特征值 4.7080/0.4247(采样波动,与理论值同量级);主方向 ≈(−0.783,−0.622)(对应 3 号种子下的样本方向),第一主成分解释 91.7% 的方差。
最后核对两条路径的关系:SVD 与特征值分解给出完全一致的结果:σi(Xc)=(n−1)λi(C)(实测 43.3414/13.0172 与 399×4.7080=43.34、399×0.4247=13.02 ✓)。详见 2.7 实验三。
思考 · 低秩逼近的三种「正则化」用法
同一个「截断奇异值」操作,在不同场景有不同的名字:
- 压缩: 保留前 k 个奇异值 → 用少量参数重建矩阵(图像、视频、模型权重)。
- 去噪: 数据 = 低秩信号 + 小噪声。若噪声幅度 ≪σk,则 Ak 恰好是信号的估计。截断点选在「奇异值谱的拐点」。
- 正则化 / 求解病态问题: 截断伪逆 Ak+=∑i≤kviuiT/σi 直接把「小奇异值方向被放大」这个病根砍掉。这是 Tikhonov 正则化的一种(硬阈值版本)。
三者的共同点:都由奇异值的大小决定信谁、不信谁。 这就是 SVD 成为数据科学核心工具的深层原因——它提供了一个有原则的「取舍」框架。
本节公式速查
| 概念 |
公式 / 结论 |
| SVD |
A=UΣVT,U,V 正交,σ1≥⋯≥σr>0 |
| 与特征值的关系 |
Avi=σiui;ATAvi=σi2vi;AATui=σi2ui |
| 外积形式 |
A=∑i≤rσiuiviT |
| 四个子空间 |
C(A)= span{u1..ur};N(AT)= span{ur+1..um};C(AT)= span{v1..vr};N(A)= span{vr+1..vn} |
| 范数与条件数 |
∥A∥2=σ1;∥A∥F=∑σi2;cond2=σ1/σr;∣detA∣=∏σi(方阵) |
| 伪逆 |
A+=VΣ+UT;Penrose 四条件;秩亏最小二乘的最小范数解 |
| 列/行满秩简化 |
列满秩:A+=(ATA)−1AT;行满秩:A+=AT(AAT)−1 |
| Eckart–Young |
minrankB≤k∥A−B∥2=σk+1;Ak=∑i≤kσiuiviT |
| 迹不等式 |
∣tr(ATB)∣≤∑σi(A)σi(B) |
| 数值秩 |
#{i:σi>tσ1},阈值 t 需按数据噪声水平选定 |
常见错误清单 · 自查七条
- 把奇异值当特征值。 σi(A)=∣λi(A)∣ 一般不成立(只有对称 / 正规矩阵才有 σi=∣λi∣)。反例:A=(0010) 的 λi=0 而 σ1=1。奇异值总非负、总有 min(m,n) 个;特征值可负可复。
- 对 ATA 做特征值分解来「算 SVD」。 数学上可行,但 cond(ATA)=cond(A)2——要白白丢掉一半有效数字。实现里永远用
np.linalg.svd(A)(Golub–Kahan 双对角化,直接作用在 A 上),不要用 eigh(A.T@A)。
- 不截断伪逆就算病态问题。 未截断的 A+ 会把 1/σmin 放大 cond(A) 倍(定理 2.6.3),与直接求逆一样危险。必须设
rcond,或者用 Tikhonov / 截断 SVD。
- 把
np.linalg.matrix_rank 的默认阈值当真理。 这个函数的默认阈值是 max(m,n)⋅eps⋅σ1,只适合「精确矩阵数值降秩」;真实带噪数据的秩判定必须按噪声水平设阈值(2.6.4 的思考题)。
- 以为 SVD 唯一。 A=UΣVT 中,若某个奇异值有重数(或为零),U,V 的对应列可任意旋转——唯一的只有奇异值(及其重数)。比较两个 SVD 前要理解这一点(类似 QR 的符号不确定,但更强)。
- 在数据中心化之前做 PCA。 PCA 的「方差最大方向」依赖均值已扣除;不中心化就做 SVD,第一主方向会指向均值方向——这是初学者最常见的错误(这时所谓的「解释方差」根本不是方差)。
- 以为 Ak 是唯一的秩 k 最优逼近。 Eckart–Young 保证 Ak 的误差最小;当 σk=σk+1 时,最优的矩阵本身不唯一(可取 k 维奇异子空间内的任意正交基组合)。而最优误差总是 ∥A−Ak∥2=σk+1(2.6.4)。
课程预告 · 本节之后
- SVD 的计算算法:Golub–Kahan 双对角化 + QR 迭代,复杂度 O(mnmin(m,n))——原书第 3 章 3.3(QR 方法)是其基础;实践用 LAPACK
gesdd(np.linalg.svd 默认);
- 秩亏最小二乘与正则化:原书第 2 章 2.3.2「关于病态线性方程组的求解问题」与 Tikhonov 正则化;
- PCA / 潜在语义分析 / 推荐系统:数据科学的应用层,数学内核就是本节;
- 本章的 SVD 与第一章的条件数在此汇合:cond2(A)=σ1/σr(2.6.3),「离奇异有多远」有了精确答案。