为何用NumPy将矩阵与其逆矩阵相乘无法得到单位矩阵?
为什么矩阵乘其“逆矩阵”得不到单位矩阵?
嘿,你遇到的问题其实不是浮点舍入误差——而是你的矩阵根本没有逆矩阵!
先看你用的矩阵:
C = np.array([[5,5,5],[4,5,6],[7,8,9]])
我们可以先计算它的行列式来验证:
import numpy as np print(np.linalg.det(C))
运行后你会得到一个非常接近0的数值(比如-2.6645352591003757e-15),这说明这是一个奇异矩阵——矩阵的行/列线性相关,不存在真正的逆矩阵。
手动计算行列式也能确认这一点:
5*(5*9 - 6*8) -5*(4*9 -6*7) +5*(4*8 -5*7) =5*(45-48) -5*(36-42)+5*(32-35) =5*(-3) -5*(-6)+5*(-3) =-15 +30 -15 =0
行列式为0,矩阵自然不可逆。
那为什么np.linalg.inv(C)会返回一堆超大的数值?这是因为numpy默认不会对奇异矩阵直接报错,而是尝试进行数值计算,结果会出现严重的数值不稳定,得到的是一个没有实际意义的近似值,根本不是真正的逆矩阵,所以你用原矩阵乘它,自然得不到单位矩阵。
怎么处理这种情况?
如果你的场景需要对奇异矩阵做类似逆矩阵的操作,可以使用伪逆矩阵,用np.linalg.pinv(C)来计算,它是在最小二乘意义下的最优近似逆:
import numpy as np C = np.array([[5,5,5],[4,5,6],[7,8,9]]) print("原始矩阵") print(C) print("伪逆矩阵") D_pinv = np.linalg.pinv(C) print(D_pinv) print("原矩阵乘伪逆矩阵") print(C.dot(D_pinv))
运行后你会得到一个投影矩阵,这是伪逆的特性——它无法让原矩阵乘后得到单位矩阵,但能满足很多近似计算的需求。
总结一下:
- 你的矩阵是奇异矩阵(行列式为0),不存在真正的逆矩阵
np.linalg.inv对奇异矩阵的计算结果是数值不稳定的无效值,不是真正的逆- 若需要处理奇异矩阵,使用伪逆
np.linalg.pinv更合适
内容的提问来源于stack exchange,提问作者Chase Brumfield
相关产品推荐
相关产品推荐

