奇异值分解 (SVD) 手算实战指南:深入理解矩阵“奇异度” | 线代拾遗

SVD
SVD

核心速览 (TL;DR) 奇异值分解(Singular Value Decomposition, SVD) 是线性代数中将任意 m×nm \times n 实矩阵分解为三个特殊矩阵乘积的正交对角化方法:A=UΣVT\boldsymbol{A} = \boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^\mathsf{T}

  • 各矩阵角色URm×m\boldsymbol{U} \in \mathbb{R}^{m \times m}左奇异矩阵(正交阵,列向量为 AAT\boldsymbol{A}\boldsymbol{A}^\mathsf{T} 的特征向量),ΣRm×n\boldsymbol{\Sigma} \in \mathbb{R}^{m \times n}奇异值矩阵(对角线上非负奇异值 σi=λi\sigma_i = \sqrt{\lambda_i} 降序排列),VRn×n\boldsymbol{V} \in \mathbb{R}^{n \times n}右奇异矩阵(正交阵,列向量为 ATA\boldsymbol{A}^\mathsf{T}\boldsymbol{A} 的特征向量)。
  • 几何本质:任何实矩阵映射均可分解为三步几何动作:定义域旋转/反射 VT\boldsymbol{V}^\mathsf{T} \to 沿坐标轴缩放 Σ\boldsymbol{\Sigma} \to 值域旋转/反射 U\boldsymbol{U}
  • 核心应用:主成分分析 (PCA)、图像低秩压缩、伪逆(Moore-Penrose)求解及推荐系统协同过滤。

SVD 与特征值分解 (EVD) 的本质区别是什么?

很多人初学时容易混淆奇异值分解与特征值分解。下表清晰梳理两者的关键区别:

对比维度奇异值分解 (SVD)特征值分解 (EVD / 谱分解)
适用矩阵形态任意 m×nm \times n 矩形矩阵(长方阵或方阵均可)仅适用于 n×nn \times n 方阵(且要求无几何重数亏损)
分解数学形式A=UΣVT\boldsymbol{A} = \boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^\mathsf{T}A=QΛQ1\boldsymbol{A} = \boldsymbol{Q}\boldsymbol{\Lambda}\boldsymbol{Q}^{-1}QΛQT\boldsymbol{Q}\boldsymbol{\Lambda}\boldsymbol{Q}^\mathsf{T}
基向量正交性U\boldsymbol{U}V\boldsymbol{V} 分别为严格标准正交矩阵特征向量一般仅线性无关;仅在实对称矩阵时才正交
几何变换直观将定义域超球体映射为值域中的超椭球(主轴为 σi\sigma_i保持特征向量所在直线方向不变,仅发生轴向模长伸缩
计算核心依据奇异值是半正定对称阵 ATA\boldsymbol{A}^\mathsf{T}\boldsymbol{A} 特征值的算术平方根直接求解特征方程 det(AλI)=0\det(\boldsymbol{A} - \lambda\boldsymbol{I}) = 0
典型工程场景数据降维、截断低秩逼近、去噪、推荐系统动力系统演化、马尔可夫稳态、微分方程解耦

如何一步步手算奇异值分解?(标准三步解题流水线)

手算任意 m×nm \times n 矩阵 A\boldsymbol{A} 的奇异值分解,遵循以下标准三步流程:

  1. 第一步(求 VVΣ\Sigma:计算对称矩阵 ATA\boldsymbol{A}^\mathsf{T}\boldsymbol{A},求其特征值 λi\lambda_i 与单位正交特征向量 vi\mathbf{v}_i,从而组装右奇异矩阵 V\boldsymbol{V}
  2. 第二步(求奇异值):计算非负奇异值 σi=λi\sigma_i = \sqrt{\lambda_i},降序排列构造 m×nm \times n 的对角矩阵 Σ\boldsymbol{\Sigma}
  3. 第三步(求 UU:对于非零奇异值,利用公式 ui=1σiAvi\mathbf{u}_i = \frac{1}{\sigma_i}\boldsymbol{A}\mathbf{v}_i 直接算出前 rr 个左奇异向量;若 r<mr < m,再通过求解齐次方程组 ATu=0\boldsymbol{A}^\mathsf{T}\mathbf{u} = \mathbf{0}(即左零空间 N(AT)N(\boldsymbol{A}^\mathsf{T}))正交补齐剩余的左奇异向量。

下面通过具体例题演示完整手算过程。


实战演示:3×23 \times 2 矩阵手算完整过程 (Example 1)

A=[100111]{\boldsymbol{A}}=\Biggl[ \begin{smallmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \end{smallmatrix} \Biggr],计算 A\boldsymbol{A} 的奇异值分解。


按照三步流水线展开计算:

  • Step 1
    计算右奇异矩阵 V\boldsymbol{V}. 因为 A=UΣVT\boldsymbol{A} = \boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^\mathsf{T}, 所以 ATA=V(ΣTΣ)VT\boldsymbol{A}^\mathsf{T}\boldsymbol{A} = \boldsymbol{V}(\boldsymbol{\Sigma}^\mathsf{T}\boldsymbol{\Sigma})\boldsymbol{V}^\mathsf{T}

    ATA=[101011][100111]=[2112]\boldsymbol{A}^\mathsf{T}\boldsymbol{A} = \begin{bmatrix} 1 & 0 & 1 \\\\ 0 & 1 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \end{bmatrix} = \begin{bmatrix} 2 & 1 \\\\\\ 1 & 2 \end{bmatrix}

    利用 det(ATAλI)=0\det(\boldsymbol{A}^\mathsf{T}\boldsymbol{A}-\lambda\boldsymbol{I})=0 计算特征值

    2λ112λ=(2λ)21\[3pt]=λ24λ+3\[3pt]=(λ3)(λ1) \begin{aligned} \begin{vmatrix} 2-\lambda & 1 \\\\\\ 1 & 2-\lambda \end{vmatrix} & = (2-\lambda)^2 - 1 \\\\\[3pt] & = \lambda^2 - 4\lambda + 3 \\\\\[3pt] & = (\lambda - 3) (\lambda-1) \end{aligned}

    所以, 特征值 λ_1=3,λ_2=1\lambda\_1 = 3, \lambda\_2=1. 代入 [2λ112λ]x=0\Bigl[\begin{smallmatrix} 2-\lambda & 1 \\\\\\ 1 & 2-\lambda \end{smallmatrix}\Bigr]\mathbf{x} = \mathbf{0} 计算特征向量

    • λ_1=3\lambda\_1 = 3 [1111]x=0 \begin{bmatrix} -1 & 1 \\\\\\ 1 & -1 \end{bmatrix}\mathbf{x} = \mathbf{0} 易得, v1=xx=12[1,1]T\mathbf{v}_1 = \frac{\mathbf{x}}{\lVert\mathbf{x}\rVert}=\frac{1}{\sqrt{2}}[1, 1]^\mathsf{T}.
    • λ_1=1\lambda\_1 = 1 [1111]x=0 \begin{bmatrix} 1 & 1 \\\\\\ 1 & 1 \end{bmatrix}\mathbf{x} = \mathbf{0} 易得, v_2=xx=12[1,1]T\mathbf{v}\_2 = \frac{\mathbf{x}}{\lVert\mathbf{x}\rVert}=\frac{1}{\sqrt{2}}[1, -1]^\mathsf{T}. 所以, 右奇异值矩阵1 V=12[1111] \boldsymbol{V} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\\\ 1 & -1 \end{bmatrix} 以及奇异值矩阵 Σ=[λ_100λ_200]=[300100] \boldsymbol{\Sigma} = \begin{bmatrix} \sqrt{\lambda\_1} & 0 \\\\\\ 0 & \sqrt{\lambda\_2} \\\\\\ 0 & 0 \end{bmatrix} = \begin{bmatrix} \sqrt{3} & 0 \\\\\\ 0 & 1 \\\\\\ 0 & 0 \end{bmatrix}
  • Step 2
    计算左奇异矩阵, 利用 AV=UΣ\boldsymbol{A}\boldsymbol{V} = \boldsymbol{U}\boldsymbol{\Sigma}

    AV=[100111]12[1111]=12[111120]=U[300100] \boldsymbol{A}\boldsymbol{V} = \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \end{bmatrix} \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\\\ 1 & -1 \end{bmatrix} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\\\ 1 & -1 \\\\ 2 & 0 \end{bmatrix} = \boldsymbol{U} \begin{bmatrix} \sqrt{3} & 0 \\\\\\ 0 & 1 \\\\\\ 0 & 0 \end{bmatrix}

    如果记得 左乘行变换, 右乘列变换 , 可以立即..看..出答案

    U=[1/61/2u_131/61/2u_232/60u_33] \boldsymbol{U} = \begin{bmatrix} 1/\sqrt{6} & 1/\sqrt{2} & u\_{13} \\\\\\ 1/\sqrt{6} & -1/\sqrt{2} & u\_{23} \\\\\\ 2/\sqrt{6} & 0 & u\_{33} \end{bmatrix}

    奇异值分解初探 中可知, [u_13,u_23,u_33]TN(AT)[u\_{13}, u\_{23}, u\_{33}]^\mathsf{T} \in N(\boldsymbol{A^\mathsf{T}})

    AT[u_13u_23u_33]=[101011][u_13u_23u_33]=0 \boldsymbol{A}^\mathsf{T} \begin{bmatrix} u\_{13} \\\\\\ u\_{23} \\\\\\ u\_{33} \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1 \\\\ 0 & 1 & 1 \end{bmatrix} \begin{bmatrix} u\_{13} \\\\\\ u\_{23} \\\\\\ u\_{33} \end{bmatrix} = \boldsymbol{0}

    解得 [u_13,u_23,u_33]T=13[1,1,1]T[u\_{13}, u\_{23}, u\_{33}]^\mathsf{T} = \frac{1}{\sqrt{3}}[1, 1, -1]^\mathsf{T}, 所以

    U=16[132132202] \boldsymbol{U} = \frac{1}{\sqrt{6}} \begin{bmatrix} 1 & \sqrt{3} & \sqrt{2} \\\\\\ 1 & -\sqrt{3} & \sqrt{2} \\\\\\ 2 & 0 & -\sqrt{2} \end{bmatrix}

最终得到 A\boldsymbol{A} 的奇异值分解为

A=[100111]=(16[132132202])[300100](12[1111]) \boldsymbol{A} = \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \end{bmatrix} = \left( \frac{1}{\sqrt{6}} \begin{bmatrix} 1 & \sqrt{3} & \sqrt{2} \\\\\\ 1 & -\sqrt{3} & \sqrt{2} \\\\\\ 2 & 0 & -\sqrt{2} \end{bmatrix} \right) \begin{bmatrix} \sqrt{3} & 0 \\\\\\ 0 & 1 \\\\\\ 0 & 0 \end{bmatrix} \left( \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\\\ 1 & -1 \end{bmatrix} \right)

矩阵“奇异度”

上面矩阵 A=[100111]{\boldsymbol{A}}=\Biggl[ \begin{smallmatrix} 1 & 0 \\\\ 0 & 1 \\\\ 1 & 1 \end{smallmatrix} \Biggr] 的秩为 22, 奇异值分别是 3\sqrt{3}11. 如果第 3 行是两个比上面大得多的数呢? 不妨将它们都设为 xx, 求矩阵的奇异值

ATA=[10x01x][1001xx]=[1+x2x2x21+x2] \boldsymbol{A}^\mathsf{T}\boldsymbol{A} = \begin{bmatrix} 1 & 0 & x \\\\ 0 & 1 & x \end{bmatrix} \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \\\\ x & x \end{bmatrix} = \begin{bmatrix} 1+x^2 & x^2 \\\\\\ x^2 & 1+x^2 \end{bmatrix}

利用 det(ATAλI)=0\det(\boldsymbol{A}^\mathsf{T}\boldsymbol{A}-\lambda\boldsymbol{I})=0 计算特征值

1+x2λx2x21+x2λ=[(1+x2)λ]2x4\[3pt]=λ22(1+x2)λ+(1+2x2)\[3pt]=[λ(1+2x2)],(λ1) \begin{aligned} \begin{vmatrix} 1+x^2-\lambda & x^2 \\\\\\ x^2 & 1+x^2-\lambda \end{vmatrix} & = [(1+x^2)-\lambda]^2 - x^4 \\\\\[3pt] & = \lambda^2 - 2(1+x^2)\lambda +(1+2x^2) \\\\\[3pt] & = [\lambda - (1+2x^2)] \\, (\lambda-1) \end{aligned}

则特征值以及对应的奇异值为

{λ_1=1+2x2λ_2=1{σ_1=1+2x2σ_2=1 \begin{cases} \lambda\_1 = 1+2x^2 \\\\[3pt] \lambda\_2=1 \end{cases} \quad \begin{cases} \sigma\_1 = \sqrt{1+2x^2} \\\\[3pt] \sigma\_2=1 \end{cases}

所以, 当 xx 足够大时, 矩阵 A\boldsymbol{A} 的“头部”所占信息比重更大, 其更“奇异”,更接近于..秩一矩阵..

Example 2

为展现奇异值分解所表现的“奇异性”, 分别计算 A=[123123124]\boldsymbol{A}=\Biggl[\begin{smallmatrix} 1 & 2 & 3 \\\\ 1 & 2 & 3 \\\\ 1 & 2 & 4 \end{smallmatrix}\Biggr]B=[123123421]\boldsymbol{B}=\Biggl[\begin{smallmatrix} 1 & 2 & 3 \\\\ 1 & 2 & 3 \\\\ 4 & 2 & 1 \end{smallmatrix}\Biggr] 的奇异值, 这次利用 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%

两个矩阵都是秩为 22 的矩阵, 只是第 3 行略有不同, 仔细观察, 我们会感觉到矩阵 A\boldsymbol{A} 比矩阵 B\boldsymbol{B} 更奇异2, 而奇异值分解的结果也说明了这一点.


奇异值分解手算高频常见问题 (FAQ)

Q1:为什么不能直接对非方阵 AA 求特征值?

解答:特征值和特征向量的定义方程为 Ax=λx\boldsymbol{A}\boldsymbol{x} = \lambda\boldsymbol{x}。若 A\boldsymbol{A}m×nm \times nmnm \neq n,输入向量 xRn\boldsymbol{x} \in \mathbb{R}^n 而输出向量 AxRm\boldsymbol{A}\boldsymbol{x} \in \mathbb{R}^m,两者的空间维度不同,根本无法比较是否“共线”或“成标量倍”,因此非方阵不存在传统意义上的特征值。而对称阵 ATA\boldsymbol{A}^\mathsf{T}\boldsymbol{A} 恒为 n×nn \times n 实对称半正定方阵,必定拥有非负实特征值,其算术平方根即为奇异值。

Q2:求左奇异矩阵 UU 时,为什么不推荐直接独立求 AATA A^T 的特征向量?

解答:理论上 U\boldsymbol{U} 的列向量确实是 AAT\boldsymbol{A}\boldsymbol{A}^\mathsf{T} 的特征向量。但如果分别独立求解 AAT\boldsymbol{A}\boldsymbol{A}^\mathsf{T}ATA\boldsymbol{A}^\mathsf{T}\boldsymbol{A} 的特征向量,每个特征向量的正负符号(±ui\pm \mathbf{u}_i)具有任意性,极易导致 Avi=σiui\boldsymbol{A}\mathbf{v}_i = -\sigma_i \mathbf{u}_i 的符号失配!规范的手算做法是:先求出右奇异向量 vi\mathbf{v}_i,再严格按公式 ui=1σiAvi\mathbf{u}_i = \frac{1}{\sigma_i}\boldsymbol{A}\mathbf{v}_i 直接绑定符号算出前 rr 个左奇异向量,仅对多余的零空间子空间正交补齐。


更多..奇异值分解..的内容可以戳 这里


  1. 因为矩阵 V\boldsymbol{V}2×22\times 2 的, 所以可以立即确定. 也就是说 N(A)N(\boldsymbol{A}) 是空集
    https://blog.matnoble.top/posts/svd/#%E6%AD%A3%E4%BA%A4%E5%9F%BA%E5%BA%95 ↩︎

  2. 矩阵 A\boldsymbol{A} 的前两行和前两列都是完全相同的; 而矩阵 B\boldsymbol{B} 的任意两列都是线性无关的 ↩︎