SVD核心速览 (TL;DR)
奇异值分解(Singular Value Decomposition, SVD) 是线性代数中将任意 m×n 实矩阵分解为三个特殊矩阵乘积的正交对角化方法:A=UΣVT。
- 各矩阵角色:U∈Rm×m 为左奇异矩阵(正交阵,列向量为 AAT 的特征向量),Σ∈Rm×n 为奇异值矩阵(对角线上非负奇异值 σi=λi 降序排列),V∈Rn×n 为右奇异矩阵(正交阵,列向量为 ATA 的特征向量)。
- 几何本质:任何实矩阵映射均可分解为三步几何动作:定义域旋转/反射 VT→ 沿坐标轴缩放 Σ→ 值域旋转/反射 U。
- 核心应用:主成分分析 (PCA)、图像低秩压缩、伪逆(Moore-Penrose)求解及推荐系统协同过滤。
SVD 与特征值分解 (EVD) 的本质区别是什么?
很多人初学时容易混淆奇异值分解与特征值分解。下表清晰梳理两者的关键区别:
| 对比维度 | 奇异值分解 (SVD) | 特征值分解 (EVD / 谱分解) |
|---|
| 适用矩阵形态 | 任意 m×n 矩形矩阵(长方阵或方阵均可) | 仅适用于 n×n 方阵(且要求无几何重数亏损) |
| 分解数学形式 | A=UΣVT | A=QΛQ−1 或 QΛQT |
| 基向量正交性 | U 与 V 分别为严格标准正交矩阵 | 特征向量一般仅线性无关;仅在实对称矩阵时才正交 |
| 几何变换直观 | 将定义域超球体映射为值域中的超椭球(主轴为 σi) | 保持特征向量所在直线方向不变,仅发生轴向模长伸缩 |
| 计算核心依据 | 奇异值是半正定对称阵 ATA 特征值的算术平方根 | 直接求解特征方程 det(A−λI)=0 |
| 典型工程场景 | 数据降维、截断低秩逼近、去噪、推荐系统 | 动力系统演化、马尔可夫稳态、微分方程解耦 |
如何一步步手算奇异值分解?(标准三步解题流水线)
手算任意 m×n 矩阵 A 的奇异值分解,遵循以下标准三步流程:
- 第一步(求 V 和 Σ):计算对称矩阵 ATA,求其特征值 λi 与单位正交特征向量 vi,从而组装右奇异矩阵 V;
- 第二步(求奇异值):计算非负奇异值 σi=λi,降序排列构造 m×n 的对角矩阵 Σ;
- 第三步(求 U):对于非零奇异值,利用公式 ui=σi1Avi 直接算出前 r 个左奇异向量;若 r<m,再通过求解齐次方程组 ATu=0(即左零空间 N(AT))正交补齐剩余的左奇异向量。
下面通过具体例题演示完整手算过程。
实战演示:3×2 矩阵手算完整过程 (Example 1)
设 A=[101011],计算 A 的奇异值分解。
按照三步流水线展开计算:
Step 1
计算右奇异矩阵 V. 因为 A=UΣVT, 所以 ATA=V(ΣTΣ)VT
ATA=100111101011=2112利用 det(ATA−λI)=0 计算特征值
2−λ112−λ\[3pt]\[3pt]=(2−λ)2−1=λ2−4λ+3=(λ−3)(λ−1)所以, 特征值 λ_1=3,λ_2=1. 代入 [2−λ112−λ]x=0 计算特征向量
- λ_1=3
−111−1x=0
易得, v1=∥x∥x=21[1,1]T.
- λ_1=1
1111x=0
易得, v_2=∥x∥x=21[1,−1]T. 所以, 右奇异值矩阵
V=21111−1
以及奇异值矩阵
Σ=λ_1000λ_20=300010
Step 2
计算左奇异矩阵, 利用 AV=UΣ
AV=10101121111−1=211121−10=U300010如果记得
左乘行变换, 右乘列变换
, 可以立即..看..出答案
U=1/61/62/61/2−1/20u_13u_23u_33从 奇异值分解初探 中可知, [u_13,u_23,u_33]T∈N(AT) 即
ATu_13u_23u_33=100111u_13u_23u_33=0解得 [u_13,u_23,u_33]T=31[1,1,−1]T, 所以
U=611123−3022−2
最终得到 A 的奇异值分解为
A=101011=611123−3022−230001021111−1矩阵“奇异度”
上面矩阵 A=[101011] 的秩为 2, 奇异值分别是 3 和 1. 如果第 3 行是两个比上面大得多的数呢? 不妨将它们都设为 x, 求矩阵的奇异值
ATA=1001xx10x01x=1+x2x2x21+x2利用 det(ATA−λI)=0 计算特征值
1+x2−λx2x21+x2−λ\[3pt]\[3pt],(λ−1)=[(1+x2)−λ]2−x4=λ2−2(1+x2)λ+(1+2x2)=[λ−(1+2x2)]则特征值以及对应的奇异值为
⎩⎨⎧λ_1=1+2x2λ_2=1⎩⎨⎧σ_1=1+2x2σ_2=1所以, 当 x 足够大时, 矩阵 A 的“头部”所占信息比重更大, 其更“奇异”,更接近于..秩一矩阵..
Example 2
为展现奇异值分解所表现的“奇异性”, 分别计算 A=[111222334] 和 B=[114222331] 的奇异值, 这次利用 Matlab 求解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| clear
clc
A = [1, 2, 3;
1, 2, 3;
1, 2, 4];
B = [1, 2, 3;
1, 2, 3;
4, 2, 1];
[~, sigma1, ~] = svd(A);
[~, sigma2, ~] = svd(B);
A = sigma1(1,1)/trace(sigma1);
B = sigma2(1,1)/trace(sigma2);
disp("A 的奇异值")
disp(sigma1)
disp(['第一奇异值占比:',num2str(A*100),'%'])
fprintf('\n');
disp("B 的奇异值")
disp(sigma2)
disp(['第一奇异值占比:',num2str(B*100),'%'])
|
得到
A 的奇异值
6.9853 0 0
0 0.4527 0
0 0 0.0000
第一奇异值占比:
93.9137%
B 的奇异值
6.3597 0 0
0 2.9249 0
0 0 0.0000
第一奇异值占比:
68.4975%
两个矩阵都是秩为 2 的矩阵, 只是第 3 行略有不同, 仔细观察, 我们会感觉到矩阵 A 比矩阵 B 更奇异, 而奇异值分解的结果也说明了这一点.
奇异值分解手算高频常见问题 (FAQ)
Q1:为什么不能直接对非方阵 A 求特征值?
解答:特征值和特征向量的定义方程为 Ax=λx。若 A 是 m×n 且 m=n,输入向量 x∈Rn 而输出向量 Ax∈Rm,两者的空间维度不同,根本无法比较是否“共线”或“成标量倍”,因此非方阵不存在传统意义上的特征值。而对称阵 ATA 恒为 n×n 实对称半正定方阵,必定拥有非负实特征值,其算术平方根即为奇异值。
Q2:求左奇异矩阵 U 时,为什么不推荐直接独立求 AAT 的特征向量?
解答:理论上 U 的列向量确实是 AAT 的特征向量。但如果分别独立求解 AAT 和 ATA 的特征向量,每个特征向量的正负符号(±ui)具有任意性,极易导致 Avi=−σiui 的符号失配!规范的手算做法是:先求出右奇异向量 vi,再严格按公式 ui=σi1Avi 直接绑定符号算出前 r 个左奇异向量,仅对多余的零空间子空间正交补齐。
更多..奇异值分解..的内容可以戳 这里