当前位置: 首页 > news >正文

矩阵奇异值分解算法(SVD)详解

1. 定义(Definition)

给定任意实矩阵 A∈Rm×nA\in\mathbb{R}^{m\times n}ARm×n,它的**奇异值分解(SVD)**是

A=UΣV⊤, A = U\Sigma V^{\top}, A=UΣV,

其中

  • U∈Rm×mU\in\mathbb{R}^{m\times m}URm×m 是正交矩阵(列为 mmm 个正交单位向量),U⊤U=ImU^\top U=I_mUU=Im

  • V∈Rn×nV\in\mathbb{R}^{n\times n}VRn×n 是正交矩阵,V⊤V=InV^\top V=I_nVV=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 AAA 的关系)

SVD 的存在性来自对称正定矩阵的谱分解(谱定理):

  1. 计算 A⊤A∈Rn×nA^\top A\in\mathbb{R}^{n\times n}AARn×n,它是对称半正定矩阵。
  2. A⊤AA^\top AAA 做特征分解:A⊤A=VΛV⊤A^\top A = V\Lambda V^\topAA=VΛV,其中 Λ=diag⁡(λ1,…,λn)\Lambda=\operatorname{diag}(\lambda_1,\dots,\lambda_n)Λ=diag(λ1,,λn)λi≥0\lambda_i\ge0λi0,且 VVV 正交。
  3. 令奇异值为 σi=λi\sigma_i=\sqrt{\lambda_i}σi=λi。将非零奇异值前 rrr 个挑出来,构成 Σr\Sigma_rΣrVrV_rVr
  4. 定义 Ur=AVrΣr−1U_r = A V_r \Sigma_r^{-1}Ur=AVrΣr1。可以验证这些列是正交单位向量,从而扩展为 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_iAAvi=σi2vi。所以 viv_iviVVV 的列)是 A⊤AA^\top AAA 的特征向量,σ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_1A2=σ1(最大的奇异值)。
    • F范数:∥A∥F=∑iσi2\|A\|_F=\sqrt{\sum_i\sigma_i^2}AF=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,),则对任意矩阵 BBBrank⁡(B)≤k\operatorname{rank}(B)\le krank(B)k,有

min⁡rank⁡(B)≤k∥A−B∥2=σk+1,min⁡rank⁡(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)kminAB2=σk+1,rank(B)kminABF=i=k+1rσ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。

  1. 计算 A⊤AA^\top AAA

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}. AA=[3102][3012]=[9335].

  1. 特征值(逐位计算,按系统要求算细节):
    特征多项式 det⁡(A⊤A−λI)=0\det(A^\top A - \lambda I)=0det(AAλ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=λ214λ+36=0.

判别式 Δ=142−4⋅36=196−144=52\Delta = 14^2 -4\cdot36 =196-144=52Δ=142436=196144=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.605551275133.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. λ17+3.605551275=10.605551275,λ273.605551275=3.394448725.

  1. 奇异值为 σ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.6055512753.256,σ2=3.3944487251.842.

  1. 计算 VVVA⊤Avi=λiviA^\top A v_i=\lambda_i v_iAAvi=λ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. (910.605551275)x+3y=1.605551275x+3y=0y=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.53518375821+0.2864201.2864201.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.4720.4720.882]

  1. 计算 UUU:用 ui=(1/σi)Aviu_i = (1/\sigma_i) A v_iui=(1/σi)Avi
  • v1v_1v1Av1≈[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[30.881+10.472, 0+20.472]=[3.115, 0.944]。除以 σ1≈3.256\sigma_1\approx3.256σ13.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_2v2Av2≈[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)+10.882, 20.882]=[0.534, 1.764]。除以 σ2≈1.842\sigma_2\approx1.842σ21.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.2900.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_iui 同样有效),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}A1 或特征分解常更稳定。
  • 当奇异值跨越多个量级时(病态问题),小奇异值的相对误差会放大,从而影响伪逆与解的稳定性。
  • 注意浮点误差、矩阵中心化(例如 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 AAA 的谱分解推出(谱定理保证正交特征向量与非负特征值)。
  • 正交性:构造 Ur=AVrΣr−1U_r = A V_r \Sigma_r^{-1}Ur=AVrΣr1 并验证 Ur⊤Ur=IU_r^\top U_r = IUrUr=I(利用 Vr⊤A⊤AVr=Σr2V_r^\top A^\top A V_r = \Sigma_r^2VrAAVr=Σ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}A2=σ1, AF=σ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、或专门的高精度库。

http://www.dtcms.com/a/388820.html

相关文章:

  • 【FreeRTOS】 二值信号量与互斥量(CMSIS-RTOS v2 版本)
  • Qt C++ :Qt全局定义<QtGlobal>
  • 【STL源码剖析】从源码看 list:从迭代器到算法
  • MySQL 专题(三):事务与锁机制深度解析
  • 使用BLIP训练自己的数据集(图文描述)
  • Geoserver修行记--在geoserver中如何复制某个图层组内容
  • DBG数据库透明加密网关:SQLServer应用免改造的安全防护方案,不限制开发语言的加密网关
  • 不同上位开发语言、PLC下位平台、工业协议与操作系统平台下的数据类型通用性与差异性详解
  • 【入门篇|第二篇】从零实现选择、冒泡、插入排序(含对数器)
  • javaweb Servlet基本介绍及开发流程
  • MySQL MHA高可用
  • 整体设计 逻辑拆解之2 实现骨架:一元谓词+ CNN的谓词系统
  • SpEL(Spring Expression Language)学习笔记
  • Java 字节码进阶3:面向对象多态在字节码层面的原理?
  • Tensor :核心概念、常用函数与避坑指南
  • 机器学习实战·第四章 训练模型(1)
  • 一次因表单默认提交导致的白屏排查记录
  • Linux:io_uring
  • 《第九课——C语言判断:从Java的“文明裁决“到C的“原始决斗“——if/else的生死擂台与switch的轮盘赌局》
  • 学习日报|Spring 全局异常与自定义异常拦截器执行顺序问题及解决
  • Spring Boot 参数处理
  • Debian系统基本介绍:新手入门指南
  • Spring Security 框架
  • Qt QPercentBarSeries详解
  • RTT操作系统(3)
  • DNS服务管理
  • IDA Pro配置与笔记
  • 虚函数表在单继承与多继承中的实现机制
  • 矿石生成(1)
  • Linux 线程的概念