4. 奇异值分解的数学定义
奇异值分解(Singular Value Decomposition,SVD)是线性代数中最具结构美感也最具工程价值的分解之一。对任意实矩阵 A ∈ ℝm×n,SVD 断言存在正交矩阵 U ∈ ℝm×m、V ∈ ℝn×n 以及一个"对角"矩阵 Σ ∈ ℝm×n,使得
A = U Σ Vᵀ
其中 Σ 的非对角元全为零,对角元 σ₁ ≥ σ₂ ≥ … ≥ σr > 0(r = rank(A)),其余对角元为零。U 的列称为左奇异向量,V 的列称为右奇异向量,σi 称为奇异值。这个定义看似简单,但它同时回答了三个问题:这样的分解为什么一定存在?它在几何上做了什么?分解结果在什么意义下是唯一的?
构造性证明:从 AᵀA 出发
SVD 的存在性证明本身就是一种可操作的构造方法,理解它有助于我们在数值实现中判断算法行为。核心思路是把 SVD 转化为对称矩阵的特征分解。
考虑矩阵 AᵀA ∈ ℝn×n。它是对称半正定矩阵,因此必可正交对角化:存在正交矩阵 V 和对角矩阵 Λ = diag(λ₁,…,λn),λ₁ ≥ … ≥ λn ≥ 0,使得
AᵀA = V Λ Vᵀ
令 σi = √λi,并设 r 为非零奇异值的个数。对 i = 1,…,r,定义右奇异向量 vi 为 V 的第 i 列,再定义左奇异向量
u_i = (1/σ_i) · A v_i
可以验证这些 ui 两两正交且单位化:⟨ui, uj⟩ = (1/(σiσj)) viᵀAᵀA vj = (λj/(σiσj)) δij = δij。把它们扩充为 ℝm 的一组标准正交基,就得到完整的 U。于是对任意 vi,有 A vi = σi ui,对零空间中的向量有 A vi = 0。由于 {vi} 构成 ℝn 的基,A = U Σ Vᵀ 成立。
这个构造揭示了一个重要事实:奇异值是 AᵀA 特征值的算术平方根,右奇异向量是 AᵀA 的特征向量。工程上直接对 AᵀA 做特征分解会平方条件数(cond(AᵀA) = cond(A)²),因此实际数值库(如 LAPACK 的 dgesvd)采用双对角化加隐式 QR 迭代,避免显式形成 AᵀA。但构造性证明给出的对应关系,是理解 SVD 与特征分解关系的钥匙。
几何解释:旋转—拉伸—旋转
把 A 看作从 ℝn 到 ℝm 的线性映射,SVD 的几何含义极为清晰:任何线性映射都可以分解为"旋转/反射 → 沿坐标轴拉伸 → 旋转/反射"三步。Vᵀ 先把输入空间的标准正交基旋转到右奇异向量方向;Σ 在这些方向上分别乘以 σi 进行拉伸(σi = 0 的方向被压扁到零);U 再把结果旋转到输出空间。
由此可得一个经典结论:单位球在 A 下的像是一个椭球,其半轴长度恰为奇异值 σi,半轴方向为左奇异向量 ui。最大奇异值 σ₁ 就是 A 的谱范数 ‖A‖₂,即单位球被拉伸的最大倍数;最小奇异值(当 m = n 且满秩时)的倒数则是逆映射的最大拉伸,因此 cond₂(A) = σ₁/σn。下图以 2×2 矩阵为例展示这一几何过程。
图中四个阶段对应 A = U Σ Vᵀ 从右到左的作用顺序:先 Vᵀ 旋转,再 Σ 拉伸,最后 U 旋转。注意拉伸阶段 σ₂ 明显小于 σ₁,说明该映射在 v₂ 方向上"压缩"更多;若 σ₂ = 0,椭圆退化为线段,矩阵降秩。
唯一性:哪些量是确定的
SVD 的唯一性需要分层次讨论,这一点在工程中常被误解。严格来说,奇异值集合是唯一确定的:它们由 AᵀA 的特征值唯一决定,与分解方式无关。但奇异向量并不唯一,原因有三类:
- 符号自由度:若 (ui, vi) 是一对奇异向量,则 (−ui, −vi) 同样满足 A vi = σi ui,分解不变。
- 重奇异值:当 σi = σj 时,对应奇异向量张成的子空间内可任意正交旋转,仍得到合法 SVD。
- 零空间与左零空间:σi = 0 对应的右奇异向量(A 的零空间)和左奇异向量(Aᵀ 的零空间)只需取标准正交基,选择不唯一。
因此工程上更准确的说法是:奇异值唯一,奇异子空间在重根情形下唯一到正交变换,奇异向量在符号和重根旋转下不唯一。这解释了一个常见现象:不同软件(NumPy、MATLAB、LAPACK)对同一矩阵做 SVD,奇异值完全一致,但奇异向量的符号可能相反。做算法对比或复现实验时,不应直接逐元素比较 U、V,而应比较奇异值、子空间投影或 |UᵀU'| 的绝对值。
一个可手算的示例
取 A = [[3, 0], [0, −2]]。计算 AᵀA = diag(9, 4),特征值 9、4,故 σ₁ = 3,σ₂ = 2。右奇异向量取 v₁ = (1,0)ᵀ、v₂ = (0,1)ᵀ。由 ui = A vi/σi 得 u₁ = (1,0)ᵀ,u₂ = (0,−1)ᵀ。于是
A = [[1,0],[0,-1]] · [[3,0],[0,2]] · [[1,0],[0,1]]ᵀ
验证:U Σ Vᵀ = [[1,0],[0,−1]]·[[3,0],[0,2]] = [[3,0],[0,−2]] = A。这个例子清楚展示了符号自由度:若取 v₂ = (0,−1)ᵀ,则 u₂ = (0,1)ᵀ,分解同样成立。它也说明奇异值恒为非负,而原矩阵的负元素被"吸收"进了左奇异向量的符号中。