线性代数教程 · 第8章

奇异值分解

数值线性代数的瑞士军刀

← Linear Algebra Tutorial

8.1 SVD 的几何直觉

奇异值分解(SVD)是线性代数中最强大的工具。任何矩阵 A 都可以分解为 A = UΣVᵀ,其中 U 和 V 是正交矩阵,Σ 是对角矩阵。

几何上,SVD 揭示了 A 将单位球映射为椭球的过程:

  1. Vᵀ 旋转单位球
  2. Σ 沿坐标轴伸缩
  3. U 再次旋转
SVD 的普适性

与特征分解不同,SVD 对任意矩阵(甚至非方阵)都存在。这使得它成为数值线性代数的"瑞士军刀"。

图 8-1:SVD 的几何解释 — 单位圆映射为椭圆
% MATLAB:SVD 分解 A = [3 0; 0 1] * [cos(pi/6) -sin(pi/6); sin(pi/6) cos(pi/6)]; [U, S, V] = svd(A); % 验证 A = U*S*V' norm(A - U*S*V'); % ≈ 0 % 奇异值 singular_values = diag(S); % 椭球的半轴长度

奇异值与特征值的关系

AᵀA 和 AAᵀ 都是对称半正定矩阵,它们的特征值是 A 的奇异值的平方。V 的列是 AᵀA 的特征向量,U 的列是 AAᵀ 的特征向量。

AᵀA = VΣ²Vᵀ,AAᵀ = UΣ²Uᵀ

8.2 低秩逼近

SVD 给出了矩阵的最佳低秩逼近:取前 k 个奇异值,截断其余,得到秩为 k 的最佳逼近(Frobenius 范数意义下)。

Aₖ = UₖΣₖVₖᵀ,其中只保留最大的 k 个奇异值。

示例:矩阵的秩-1 分解

任何矩阵都可以写成秩-1 矩阵的和:

A = σ₁u₁v₁ᵀ + σ₂u₂v₂ᵀ + ... + σᵣuᵣvᵣᵀ

每一项 σᵢuᵢvᵢᵀ 都是一个秩-1 矩阵。截断这个和就是低秩逼近。

Eckart-Young-Mirsky 定理

在所有秩不超过 k 的矩阵中,Aₖ = UₖΣₖVₖᵀ 是距离 A 最近的(Frobenius 范数意义下)。这是 SVD 低秩逼近的最优性保证。

伪逆

SVD 还可以定义 Moore-Penrose 伪逆:A⁺ = VΣ⁺Uᵀ,其中 Σ⁺ 将非零奇异值取倒数。伪逆给出了最小二乘问题的最小范数解。

例1:对矩阵 A = [[3,1],[1,3]] 进行 SVD 分解
第一步:计算 AᵀA 并求奇异值
AᵀA = [[10,6],[6,10]],特征值 16 和 4,奇异值 σ₁ = 4,σ₂ = 2
第二步:求 V 矩阵
V = [[1/√2, 1/√2],[1/√2, −1/√2]](AᵀA 的特征向量组成)
第三步:求 U 矩阵
AAᵀ = [[10,6],[6,10]],U = [[1/√2, 1/√2],[1/√2, −1/√2]]
第四步:构造 Σ 矩阵
Σ = [[4,0],[0,2]]
第五步:验证分解
UΣVᵀ = [[3,1],[1,3]] = A ✓
U = V = [[1/√2, 1/√2],[1/√2, −1/√2]],Σ = [[4,0],[0,2]]。
例2:用秩-1 逼近近似矩阵 A = [[3,2,1],[2,4,2],[1,2,3]]
第一步:SVD 分解求奇异值
奇异值 σ₁ ≈ 7.07,σ₂ ≈ 2.00,σ₃ ≈ 0.14
第二步:构造秩-1 逼近
秩-1 逼近 A₁ = σ₁u₁v₁ᵀ,只保留最大奇异值
第三步:计算 A₁
A₁ ≈ 7.07 × [0.408, 0.816, 0.408]ᵀ × [0.408, 0.816, 0.408]
第四步:得到近似矩阵
A₁ ≈ [[1.18, 2.35, 1.18],[2.35, 4.71, 2.35],[1.18, 2.35, 1.18]]
秩-1 逼近保留了约 96% 的信息(7.07² / ∑σᵢ² ≈ 0.96)。
例3:用伪逆求解无解方程组 Ax = b,A = [[1,1],[1,1]],b = [3,5]ᵀ
第一步:判断方程组
两行矛盾(x₁+x₂ = 3 与 x₁+x₂ = 5),方程组无解,需要最小二乘解。
第二步:正规方程
AᵀA = [[2,2],[2,2]],Aᵀb = [8,8]ᵀ
第三步:SVD 分解
σ₁ = 2,u₁ = (1/√2, 1/√2)ᵀ,v₁ = (1/√2, 1/√2)ᵀ
第四步:计算伪逆
A⁺ = VΣ⁺Uᵀ = (1/2)[[1,1],[1,1]]
第五步:求最小范数解
x = A⁺b = (1/2)[[1,1],[1,1]][3,5]ᵀ = [4,4]ᵀ
最小范数最小二乘解 x = [4, 4]ᵀ。

8.3 工程应用:图像压缩

SVD 低秩逼近最著名的应用是图像压缩。一幅灰度图像就是一个矩阵,用前 k 个奇异值重建图像,可以实现大幅压缩

工程实例:SVD 图像压缩

一幅 1000×1000 的图像有 10⁶ 个像素。用秩-50 的 SVD 逼近,只需存储 50×(1000+1000+1) ≈ 10⁵ 个数,压缩比约 10:1,而视觉质量仍然可接受。

推荐系统:用户-物品评分矩阵通常是低秩的。SVD 可以提取潜在因子,预测缺失评分(Netflix Prize 的核心技术)。

% MATLAB:SVD 图像压缩 I = imread('cameraman.tif'); I = double(I); [U, S, V] = svd(I); % 取前 k 个奇异值重建 k = 50; I_compressed = U(:,1:k) * S(1:k,1:k) * V(:,1:k)'; % 计算压缩比 original_size = numel(I); compressed_size = k*(size(I,1) + size(I,2) + 1); ratio = original_size / compressed_size; % 可视化对比 figure; subplot(1,2,1); imshow(I, []); title('原图'); subplot(1,2,2); imshow(I_compressed, []); title(['压缩后 (k=' num2str(k) ')']);