矩阵奇异值分解算法(SVD)详解
1. 定义(Definition)
给定任意实矩阵 A∈Rm×nA\in\mathbb{R}^{m\times n}A∈Rm×n,它的**奇异值分解(SVD)**是
A=UΣV⊤, A = U\Sigma V^{\top}, A=UΣV⊤,
其中
-
U∈Rm×mU\in\mathbb{R}^{m\times m}U∈Rm×m 是正交矩阵(列为 mmm 个正交单位向量),U⊤U=ImU^\top U=I_mU⊤U=Im;
-
V∈Rn×nV\in\mathbb{R}^{n\times n}V∈Rn×n 是正交矩阵,V⊤V=InV^\top V=I_nV⊤V=In;
-
Σ∈Rm×n\Sigma\in\mathbb{R}^{m\times n}Σ∈Rm×n 是对角(严格说是对角块)矩阵,形如
Σ=[diag(σ1,…,σr)000], \Sigma=\begin{bmatrix}\operatorname{diag}(\sigma_1,\dots,\sigma_r)&0\\[2pt]0&0\end{bmatrix}, Σ=[diag(σ1,…,σr)000],
其中 σ1≥σ2≥⋯≥σr>0\sigma_1\ge\sigma_2\ge\cdots\ge\sigma_r>0σ1≥σ2≥⋯≥σr>0 为 奇异值,r=rank(A)r=\operatorname{rank}(A)r=rank(A)。通常写成 A=UrΣrVr⊤A=U_r\Sigma_r V_r^\topA=UrΣrVr⊤ 为紧致形式(只取非零奇异值对应列)。
奇异值都是非负实数;对复矩阵类似,只需将正交换为酉矩阵。
2. 存在性与构造(与 A⊤AA^\top AA⊤A 的关系)
SVD 的存在性来自对称正定矩阵的谱分解(谱定理):
- 计算 A⊤A∈Rn×nA^\top A\in\mathbb{R}^{n\times n}A⊤A∈Rn×n,它是对称半正定矩阵。
- 对 A⊤AA^\top AA⊤A 做特征分解:A⊤A=VΛV⊤A^\top A = V\Lambda V^\topA⊤A=VΛV⊤,其中 Λ=diag(λ1,…,λn)\Lambda=\operatorname{diag}(\lambda_1,\dots,\lambda_n)Λ=diag(λ1,…,λn),λi≥0\lambda_i\ge0λi≥0,且 VVV 正交。
- 令奇异值为 σi=λi\sigma_i=\sqrt{\lambda_i}σi=λi。将非零奇异值前 rrr 个挑出来,构成 Σr\Sigma_rΣr 与 VrV_rVr。
- 定义 Ur=AVrΣr−1U_r = A V_r \Sigma_r^{-1}Ur=AVrΣr−1。可以验证这些列是正交单位向量,从而扩展为 UUU。于是得到 A=UΣV⊤A=U\Sigma V^\topA=UΣV⊤。
直观上:VVV 给出域上(列空间对应的向量方向)的一组正交基,Σ\SigmaΣ 给出缩放,UUU 给出到标的空间的方向。
3. 重要等价与性质(一览)
-
与特征值关系:A⊤Avi=σi2viA^\top A v_i = \sigma_i^2 v_iA⊤Avi=σi2vi。所以 viv_ivi(VVV 的列)是 A⊤AA^\top AA⊤A 的特征向量,σi2\sigma_i^2σi2 是对应特征值。
-
列空间与零空间:
- rank(A)=#{σi>0}\operatorname{rank}(A) =\#\{\sigma_i>0\}rank(A)=#{σi>0}。
- N(A)=span{vr+1,…,vn}\mathcal{N}(A)=\text{span}\{v_{r+1},\dots,v_n\}N(A)=span{vr+1,…,vn}。
- R(A)=span{u1,…,ur}\mathcal{R}(A)=\text{span}\{u_1,\dots,u_r\}R(A)=span{u1,…,ur}。
-
范数与条件数:
- 运算符范数:∥A∥2=σ1\|A\|_2=\sigma_1∥A∥2=σ1(最大的奇异值)。
- F范数:∥A∥F=∑iσi2\|A\|_F=\sqrt{\sum_i\sigma_i^2}∥A∥F=∑iσi2。
- 条件数(2-范数):κ2(A)=σ1/σr\kappa_2(A)=\sigma_1/\sigma_rκ2(A)=σ1/σr(满秩时定义)。
-
Moore–Penrose 伪逆:
A+=VΣ+U⊤, A^+ = V \Sigma^+ U^\top, A+=VΣ+U⊤,
其中 Σ+\Sigma^+Σ+ 将非零奇异值取倒数并转置(形状 n×mn\times mn×m)。
-
极分解(polar decomposition):A=QHA = QHA=QH,其中 Q=UV⊤Q = U V^\topQ=UV⊤(正交),H=VΣV⊤H = V \Sigma V^\topH=VΣV⊤(半正定)。
-
最优低秩逼近(Eckart–Young 定理):对任意 k<rk<rk<r,最佳秩 kkk 的近似(在 2-范数或 F-范数下)由截断 SVD 得到,即保留前 kkk 个奇异值与对应向量。
4. Eckart–Young 定理(直观与结论)
结论:若 A=UΣV⊤A=U\Sigma V^\topA=UΣV⊤ 且 Σ=diag(σ1,…,σr,0,… )\Sigma=\operatorname{diag}(\sigma_1,\dots,\sigma_r,0,\dots)Σ=diag(σ1,…,σr,0,…),则对任意矩阵 BBB 且 rank(B)≤k\operatorname{rank}(B)\le krank(B)≤k,有
minrank(B)≤k∥A−B∥2=σk+1,minrank(B)≤k∥A−B∥F=∑i=k+1rσi2, \min_{\operatorname{rank}(B)\le k}\|A-B\|_2 = \sigma_{k+1},\qquad \min_{\operatorname{rank}(B)\le k}\|A-B\|_F = \sqrt{\sum_{i=k+1}^r \sigma_i^2}, rank(B)≤kmin∥A−B∥2=σk+1,rank(B)≤kmin∥A−B∥F=i=k+1∑rσi2,
并且最小值在 B=UkΣkVk⊤B=U_k\Sigma_k V_k^\topB=UkΣkVk⊤ 处达到(Uk,Σk,VkU_k,\Sigma_k,V_kUk,Σk,Vk 是保留前 k 个奇异值的截断 SVD)。
证明思路:利用单位正交不变性先把问题转换到 Σ\SigmaΣ (对角)上,然后问题变成截断对角矩阵最小化,很容易得到结论。
5. 手算示例(2×2 矩阵,逐步)
以矩阵
A=[3102] A=\begin{bmatrix}3 & 1\\[2pt]0 & 2\end{bmatrix} A=[3012]
为例,按构造法计算 SVD。
- 计算 A⊤AA^\top AA⊤A:
A⊤A=[3012][3102]=[9335]. A^\top A = \begin{bmatrix}3&0\\1&2\end{bmatrix}\begin{bmatrix}3&1\\0&2\end{bmatrix} = \begin{bmatrix}9 & 3\\[2pt]3 & 5\end{bmatrix}. A⊤A=[3102][3012]=[9335].
- 特征值(逐位计算,按系统要求算细节):
特征多项式 det(A⊤A−λI)=0\det(A^\top A - \lambda I)=0det(A⊤A−λI)=0:
∣9−λ335−λ∣=(9−λ)(5−λ)−9=λ2−14λ+36=0. \begin{vmatrix}9-\lambda & 3 \\ 3 & 5-\lambda\end{vmatrix} = (9-\lambda)(5-\lambda)-9 = \lambda^2 -14\lambda +36 =0. 9−λ335−λ=(9−λ)(5−λ)−9=λ2−14λ+36=0.
判别式 Δ=142−4⋅36=196−144=52\Delta = 14^2 -4\cdot36 =196-144=52Δ=142−4⋅36=196−144=52。因此
λ=14±522=14±2132=7±13. \lambda = \frac{14\pm\sqrt{52}}{2} = \frac{14\pm 2\sqrt{13}}{2}=7\pm\sqrt{13}. λ=214±52=214±213=7±13.
数值上:
13≈3.605551275\sqrt{13}\approx 3.60555127513≈3.605551275,所以
λ1≈7+3.605551275=10.605551275,λ2≈7−3.605551275=3.394448725. \lambda_1 \approx 7+3.605551275 = 10.605551275,\quad \lambda_2 \approx 7-3.605551275 = 3.394448725. λ1≈7+3.605551275=10.605551275,λ2≈7−3.605551275=3.394448725.
- 奇异值为 σi=λi\sigma_i=\sqrt{\lambda_i}σi=λi:
σ1=10.605551275≈3.256,σ2=3.394448725≈1.842. \sigma_1=\sqrt{10.605551275}\approx 3.256,\qquad \sigma_2=\sqrt{3.394448725}\approx 1.842. σ1=10.605551275≈3.256,σ2=3.394448725≈1.842.
- 计算 VVV(A⊤Avi=λiviA^\top A v_i=\lambda_i v_iA⊤Avi=λivi):
以 λ1\lambda_1λ1 为例,解 (9−λ1)x+3y=0(9-\lambda_1)x +3y=0(9−λ1)x+3y=0:
(9−10.605551275)x+3y=−1.605551275x+3y=0⇒y=0.535183758 x. (9-10.605551275)x + 3y = -1.605551275 x + 3y =0 \Rightarrow y = 0.535183758\, x. (9−10.605551275)x+3y=−1.605551275x+3y=0⇒y=0.535183758x.
取 x=1x=1x=1 得向量 $ [1,,0.535183758]^\top$。归一化其模长:
norm=12+0.5351837582≈1+0.286420≈1.286420≈1.134. \text{norm}=\sqrt{1^2 + 0.535183758^2} \approx \sqrt{1+0.286420} \approx \sqrt{1.286420}\approx1.134. norm=12+0.5351837582≈1+0.286420≈1.286420≈1.134.
因此第一个 v1≈[0.881, 0.472]⊤v_1\approx [0.881,\,0.472]^\topv1≈[0.881,0.472]⊤。
第二个 v2v_2v2 取与 v1v_1v1 正交并归一,可取 v2≈[−0.472, 0.882]⊤v_2\approx [-0.472,\,0.882]^\topv2≈[−0.472,0.882]⊤。
整理 V≈[0.881−0.4720.4720.882]V\approx\begin{bmatrix}0.881 & -0.472\\[2pt]0.472 & 0.882\end{bmatrix}V≈[0.8810.472−0.4720.882]。
- 计算 UUU:用 ui=(1/σi)Aviu_i = (1/\sigma_i) A v_iui=(1/σi)Avi。
-
对 v1v_1v1:Av1≈[3∗0.881+1∗0.472, 0+2∗0.472]⊤=[3.115, 0.944]⊤A v_1 \approx [3*0.881 + 1*0.472,\ 0+2*0.472]^\top = [3.115,\ 0.944]^\topAv1≈[3∗0.881+1∗0.472, 0+2∗0.472]⊤=[3.115, 0.944]⊤。除以 σ1≈3.256\sigma_1\approx3.256σ1≈3.256:
u1≈[3.115/3.256, 0.944/3.256]≈[0.957, 0.290]⊤. u_1 \approx [3.115/3.256,\ 0.944/3.256] \approx [0.957,\ 0.290]^\top. u1≈[3.115/3.256, 0.944/3.256]≈[0.957, 0.290]⊤.
-
对 v2v_2v2:Av2≈[3∗(−0.472)+1∗0.882, 2∗0.882]⊤=[−0.534, 1.764]⊤A v_2 \approx [3*(-0.472)+1*0.882,\ 2*0.882]^\top = [-0.534,\ 1.764]^\topAv2≈[3∗(−0.472)+1∗0.882, 2∗0.882]⊤=[−0.534, 1.764]⊤。除以 σ2≈1.842\sigma_2\approx1.842σ2≈1.842:
u2≈[−0.534/1.842, 1.764/1.842]≈[−0.290, 0.958]⊤. u_2 \approx [-0.534/1.842,\ 1.764/1.842] \approx [-0.290,\ 0.958]^\top. u2≈[−0.534/1.842, 1.764/1.842]≈[−0.290, 0.958]⊤.
于是 U≈[0.957−0.2900.2900.958]U\approx\begin{bmatrix}0.957 & -0.290\\[2pt]0.290 & 0.958\end{bmatrix}U≈[0.9570.290−0.2900.958],
Σ=diag(3.256,1.842)\Sigma=\operatorname{diag}(3.256,1.842)Σ=diag(3.256,1.842)。
验证(近似乘回去):UΣV⊤U\Sigma V^\topUΣV⊤ 会近似等于原 AAA。注意:奇异向量的符号可以改变(uiu_iui 与 −ui-u_i−ui 同样有效),SVD 在符号上有不唯一性。
6. 数值算法(如何在计算机上实际得到 SVD)
手算只适用于小例子,实际大矩阵用数值线性代数算法:
- 常用策略是先将 AAA 用正交变换化为**二对角(bidiagonal)**形式(Golub–Kahan 双对角化),然后对该双对角矩阵用 QR 步或 divide-and-conquer 方法求奇异值与向量。
- 经典实现:LAPACK 的
gesdd
(divide-and-conquer SVD)、gesvd
(基于 QR 循环)、以及bdsqr
等底层例程。 - 对稀疏/大规模问题:使用 Lanczos / bidiagonal Lanczos、ARPACK/SLES 等方式求前 k 个奇异值(即稀疏 SVD /
svds
)。 - 随机化SVD(randomized SVD):对非常大且近似低秩的矩阵,随机投影 + 小型 SVD 可显著加速(Halko, Martinsson, Tropp 方法)。
复杂度:对 m×nm\times nm×n 的密集矩阵,常规完整 SVD 的复杂度约为 O(mnmin(m,n))O(mn\min(m,n))O(mnmin(m,n))。
7. 数值稳定性与陷阱
- SVD 是数值稳定的;奇异值的计算比直接求解 A−1A^{-1}A−1 或特征分解常更稳定。
- 当奇异值跨越多个量级时(病态问题),小奇异值的相对误差会放大,从而影响伪逆与解的稳定性。
- 注意浮点误差、矩阵中心化(例如 PCA 需先减去均值)等预处理。
- 对非常接近零的奇异值,通常按阈值(如 σi<ϵσ1\sigma_i < \epsilon \sigma_1σi<ϵσ1)当作零来处理。
8. 常见应用举例
- 主成分分析(PCA):对数据矩阵中心化后做 SVD,左/右奇异向量与奇异值与协方差矩阵的特征分解对应。
- 最小二乘与伪逆:用 A+=VΣ+U⊤A^+=V\Sigma^+U^\topA+=VΣ+U⊤ 求解欠定/病态线性系统的最小范数解。
- 低秩近似与压缩(图像压缩、推荐系统的矩阵分解)。
- 子空间估计、系统辨识、ICA 前处理、最优子空间投影等。
- 奇异值用于判断矩阵的秩、条件数、信息含量(如截断奇异值和累计能量)。
9. 推导 / 证明要点
- 存在性由对称矩阵 A⊤AA^\top AA⊤A 的谱分解推出(谱定理保证正交特征向量与非负特征值)。
- 正交性:构造 Ur=AVrΣr−1U_r = A V_r \Sigma_r^{-1}Ur=AVrΣr−1 并验证 Ur⊤Ur=IU_r^\top U_r = IUr⊤Ur=I(利用 Vr⊤A⊤AVr=Σr2V_r^\top A^\top A V_r = \Sigma_r^2Vr⊤A⊤AVr=Σr2)。
- Eckart–Young:利用不变性(对左、右同时做正交变换不改变范数)将 AAA 变为对角形式 Σ\SigmaΣ,然后对截断最优性直接可见。
10. 快速参考公式
- SVD: A=UΣV⊤A=U\Sigma V^\topA=UΣV⊤。
- 矩阵范数: ∥A∥2=σ1, ∥A∥F=∑σi2\|A\|_2=\sigma_1,\ \|A\|_F=\sqrt{\sum\sigma_i^2}∥A∥2=σ1, ∥A∥F=∑σi2。
- 伪逆: A+=VΣ+U⊤A^+=V\Sigma^+U^\topA+=VΣ+U⊤。
- 最优秩-kkk 近似: Ak=UkΣkVk⊤A_k = U_k\Sigma_k V_k^\topAk=UkΣkVk⊤(Eckart–Young)。
11. 实战建议
- 小型/中型矩阵:用 NumPy 的
numpy.linalg.svd(A, full_matrices=False)
。 - 大规模稀疏:用 SciPy 的
scipy.sparse.linalg.svds
或随机化 SVD(sklearn.utils.extmath.randomized_svd
)。 - 高精度或可控误差:使用 LAPACK/ARPACK、或专门的高精度库。