稀疏Ax=b超静定方程的常用解法介绍
对于稀疏的超定线性方程组 Ax = b(其中 A ∈ ℝᵐˣⁿ,m > n,即方程个数多于未知数个数),由于通常不存在精确解,我们寻求最小二乘意义下的最优解:
min ‖Ax - b‖₂²
当矩阵 A 是大型稀疏矩阵时,直接法(如QR分解、SVD)计算开销大,因此常用迭代法或基于稀疏结构的优化算法。以下是几种常用解法:
1. 正规方程法 (Normal Equations)
将最小二乘问题转化为求解正规方程:
AᵀA x = Aᵀb
- 优点:转化为对称正定系统(若 A 列满秩),可用共轭梯度法(CG)求解。
- 缺点:条件数 κ(AᵀA) = [κ(A)]²,可能严重病态,数值不稳定。
- 适用场景:A 非常稀疏且 AᵀA 仍保持良好稀疏结构时。
求解方式: 使用 共轭梯度法 (Conjugate Gradient, CG) 迭代求解 AᵀA x = Aᵀb,无需显式构造 AᵀA,只需矩阵-向量乘法操作。
2. LSQR 算法
由 Paige 和 Saunders 提出,是求解稀疏最小二乘问题的首选迭代法之一。
- 基于 Lanczos 双正交化过程,将原问题投影到低维 Krylov 子空间。
- 求解 min ‖Ax - b‖ 的等价问题。
- 优点:
- 数值稳定(类似 SVD 的行为)
- 支持预处理(Preconditioning)
- 内存高效,适合大型稀疏系统
- 自动估计残差和解的误差
- 收敛性好,尤其适用于病态或条件数大的问题。
公式本质: 通过 bidiagonalization 构造小型 bidiagonal 系统,再求其最小二乘解。
3. LSMR 算法
与 LSQR 类似,但更适用于 ill-conditioned 问题。
- 同样基于 Golub-Kahan-Lanczos 过程。
- 求解的是相同最小二乘问题,但迭代方向更优。
- 优点:比 LSQR 收敛更稳定,尤其当 ‖r‖ 不易减小时。
LSMR 和 LSQR 都是 Krylov 子空间方法,广泛用于科学计算库(如 SciPy、MATLAB)。
4. 预处理共轭梯度法(PCG on Normal Equations)
若使用正规方程 AᵀA x = Aᵀb,可引入预处理器 M ≈ AᵀA 来加速收敛。
- 常用预处理器:
- 对角预处理(Jacobi):M = diag(AᵀA)
- 不完全 Cholesky 分解(IC)
- 代数多重网格(AMG)等
- 通过预处理共轭梯度法(PCG)求解,仅需稀疏矩阵乘法。
5. QR 分解(稀疏版本)
对稀疏 A 进行 稀疏 QR 分解:
A = QR
其中 Q ∈ ℝᵐˣᵐ 正交,R ∈ ℝᵐˣⁿ 上三角(或梯形)。
则最小二乘解为:
x = R₁⁻¹ (Q₁ᵀ b)
其中 R₁ 是 R 的前 n 行 n 列上三角块,Q₁ 是 Q 的前 n 列。
- 挑战:稀疏 QR 分解需进行列选主元(列排序)以减少填充(fill-in)。
- 工具:SuiteSparse、SPQR(针对稀疏最小二乘)等库提供高效实现。
6. 奇异值分解(SVD)与截断 SVD
对 A 进行 SVD:A = UΣVᵀ
最小二乘解:x = V Σ⁺ Uᵀ b
- 优点:最稳定,能处理秩亏(rank-deficient)系统。
- 缺点:计算昂贵,不适合超大规模稀疏矩阵。
- 稀疏 SVD:使用 Lanczos 方法计算部分奇异值/向量(如 LSVD),适用于低秩近似。
7. 增广系统法(Augmented System)
将最小二乘问题转化为求解增广线性系统:
[ I A ] [ r ] [ b ] [ Aᵀ 0 ] [ x ] = [ 0 ]
其中 r = b - Ax 是残差。
- 使用 Krylov 方法(如 GMRES、MINRES)配合适当的预处理求解。
- 适合并行计算和稀疏结构。
总结对比
| 方法 | 适用性 | 稳定性 | 内存效率 | 是否需预处理 |
|---|---|---|---|---|
| 正规方程 + CG | 小中规模,良态 | 中 | 高 | 推荐 |
| LSQR | 大型稀疏,通用 | 高 | 高 | 支持 |
| LSMR | 病态问题 | 高 | 高 | 支持 |
| 稀疏 QR | 中小规模稀疏 | 高 | 中 | 否 |
| 截断 SVD | 秩亏或降噪 | 最高 | 低 | 否 |
| 增广系统法 | 特殊结构或并行 | 高 | 高 | 推荐 |
推荐实践
- 首选:LSQR 或 LSMR,尤其适合大型稀疏超定系统。
- 若矩阵不太大且需要高精度:稀疏 QR 分解。
- 若存在秩亏或噪声大:考虑 截断 SVD。
- 若已有良好预处理器:可尝试 PCG on normal equations。
这些方法在 Python(scipy.sparse.linalg.lsqr, lsmr)、MATLAB(lsqr, lsqlin)、C++(Eigen, SuiteSparse)等平台均有高效实现。
