为什么不应该显式求逆
层级:A|建议先修:02-09、02-12、02-18、09-03
教科书常把线性方程 写成 ,这有助于推导,却不代表代码应该先计算逆矩阵。只为求解方程时,直接分解并求解通常更快、更省内存、更稳定。
1. 代数表达与计算过程不同
说明可逆矩阵下解的数学形式。数值库的 solve(A,b) 通常执行:
- 对 做 LU、Cholesky、QR 等分解;
- 通过三角代入求解;
- 不构造 的所有元素。
显式求逆相当于对单位矩阵的每一列解一次方程,计算了许多当前并不需要的信息。
2. 计算代价
对一般稠密 矩阵,分解和求逆都是 量级,但显式逆具有更大常数,还需额外 存储逆矩阵。
若只有一个或少量右端项,solve 明显更合理。若有多个右端项,可复用一次分解,而不是反复求逆。
3. 数值误差
稳定的分解求解器可具有良好后向稳定性。显式形成逆矩阵需要对每个逆元素舍入,随后再做矩阵乘法又引入一次误差。
不能笼统说“求逆永远数值错误”,高质量库也能稳定求逆;更准确的说法是:当目标只是 时,显式逆没有收益,通常引入更多计算和误差机会。
4. 根据结构选择求解器
- 一般方阵:LU 分解加主元选取;
- 对称正定矩阵:Cholesky,速度更快、存储更省;
- 超定最小二乘:QR 或 SVD;
- 秩亏或近秩亏:SVD/伪逆或正则化;
- 大型稀疏对称正定:共轭梯度;
- 大型一般稀疏:GMRES、BiCGSTAB 等迭代法。
利用矩阵结构比机械调用通用逆更重要。
5. 最小二乘也不要套逆公式
正规方程写作
代码不应显式求 ,而应使用 QR、SVD 或专门的 least-squares 求解器。形成 还会平方条件数。
6. Mahalanobis 距离
令 ,可以先解
再计算 。若 是 Cholesky 分解,也可解 ,然后 。
7. 高斯对数密度
多元高斯含
若 ,则:
一次 Cholesky 同时稳定完成两个计算。
8. 矩阵行列式引理与 Woodbury 恒等式
在低秩更新中,可利用
但实现时仍应把每个 作用理解为线性求解,而不是显式形成逆。Woodbury 可把大矩阵问题转为小矩阵问题,常见于 Bayesian 线性模型和 Gaussian process。
9. 自动微分中的求解
现代框架能对 solve、Cholesky 等运算求导。若 ,其微分可由隐式方程
求得,即
反向传播同样转化为线性求解,无需构造逆矩阵。
10. 什么时候真的需要逆矩阵
有时逆矩阵本身就是输出,例如理论分析、某些协方差估计或需要访问全部逆元素。此时可以求逆,但应:
- 利用对称、正定、稀疏等结构;
- 估计条件数;
- 验证残差 ;
- 不把数值逆误认为消除了病态问题。
11. 残差与误差
求得 后,可检查残差
小残差说明 是一个近似满足方程的解,但病态系统中小残差仍可能对应较大的解误差。需结合条件数判断。
12. 易错点
pinv不是“更稳定的普通逆”;它通过 SVD 和阈值处理秩亏,解决的是最小范数/最小二乘问题。- 为多个右端项求解应复用分解,而不是在循环里重复
solve的分解阶段。 - 对称矩阵不一定正定,不能未经检查就用 Cholesky。
- 给矩阵加极小对角 jitter 是正则化,会改变问题,应记录其大小。
常见问答
Q1:公式中还能写 吗?
当然可以,它简洁表达数学关系。实现时把“逆乘向量”翻译为“解线性系统”。
Q2:如果很多次都要乘 ,先求逆是否更快?
通常仍应缓存分解并对多个右端项批量三角求解,既高效又稳定。只有确实需要逆的全部元素时才形成逆。
Q3:Cholesky 失败说明什么?
矩阵可能不对称、不正定、数值误差过大或条件极差。应先检查建模与矩阵谱,再决定是否对称化、正则化或换求解器。
Q4:为什么残差小还可能答案不准?
病态矩阵会把很小的方程扰动映射成很大的解变化,前向误差还取决于条件数。
练习
- 将 翻译成推荐的数值计算步骤。
- 为什么最小二乘优先 QR/SVD,而不是正规方程加显式逆?
- 给定 Cholesky ,写出 Mahalanobis 距离的计算步骤。
- 多个右端项 如何高效求 ?
答案与提示
- 按矩阵结构做一次分解,再通过前代/回代解线性系统。
- 正规方程平方条件数,显式逆增加计算和舍入;QR/SVD 更稳健。
- 解 ,再计算 。
- 分解 一次,对矩阵右端项批量做三角求解并复用分解。