numpy/scipy的pinv伪逆输出异常 同矩阵inv函数计算结果正确
问题原因分析
这个问题的核心是numpy.linalg.pinv的奇异值截断逻辑导致的:
- pinv的底层实现依赖奇异值分解(SVD),默认会把小于
rcond * 最大奇异值的奇异值当做数值0处理,不纳入逆矩阵的计算,这个设计的初衷是为了处理病态矩阵、奇异矩阵的数值稳定性问题。 - 你给出的示例矩阵是典型的高条件数矩阵:两个奇异值分别约为3e16和14.7,numpy pinv默认的rcond取值为1e-15,因此截断阈值为
3e16 * 1e-15 = 30,大小为14.7的小奇异值小于阈值,被判定为数值0直接截断,最终得到的伪逆结果自然和真实逆矩阵偏差极大。 - 而
numpy.linalg.inv是直接通过LU分解求解线性方程组得到逆矩阵,不会做奇异值截断,只要矩阵行列式非零就能得到正确结果,所以在你这个场景下结果符合预期。
解决办法
如果你的矩阵确定都是可逆矩阵,优先用inv计算即可;如果必须要使用pinv(比如有兼容奇异矩阵的需求),手动调小rcond参数即可解决问题,示例代码如下:
import numpy as np A = np.matrix([[1e2, -1.6e9], [-1.6e9, 3e16]]) # 手动设置更小的截断阈值 print(np.linalg.pinv(A, rcond=1e-20)) # 此时输出和inv结果一致 print(np.linalg.inv(A))
内容的提问来源于stack exchange,提问作者user112495
相关产品推荐
相关产品推荐

