You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:04