编辑
2026-06-13
线性代数
00

目录

什么是奇异值分解
奇异值分解的表示形式
奇异值分解的具体含义
奇异值的如何计算
如何计算奇异值分解?
对于方阵
1. 计算右奇异矩阵 $V$ 和奇异值 $\Sigma$
2. 联动计算左奇异矩阵 $U$ 的有效列
3. 正交化补全维度(仅在需要 Full SVD 时)
奇异值分解的另一种表达形式

什么是奇异值分解

奇异值分解(英语:Singular value decomposition,缩写:SVD)是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或埃尔米特矩阵基于特征向量的对角化类似,这两种矩阵分解尽管有其相关性,但还是有明显的不同。对称阵特征向量分解的基础是谱分析,而奇异值分解则是谱分析理论在任意矩阵上的推广。

奇异值分解的表示形式

假设一个 mnm * n 的矩阵 AA,其奇异值分解的表示形式为:

Am×n=Um×mΣm×nVn×nT A_{m \times n} = U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T

其中,VTV^TUU都是正交矩阵。

正交矩阵

  • 数学定义:满足 MTM=MMT=IM^T M = M M^T = I 的方阵,其逆矩阵等于转置矩阵(M1=MTM^{-1} = M^T)。
  • 代数特性:行/列向量两两垂直(正交)且长度均为 1,构成了空间中的一组标准正交基。
  • 几何意义:在矩阵变换中仅负责空间旋转镜像翻转,不改变向量的长度和夹角(保持刚体形态)。

奇异值分解的具体含义

假设有一个维度为 nn 的向量 xx

对于VTV^T来说,VTxV^T x 等同于计算在VV这个坐标系下,原先的向量xx对应的位置。

我们记 x1=VTxx_1 = V^T x

对于Σ\Sigma来说,Σx1\Sigma x_1 等同于计算在VV这个坐标系下,沿各个方向的伸缩程度。

我们记 x2=Σx1=ΣVTxx_2 = \Sigma x_1 = \Sigma V^T x

对于UU来说,Ux2U x_2 等同于向量x2x_2映射到UU这个坐标系。

我们记 x3=Ux2=UΣx1=UΣVTxx_3 = U x_2 = U \Sigma x_1 = U \Sigma V^T x

image.png

奇异值的如何计算

对于任意对称矩阵 MM(如 ATAA^TA),其特征值分解形式为 M=WΛWTM = W \Lambda W^T(其中 WW 为正交矩阵,Λ\Lambda 为对角矩阵)。

由此可得:

ATA=Mn×n=Wn×nΛn×nWn×nT\begin{aligned} A^T A &= M_{n \times n} \\ &= W_{n \times n} \Lambda_{n \times n} W_{n \times n}^T \end{aligned}

另一方面,将 AA 的奇异值分解 A=UΣVTA = U \Sigma V^T 代入上式展开:

ATA=(Um×mΣm×nVn×nT)T(Um×mΣm×nVn×nT)=Vn×nΣn×mTUm×mTUm×mΣm×nVn×nT=Vn×n(Σn×mTΣm×n)Vn×nT=Vn×nΛn×nVn×nT\begin{aligned} A^T A &= (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T)^T (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T) \\ &= V_{n \times n} \Sigma_{n \times m}^T U_{m \times m}^T U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T \\ &= V_{n \times n} (\Sigma_{n \times m}^T \Sigma_{m \times n}) V_{n \times n}^T \\ &= V_{n \times n} \Lambda_{n \times n} V_{n \times n}^T \end{aligned}

通过对比上述两种矩阵对角化的形式,我们可以确定:ATAA^TA 的特征向量矩阵 WW 可以作为右奇异矩阵 VV 的一个解。

同理,对于左奇异矩阵 UU,我们可以通过构建对称矩阵 AATA A^T 来进行推导。

假设我们对矩阵 AATA A^T 进行特征值分解(EVD):

AAT=Nm×m=Pm×mΛm×mPm×mT\begin{aligned} A A^T &= N_{m \times m}\\ &= P_{m \times m} \Lambda_{m \times m} P_{m \times m}^T \end{aligned}

其中,PP 是由 AATA A^T 的特征向量正交单位化后组成的矩阵,Λ\Lambda 是对应的特征值对角矩阵。

而根据 SVD 的定义 A=UΣVTA = U \Sigma V^T,代入可得:

AAT=(Um×mΣm×nVn×nT)(Um×mΣm×nVn×nT)T=Um×mΣm×nVn×nTVn×nΣn×mTUm×mT\begin{aligned} A A^T &= (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T) (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T)^T \\ &= U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T V_{n \times n} \Sigma_{n \times m}^T U_{m \times m}^T \end{aligned}

因为 VV 是正交矩阵,满足 VTV=In×nV^T V = I_{n \times n},所以上式可以化简为:

AAT=Um×m(Σm×nΣn×mT)Um×mT=Um×mΛm×mUm×mT\begin{aligned} A A^T &= U_{m \times m} (\Sigma_{m \times n} \Sigma_{n \times m}^T) U_{m \times m}^T \\ &= U_{m \times m} \Lambda_{m \times m} U_{m \times m}^T \end{aligned}

因此,通过对比两组对角化形式,我们可以确定:PP 可以是 UU 的一个解。

通过对比特征值分解与奇异值分解的展开式,我们同样可以推导得到中间奇异值矩阵 Σ\Sigma 的求解方式。

由前述推导可知,特征值对角矩阵 Λ\Lambda 与奇异值矩阵 Σ\Sigma 满足如下关系:

Λn×n=Σn×mTΣm×nΛm×m=Σm×nΣn×mT\begin{aligned} \Lambda_{n \times n} &= \Sigma_{n \times m}^T \Sigma_{m \times n} \\ \Lambda_{m \times m} &= \Sigma_{m \times n} \Sigma_{n \times m}^T \end{aligned}

展开对角矩阵的乘法映射,对于对角线上的每一个元素,有如下对应关系:

λi=σi2σi=λi\begin{aligned} \lambda_i &= \sigma_i^2 \\ \sigma_i &= \sqrt{\lambda_i} \end{aligned}

注意

这里的每一个λ\lambda都是大于等于0的,因为ATAA^T A半正定的,即: xT(ATA)x0x^T (A^T A) x \ge 0

通过对比上述矩阵对角线的映射关系,我们可以确定:中间奇异值矩阵 Σ\Sigma 的非零对角元素 σi\sigma_i 即为矩阵 ATAA^TA(或 AATAA^T)特征值 λi\lambda_i 的算术平方根。在结构上,只需将 σi\sigma_i 构造在与原矩阵 AA 维度完全相同的 m×nm \times n 对角矩阵中即可。

如何计算奇异值分解?

对于方阵

python
import torch def compute_svd(A: torch.Tensor): # 1. 算 A.T @ A 的特征值和特征向量,用 clamp 防御浮点负数误差 s_eig, V = torch.linalg.eigh(A.T @ A) # 2. 强制翻转对齐(从升序变降序) s_eig = torch.flip(s_eig, dims=[0]) V = torch.flip(V, dims=[1]) # 3. 开根号求出奇异值 S_val = torch.sqrt(torch.clamp(s_eig, min=0.0) + 1e-12) # 4. 联动推导 U,彻底避免独立求解导致的符号错位 U_reduced = (A @ V) / S_val.unsqueeze(0) return U_reduced, torch.diag(S_val), V.T

1. 计算右奇异矩阵 VV 和奇异值 Σ\Sigma

对矩阵 ATAA^T A 进行实对称特征值分解(即调用 torch.linalg.eigh)。

  • 特征值处理:将解出的特征值由大到小降序排列,直接开根号(即对元素执行 torch.sqrt)得到奇异值。构造出对角矩阵 Σ\Sigma
  • 向量对齐:将特征向量矩阵的列按照对应的特征值降序同步翻转,得到最终的右奇异矩阵 VV

2. 联动计算左奇异矩阵 UU 的有效列

不独立求解 AATA A^T,而是直接通过 AA 和已求出的 VVΣ\Sigma 进行反向逆推,求出紧凑版的左奇异矩阵 U部分U_{\text{部分}}

U部分=AVΣ1U_{\text{部分}} = A V \Sigma^{-1}

在代码中,这等价于计算矩阵乘法 A×VA \times V,然后将结果的每一列分别除以对应的非零奇异值 σi\sigma_i。此时 UUVV 的空间正负号完全绑定对齐。

3. 正交化补全维度(仅在需要 Full SVD 时)

如果需要将 UU 补全为 m×mm \times m 的完备方阵(如 full_matrices=True):

  • 算法会在内核中利用施密特正交化(Gram-Schmidt),人为产生与已有列向量全部严格垂直、且模长为 1 的新向量,直接拼接塞入矩阵剩余的空位中。

奇异值分解的另一种表达形式

外积展开形式 (Outer Product Expansion)矩阵形式的 A=UΣVTA = U \Sigma V^T

实际上可以转译为数个低秩矩阵相加的线性组合。这种形式能最直观地体现“奇异值大小决定信息量大小”的本质。

假设 AA 的秩为 rruiu_iUU 的第 ii 个列向量,viv_iVV 的第 ii 个列向量(则 viTv_i^TVTV^T 的第 ii 个行向量): A=i=1rσiuiviT=σ1u1v1T+σ2u2v2T++σrurvrTA = \sum_{i=1}^{r} \sigma_i u_i v_i^T = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \dots + \sigma_r u_r v_r^T

结构拆解

每一个 uiviTu_i v_i^T 都是一个大小为 m×nm \times n、但秩严格等于 1 的基础矩阵。

物理意义:原矩阵 AA 被拆解成了 rr 个秩为 1 的“子图层/子矩阵”的叠加,而每个图层所分配的权重(清晰度/能量),正好就是对应的奇异值 σi\sigma_i

本文作者:barrenham

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!