奇异值分解(SVD)
特征值分解只能处理方阵,而且要求矩阵有足够多的线性无关特征向量。但现实中的数据矩阵往往是长方形的——$m$ 个样本、$n$ 个特征,形状是 $m \times n$ 的矩形。
奇异值分解(Singular Value Decomposition, SVD)将特征值分解推广到任意形状的矩阵。任意一个 $m \times n$ 实矩阵 $A$ 都可以分解为
其中 $U$ 和 $V$ 是正交矩阵,$\Sigma$ 是对角矩阵(或矩形对角阵)。这个分解的威力在于:它从数据矩阵中提取出隐藏的"模式",并按重要性排序——第一个奇异值最大,对应的模式最重要,后面的依次递减。
本章覆盖:SVD 的严格定义与存在性、与特征值分解的深层关系、几何意义(旋转→缩放→旋转)、Eckart-Young 定理与低秩近似、SVD 与 PCA 的联系,以及数据降维、图像压缩、推荐系统等实际应用。
前置知识回顾
- 特征值与特征向量:$A\mathbf{x} = \lambda \mathbf{x}$,参见 特征值笔记。
- 正交矩阵:$Q^T Q = I$,$Q$ 的列构成标准正交基,$Q$ 保持内积和长度。
- 实对称矩阵的对角化:实对称矩阵 $A^T = A$ 可以被正交对角化:$Q^T A Q = \Lambda$。
- 矩阵的秩:列空间或行空间的维数,等于非零奇异值的个数。
- 向量范数与矩阵范数:Frobenius 范数 $\|A\|_F = \sqrt{\sum_{i,j} a_{ij}^2}$,谱范数 $\|A\|_2 = \sigma_1$。
特征值分解 $A = P\Lambda P^{-1}$ 只能对方阵使用,而且要求矩阵可对角化。但当 $A$ 是长方形矩阵(比如 $1000 \times 50$ 的数据矩阵),甚至方阵但不可对角化时,特征值分解就无能为力了。
SVD 通过一个巧妙的迂回来解决这个问题:不直接分解 $A$,而是分析 $A^TA$ 和 $AA^T$。这两个矩阵都是实对称半正定的,所以必然可正交对角化,且特征值非负。
设 $A \in \mathbb{R}^{m \times n}$,秩为 $r$。考虑下面的矩阵:
- $A^T A \in \mathbb{R}^{n \times n}$:对称半正定,可正交对角化。
- $A A^T \in \mathbb{R}^{m \times m}$:对称半正定,可正交对角化。
关键在于:$A^TA$ 和 $AA^T$ 共享相同的非零特征值。设 $\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_r > 0$ 是 $A^TA$(也是 $AA^T$)的非零特征值,定义 奇异值 为
这就是 SVD 的核心直觉:奇异值是 $A^TA$(或 $AA^T$)特征值的平方根。矩阵 $A$ 对空间的作用力,被 $A^TA$ 这个"平方度量"捕捉到,再开平方还原。
一个简单例子
设 $A = \begin{pmatrix} 1 & 0 \\ 0 & 2 \end{pmatrix}$。这已经是一个对角矩阵,所以 $A$ 就是它的 SVD($U = I, \Sigma = A, V = I$)。奇异值 $\sigma_1 = 2, \sigma_2 = 1$。
现在考虑 $A = \begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix}$(剪切矩阵)。这个矩阵只有一个特征值 $\lambda = 1$(代数重数 2,几何重数 1),不可对角化。但它的 SVD 存在且有意义:
所以两个奇异值 $\sigma_1 \approx 1.618, \sigma_2 \approx 0.618$——它们描述的是剪切变换对单位圆的作用(变成一个椭圆),而非特征值这种"方向不变"的概念。
奇异值分解
设 $A \in \mathbb{R}^{m \times n}$ 是 $m \times n$ 实矩阵,秩为 $r$。则存在正交矩阵 $U \in \mathbb{R}^{m \times m}$ 和 $V \in \mathbb{R}^{n \times n}$,以及矩形对角矩阵 $\Sigma \in \mathbb{R}^{m \times n}$,使得
其中 $\Sigma$ 的对角线元素 $\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_r > 0$,其余位置全为零。这些 $\sigma_i$ 称为 $A$ 的 奇异值(singular values)。
$U$ 的列 $\mathbf{u}_1, \dots, \mathbf{u}_m$ 称为 左奇异向量(left singular vectors),正交归一。
$V$ 的列 $\mathbf{v}_1, \dots, \mathbf{v}_n$ 称为 右奇异向量(right singular vectors),正交归一。
三种形式
SVD 有几种等价的表达形式,在不同场景下各有便利:
| 形式 | 数学表达 | 说明 |
|---|---|---|
| 完整 SVD | $A_{m \times n} = U_{m \times m} \Sigma_{m \times n} V^T_{n \times n}$ | $U, V$ 都是方阵,$\Sigma$ 为矩形对角阵 |
| 紧凑 SVD | $A_{m \times n} = U_{m \times r} \Sigma_{r \times r} V^T_{r \times n}$ | 只保留 $r$ 个非零奇异值,$U,V$ 变为"瘦"矩阵 |
| 外积形式 | $A = \sum_{i=1}^{r} \sigma_i \mathbf{u}_i \mathbf{v}_i^T$ | 矩阵拆为 $r$ 个秩-1 矩阵的和,按重要性排序 |
外积形式最为直观:$A$ 被拆解为 $r$ 层"模式",每层是一个左奇异向量乘以对应的右奇异向量转置,再乘以奇异值 $\sigma_i$。越靠前的模式越重要,因为 $\sigma_i$ 越大。
与四个基本子空间的关系
SVD 直接给出了矩阵四个基本子空间的规范正交基:
- $A$ 的 列空间 $\operatorname{Col}(A)$:由 $\mathbf{u}_1, \dots, \mathbf{u}_r$ 张成
- $A$ 的 左零空间 $\operatorname{N}(A^T)$:由 $\mathbf{u}_{r+1}, \dots, \mathbf{u}_m$ 张成
- $A$ 的 行空间 $\operatorname{Row}(A)$:由 $\mathbf{v}_1, \dots, \mathbf{v}_r$ 张成
- $A$ 的 零空间 $\operatorname{N}(A)$:由 $\mathbf{v}_{r+1}, \dots, \mathbf{v}_n$ 张成
一次 SVD 就同时给出了所有四个子空间的规范正交基,这是特征值分解做不到的。
例题 1:计算 $2 \times 2$ 矩阵的 SVD
题目:设 $A = \begin{pmatrix}1 & 2 \\ 0 & 2\end{pmatrix}$,求 $A$ 的完整 SVD。
步骤:
- 计算 $A^TA$:$A^TA = \begin{pmatrix}1 & 2 \\ 2 & 8\end{pmatrix}$。
- 求 $A^TA$ 的特征值和特征向量:$\det(A^TA - \lambda I) = (\lambda - 1)(\lambda - 8) - 4 = \lambda^2 - 9\lambda + 4 = 0$,解得 $\lambda_1 = \frac{9 + \sqrt{65}}{2} \approx 8.531$,$\lambda_2 = \frac{9 - \sqrt{65}}{2} \approx 0.469$。
- 奇异值:$\sigma_1 = \sqrt{8.531} \approx 2.921$,$\sigma_2 = \sqrt{0.469} \approx 0.685$。
- 右奇异向量:$\mathbf{v}_1$ 是 $\lambda_1$ 对应的特征向量,$\mathbf{v}_2$ 是 $\lambda_2$ 对应的特征向量。求解 $(A^TA - \lambda_i I)\mathbf{v}_i = \mathbf{0}$ 并归一化。
- 左奇异向量:$\mathbf{u}_i = \frac{1}{\sigma_i} A \mathbf{v}_i$,$i=1,2$。
这个例子展示了 SVD 的标准计算流程:先算 $A^TA$ 的特征分解,再通过 $\mathbf{u}_i = A\mathbf{v}_i/\sigma_i$ 得到左奇异向量。
SVD 与特征值分解最深刻的关系在于:SVD 是"平方化"后的特征值分解。
定理:SVD 与 $A^TA$ 的特征分解
设 $A = U\Sigma V^T$ 是 $A$ 的 SVD。则
换句话说:
- $V$ 的列是 $A^TA$ 的特征向量(右奇异向量 = $A^TA$ 的特征向量)
- $U$ 的列是 $AA^T$ 的特征向量(左奇异向量 = $AA^T$ 的特征向量)
- $\sigma_i^2$ 是 $A^TA$(或 $AA^T$)的特征值
- $A^TA$ 和 $AA^T$ 的非零特征值完全相同
这个定理直接给出了 SVD 的存在性证明:因为 $A^TA$ 是实对称半正定矩阵,它必然有正交对角化 $A^TA = V\Lambda V^T$,其中 $\Lambda = \operatorname{diag}(\lambda_1, \dots, \lambda_n)$,$\lambda_i \ge 0$。取 $\sigma_i = \sqrt{\lambda_i}$,再定义 $\mathbf{u}_i = A\mathbf{v}_i / \sigma_i$(对 $\sigma_i > 0$),就能验证 $A = U\Sigma V^T$。
与特征值分解的关键区别
| 特征值分解 | SVD | |
|---|---|---|
| 适用范围 | 方阵(且可对角化) | 任意矩阵(包括长方形) |
| 因子特性 | $P$ 可逆但不一定正交 | $U,V$ 一定是正交矩阵 |
| 对角元素 | 特征值(可为负数/复数) | 奇异值(非负实数) |
| 子空间信息 | 仅给出特征空间 | 给出全部四个基本子空间 |
| 数值稳定性 | 特征值可能对扰动敏感 | SVD 的数值稳定性更好 |
| 唯一性 | 特征向量方向不唯一 | 奇异值唯一,向量在非重根时唯一(符号可调) |
SVD 与极分解
SVD 还能导出极分解:$A = (UV^T)(V\Sigma V^T) = QP$,其中 $Q = UV^T$ 是正交矩阵(旋转),$P = V\Sigma V^T$ 是对称半正定矩阵(拉伸)。这可以看作把一个线性变换拆成"先拉伸后旋转"或者"先旋转后拉伸"——极分解相当于复数的极坐标表示 $z = re^{i\theta}$ 在矩阵领域的推广。
直观理解
特征值和特征向量回答的是"哪些方向在变换下方向不变"。
奇异值和奇异向量回答的是"变换在哪些正交方向上拉伸最强"。
前者要求不变方向,后者不要求。所以 SVD 对任何矩阵都存在,而特征值分解只对(可对角化的)方阵存在。
SVD 最直观的几何解释:任何一个线性变换 $A: \mathbb{R}^n \to \mathbb{R}^m$ 都可以分解为三个基本操作的复合:
旋转 → 缩放 → 旋转
- $V^T$ 先做旋转:将标准基旋转到"奇异向量的方向"。$\det(V^T)$ 为正就是纯旋转,为负则包含一个反射。
- $\Sigma$ 然后做缩放:沿各个坐标轴方向分别缩放 $\sigma_1, \sigma_2, \dots$ 倍。注意如果 $m \neq n$,这里还包含维度改变(增加或删除坐标轴)。
- $U$ 最后再做旋转:将缩放后的坐标轴旋转到目标的基方向。
几何上,$A$ 将 $\mathbb{R}^n$ 中的单位球面映射为 $\mathbb{R}^m$ 中的一个椭球。椭球的半轴方向就是 $U$ 的列向量,半轴长度就是奇异值 $\sigma_i$。换句话说:奇异值测量了单位球在变换后各个方向的拉伸幅度,奇异向量指明了拉伸的方向。
这个视角在很多物理和工程问题中有直接应用:
- 惯性张量:刚体旋转惯量矩阵的 SVD 给出主惯性轴和对应的转动惯量。
- 弹性力学:应变张量的 SVD 将任意变形分解为三个正交方向的纯拉伸。
- 流体力学:速度梯度张量的 SVD 分解出流体的拉伸和旋转成分。
二维几何示例
考虑 $A = \begin{pmatrix}2 & 1 \\ 1 & 2\end{pmatrix}$。
单位圆上的点经过 $A$ 映射后变成一个椭圆。我们可以算出:
- 椭圆的长半轴方向是 $(1, 1)^T/\sqrt{2}$,长度为 $\sigma_1 = 3$
- 椭圆的短半轴方向是 $(1, -1)^T/\sqrt{2}$,长度为 $\sigma_2 = 1$
SVD 告诉我们:先将单位圆旋转 $45^\circ$($V^T$ 的作用),然后沿新的坐标轴分别拉伸 3 倍和 1 倍($\Sigma$ 的作用),最后再旋转回标准坐标系($U$ 的作用)。三个变换合起来就是把圆变成这个椭圆。
SVD 的一个核心应用是 低秩近似:用秩更小的矩阵来逼近原矩阵。Eckart-Young 定理(也称 Eckart-Young-Mirsky 定理)告诉我们,截断 SVD 给出的是最优的低秩近似。
Eckart-Young 定理(Eckart & Young, 1936)
设 $A \in \mathbb{R}^{m \times n}$ 的 SVD 为 $A = U\Sigma V^T$,$\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_r > 0$。对任意 $k < r$,定义截断 SVD
则 $A_k$ 是 $A$ 在所有秩不超过 $k$ 的矩阵中的最优近似,即
对谱范数同样成立:$\|A - A_k\|_2 = \min_{\operatorname{rank}(B) \le k} \|A - B\|_2 = \sigma_{k+1}$。
当 $\sigma_k > \sigma_{k+1}$ 时,$A_k$ 是唯一的。
这个定理的直觉很简单:SVD 把矩阵拆成按重要性递减的"层",保留前 $k$ 层(最重要的 $k$ 个模式),丢弃后面的。误差就是被丢弃的那些奇异值的平方和(Frobenius 范数)或最大被丢弃奇异值(谱范数)。
证明思路(谱范数的情况)
对谱范数 $\|A - B\|_2$,设 $B$ 是任意秩 $\le k$ 的矩阵。$\operatorname{null}(B)$ 的维数至少为 $n - k$。$\operatorname{span}\{\mathbf{v}_1, \dots, \mathbf{v}_{k+1}\}$ 的维数为 $k+1$。这两个子空间必有交集:存在单位向量 $\mathbf{z}$ 同时属于两者。那么 $(A - B)\mathbf{z} = A\mathbf{z}$(因为 $B\mathbf{z} = 0$),而 $\|A\mathbf{z}\|_2$ 至少是 $\sigma_{k+1}$(因为 $\mathbf{z}$ 在前 $k+1$ 个右奇异向量张成的空间里)。所以 $\|A - B\|_2 \ge \sigma_{k+1}$。截断 SVD $A_k$ 正好达到了这个下界。
秩-1 近似的几何直觉
矩阵 $A$ 将单位球映射为椭球。椭球的半轴长度就是奇异值。找秩-1 近似相当于用一条直线(一维子空间)近似整个椭球。显然,最佳近似是用最长的那个半轴——即 $\sigma_1 \mathbf{u}_1 \mathbf{v}_1^T$。秩-k 近似就是用前 $k$ 个最长的半轴张成的 $k$ 维子空间来近似椭球。
低秩近似的数值示例
设 $A = \begin{pmatrix}1 & 2 & 3 \\ 2 & 4 & 6 \\ 3 & 6 & 9\end{pmatrix}$。这个矩阵的秩为 1(第二行是第一行的 2 倍,第三行是第一行的 3 倍)。计算 SVD:
- $\sigma_1 \approx 14.0$,$\sigma_2 = \sigma_3 = 0$
- $\mathbf{u}_1 \approx (0.267, 0.535, 0.802)^T$
- $\mathbf{v}_1 \approx (0.267, 0.535, 0.802)^T$
$A_1 = \sigma_1 \mathbf{u}_1 \mathbf{v}_1^T$ 精确还原了 $A$ 本身。如果在此基础上截断只保留 $\sigma_1$,误差为 0。
再看 $B = \begin{pmatrix}1 & 0 \\ 0 & 2 \\ 0 & 0\end{pmatrix}$,SVD 给出 $\sigma_1 = 2, \sigma_2 = 1$。秩-1 近似 $B_1 = \sigma_1 \mathbf{u}_1 \mathbf{v}_1^T$ 丢掉的是 $\sigma_2 = 1$ 对应的那层,误差 $\|B - B_1\|_F = 1$。
主成分分析(Principal Component Analysis, PCA)是机器学习中最常用的降维工具之一。通常教科书介绍 PCA 时用的是协方差矩阵的特征值分解,但更本质地说:PCA 是 SVD 在数据中心化后的特例。
SVD 视角下的 PCA
设有 $m$ 个 $n$ 维数据样本 $\mathbf{x}_1, \dots, \mathbf{x}_m \in \mathbb{R}^n$,构成数据矩阵 $X \in \mathbb{R}^{m \times n}$(行对应样本)。
Step 1:数据中心化,$\tilde{X} = X - \mathbf{1}\bar{\mathbf{x}}^T$,其中 $\bar{\mathbf{x}}$ 是样本均值。
Step 2:样本协方差矩阵为 $S = \frac{1}{m-1} \tilde{X}^T \tilde{X}$。
Step 3:对 $\tilde{X}$ 做 SVD:$\tilde{X} = U \Sigma V^T$。
则:
- $V$ 的列就是主成分方向(即协方差矩阵 $S$ 的特征向量)
- $\sigma_i^2 / (m-1)$ 是第 $i$ 个主成分的方差
- $\sigma_i^2 / \sum_{j=1}^{r} \sigma_j^2$ 是第 $i$ 个主成分的方差解释比例
- $U\Sigma$ 的列是数据在主成分方向上的投影(得分矩阵)
为什么用 SVD 做 PCA 比用特征值分解更好?
- 不需要构造协方差矩阵 $S$:当 $n$ 很大(比如 $n = 10^5$ 的图像数据)时,$S$ 是 $n \times n$ 矩阵,构造和存储都不现实。而直接对 $\tilde{X} \in \mathbb{R}^{m \times n}$ 做 SVD 要高效得多。
- 数值稳定性更好:构造 $S = \tilde{X}^T\tilde{X}/(m-1)$ 会使条件数平方化,损失数值精度。
- 同时给出降维映射和数据投影:$V$ 给出从原空间到主成分空间的映射,$U\Sigma$ 直接给出所有样本的主成分坐标。
实用技巧:用 SVD 做 PCA 的算法
输入:数据矩阵 $X \in \mathbb{R}^{m \times n}$,目标维度 $k$。
- 中心化:$\tilde{X} = X - \mathbf{1}\bar{\mathbf{x}}^T$
- 计算 $\tilde{X}$ 的 SVD:$\tilde{X} = U\Sigma V^T$
- 取 $V$ 的前 $k$ 列作为主成分基 $V_k \in \mathbb{R}^{n \times k}$
- 降维后的数据:$Z = \tilde{X} V_k \in \mathbb{R}^{m \times k}$
- 重建近似:$\hat{X} = Z V_k^T + \mathbf{1}\bar{\mathbf{x}}^T$
SVD 与 PCA 的深层统一
本质上,SVD 和 PCA 都在做同一件事:找到数据中方差最大的正交方向。SVD 从矩阵分解的角度做,PCA 从协方差矩阵特征分解的角度做。两者的差异只在于 PCA 要求数据中心化(因为协方差矩阵的定义需要去均值),而 SVD 可以直接应用于任意矩阵。
更广泛地看,SVD 统一了多种统计方法:
- PCA = SVD on centered data
- 对应分析(Correspondence Analysis)= SVD on 标准化后的列联表
- 潜在语义分析(LSA)= SVD on 词-文档矩阵(TF-IDF)
- 典型相关分析(CCA)= 广义 SVD
应用 1:图像压缩
一张灰度图像是一个 $m \times n$ 矩阵,每个元素是像素灰度值。SVD 图像压缩的流程:
- 对图像矩阵 $A$ 做 SVD:$A = U\Sigma V^T$
- 只保留最大的 $k$ 个奇异值,丢弃其余:$A_k = \sum_{i=1}^k \sigma_i \mathbf{u}_i \mathbf{v}_i^T$
- 存储 $k$ 个奇异值 + $k$ 个左奇异向量(截断)+ $k$ 个右奇异向量(截断),共 $k(m+n+1)$ 个浮点数
- 解压时重建 $A_k$
压缩比 = $mn / [k(m+n+1)]$。一张 $1000 \times 1000$ 的图像,取 $k=50$ 时压缩比约为 $1000000 / (50 \times 2001) \approx 10$ 倍。由于自然图像中存在大量冗余(相邻像素高度相关),前几十个奇异值往往就能捕获绝大部分信息。
这是有损压缩,但奇异值衰减很快——很多图像的奇异值在前几十个就衰减到接近零了。$k$ 的选择取决于所需的压缩比和质量平衡。
应用 2:推荐系统
推荐系统中的"协同过滤"问题:有一个 $m \times n$ 的用户-物品评分矩阵 $R$,其中大部分条目缺失(用户只对少量物品评过分)。SVD 用于提取"潜在因子":
- 左奇异向量 $\mathbf{u}_i$ 可以理解为"用户在第 $i$ 个潜在因子上的负荷"
- 右奇异向量 $\mathbf{v}_i$ 可以理解为"物品在第 $i$ 个潜在因子上的负荷"
- 奇异值 $\sigma_i$ 表示该因子在解释评分变化时的重要性
如果只看前 $k$ 个奇异值,$R_k = U_k \Sigma_k V_k^T$ 就是 $R$ 在 $k$ 维"潜在特征空间"中的近似。填充缺失值最自然的方法就是用这个低秩近似去预测:用户 $i$ 对物品 $j$ 的预测评分 = $\sum_{t=1}^k \sigma_t u_{it} v_{jt}$。
这就是著名的 FunkSVD(Simon Funk, 2006)的核心思想,在 Netflix Prize 比赛中大放异彩。现代推荐系统的矩阵分解方法(如 ALS、BPR)都可以视为 SVD 在评分缺失、带正则化条件下的变体。
应用 3:数据降维与可视化
参考 Part 6 的 PCA 部分。SVD 是数据降维的基础工具,不仅用于 PCA,还用于:
- t-SNE 初始化:t-SNE 通常用 PCA(即 SVD)的结果作为初始嵌入,比随机初始化更稳定。
- 潜在语义索引(LSI):在自然语言处理中,对 TF-IDF 矩阵做 SVD,得到文档在"语义空间"中的低维表示。
- 文本聚类:SVD 降维后接 K-means,在低维空间中聚类效果更好(避免了"维度灾难"中的距离度量失效问题)。
应用 4:其他常见用法
- 伪逆(Moore-Penrose):$A^+ = V \Sigma^+ U^T$,其中 $\Sigma^+$ 将非零奇异值取倒数。几乎所有最小二乘问题的解都可以用伪逆表达。
- 条件数估计:矩阵 $A$ 的条件数 $\kappa(A) = \sigma_1 / \sigma_r$,衡量线性系统 $A\mathbf{x} = \mathbf{b}$ 对扰动的敏感度。
- 总最小二乘(TLS):当 $A$ 和 $\mathbf{b}$ 都有噪声时,总最小二乘的解由最小奇异值对应的右奇异向量给出。
- 系统识别:Hankel 矩阵的 SVD 用于从时间序列数据中提取系统的动态模式(如 DMD 算法)。
- Google PageRank:虽然不是直接使用 SVD,但 PageRank 的稀疏矩阵迭代求解与 SVD 中求主奇异向量的幂法密切相关。
实际工程中,SVD 的计算不通过 $A^TA$ 的特征值分解(那会平方化条件数,损失精度)。现代 SVD 算法走的是更精巧的路径。
方法 1:分而治之(Divide and Conquer)
这是目前 LAPACK 默认使用的算法(自 LAPACK 3.0 起),适用于稠密矩阵。核心思想:
- 先将 $A$ 通过正交变换化为 二对角矩阵(bidiagonal form):$A = U_1 B V_1^T$,$B$ 只有对角线和上对角线非零。
- 对 $B$ 做 SVD:$B = U_2 \Sigma V_2^T$(二对角矩阵的 SVD 有递归的分治解法)。
- 合并:$A = (U_1 U_2) \Sigma (V_1 V_2)^T$。
时间复杂度 $O(mn^2)$ 当 $m \ge n$。对于大多数日常矩阵规模($n < 1000$),分治算法非常高效。
方法 2:QR 迭代(Jacobi SVD)
一种更古老但数值更稳定的方法,尤其适合精度要求极高的场景。通过一系列 Jacobi 旋转(Givens 旋转)交替消去 $A^TA$ 的非对角元。每次旋转只处理一个 $2 \times 2$ 的子问题,收敛后得到 SVD。
Jacobi SVD 的数值精度通常优于分治算法,但速度较慢。在有些领域(如需要极高精度的高性能计算)仍被使用。
方法 3:随机化 SVD(Randomized SVD)
当矩阵规模极大($m, n > 10^4$)时,精确 SVD 的计算成本不可接受。随机化 SVD 是 2010 年代以来流行的近似方法:
- 生成随机矩阵 $\Omega \in \mathbb{R}^{n \times (k+p)}$($p$ 是过采样参数,通常取 5-10)
- 计算采样矩阵 $Y = A \Omega \in \mathbb{R}^{m \times (k+p)}$
- 对 $Y$ 做 QR 分解 $Y = QR$,$Q$ 的列近似张成 $A$ 的列空间的前 $k$ 维
- 计算 $B = Q^T A \in \mathbb{R}^{(k+p) \times n}$(将 $A$ 投影到低维空间)
- 对 $B$ 做精确 SVD:$B = \tilde{U} \Sigma V^T$
- 最终结果:$A \approx (Q \tilde{U}) \Sigma V^T$
时间复杂度从 $O(mn^2)$ 降到 $O(mnk)$。对 $k \ll \min(m, n)$ 的大矩阵,计算速度可以提升一到两个数量级,而误差可控(概率意义上以指数级接近最优近似)。
工程实践中的选择
| 矩阵大小 | 推荐方法 | 备注 |
|---|---|---|
| $< 1000$ | 分治 SVD(numpy.linalg.svd) | 标准选择,精度和速度的平衡 |
| $10^3 \sim 10^4$ | 分治 / Jacobi | 精度要求极高时选 Jacobi |
| $> 10^4$,$k$ 较小 | 随机化 SVD(sklearn.utils.extmath.randomized_svd) | 大数据场景的标准做法 |
| 稀疏矩阵 | 截断 SVD(svds / PROPACK) | 用 Lanczos 迭代求部分奇异值 |
在 Python 中,numpy.linalg.svd 和 scipy.linalg.svd 调用的是 LAPACK 的分治或 QR 实现。sklearn.decomposition.TruncatedSVD 对稀疏矩阵效率更高。对超大矩阵,可以考虑 sparse.svds 或 fbpca(随机化 SVD 的 Python 绑定)。
复习速查
| 概念 | 公式 | 关键点 |
|---|---|---|
| SVD | $A = U\Sigma V^T,\ A \in \mathbb{R}^{m \times n}$ | $U \in \mathbb{R}^{m \times m},\ V \in \mathbb{R}^{n \times n}$ 正交,$\Sigma$ 矩形对角 |
| 奇异值 | $\sigma_i = \sqrt{\lambda_i(A^TA)}$ | 非负,递减排列;非零奇异值个数 = $\operatorname{rank}(A)$ |
| 外积形式 | $A = \sum_{i=1}^r \sigma_i \mathbf{u}_i \mathbf{v}_i^T$ | 矩阵拆为秩-1 矩阵之和,按重要性排序 |
| 与 $A^TA$ 的关系 | $A^T A = V\Sigma^T\Sigma V^T$ | 右奇异向量 = $A^TA$ 特征向量,奇异值平方 = 特征值 |
| 与 $AA^T$ 的关系 | $A A^T = U\Sigma\Sigma^T U^T$ | 左奇异向量 = $AA^T$ 特征向量 |
| 几何意义 | 旋转 $\to$ 缩放 $\to$ 旋转 | $V^T$ 旋转,$\Sigma$ 沿坐标轴缩放,$U$ 旋转 |
| Eckart-Young | $\|A - A_k\|_F = \sqrt{\sum_{i=k+1}^r \sigma_i^2}$ | 截断 SVD 是最优的秩-$k$ 近似(Frobenius 范数下) |
| 与 PCA 的关系 | $\tilde{X} = U\Sigma V^T$ | $V$ 的列 = 主成分方向;$\sigma_i^2/(m-1)$ = 方差 |
| 伪逆 | $A^+ = V\Sigma^+ U^T$ | $\Sigma^+$ 将非零奇异值取倒数 |
| 条件数 | $\kappa(A) = \sigma_1 / \sigma_r$ | 衡量 $A\mathbf{x} = \mathbf{b}$ 对扰动的敏感度 |
参考来源
- Strang, G. Introduction to Linear Algebra (5th ed.). Wellesley-Cambridge Press, 2016. Chapter 7: The Singular Value Decomposition and the Pseudoinverse.
- Trefethen, L. N. & Bau, D. Numerical Linear Algebra. SIAM, 1997. Lecture 4 & 5: SVD and condition number.
- Eckart, C. & Young, G. "The approximation of one matrix by another of lower rank." Psychometrika, 1936.
- Halko, N., Martinsson, P. G. & Tropp, J. A. "Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions." SIAM Review, 2011.
- Wikipedia: Singular Value Decomposition
- Wikipedia: Low-rank approximation (Eckart-Young-Mirsky theorem)
- Scikit-learn 文档: PCA using SVD