我有一个形状为(4000,4000)的矩阵,我想取它的逆。(对于如此大的矩阵,我的矩阵求逆的直觉会崩溃。)起始矩阵具有数量级为
我使用NumPy的numpy.linalg.inv()函数来求矩阵的逆。
以下是我得到的输出结果:
为什么
e-10
的值,以下是一些值:print matrix
给出了输出。[[ 2.19885119e-10 2.16462810e-10 2.13062782e-10 ..., -2.16462810e-10
-2.19885119e-10 -2.16462810e-10]
[ 2.16462810e-10 2.19885119e-10 2.16462810e-10 ..., -2.13062782e-10
-2.16462810e-10 -2.19885119e-10]
[ 2.13062782e-10 2.16462810e-10 2.19885119e-10 ..., -2.16462810e-10
-2.13062782e-10 -2.16462810e-10]
...,
[ -2.16462810e-10 -2.13062782e-10 -2.16462810e-10 ..., 2.19885119e-10
2.16462810e-10 2.13062782e-10]
[ -2.19885119e-10 -2.16462810e-10 -2.13062782e-10 ..., 2.16462810e-10
2.19885119e-10 2.16462810e-10]
[ -2.16462810e-10 -2.19885119e-10 -2.16462810e-10 ..., 2.13062782e-10
2.16462810e-10 2.19885119e-10]]
我使用NumPy的numpy.linalg.inv()函数来求矩阵的逆。
import numpy as np
new_matrix = np.linalg.inv(matrix)
print new_matrix
以下是我得到的输出结果:
这是我得到的返回结果:
[[ 1.95176541e+25 9.66643852e+23 -1.22660930e+25 ..., -1.96621184e+25
-9.41413909e+24 1.33500310e+25]
[ 2.01500967e+25 1.08946558e+24 -1.25813014e+25 ..., -2.07717912e+25
-9.86804459e+24 1.42950556e+25]
[ 3.55575106e+25 2.11333704e+24 -2.25333936e+25 ..., -3.68616202e+25
-1.72651875e+25 2.51239524e+25]
...,
[ 3.07255588e+25 1.61759838e+24 -1.95678425e+25 ..., -3.15440712e+25
-1.47472306e+25 2.13570651e+25]
[ -7.24380790e+24 -8.63730581e+23 4.90519245e+24 ..., 8.30663797e+24
3.70858694e+24 -5.32291734e+24]
[ -1.95760004e+25 -1.12341031e+24 1.23820305e+25 ..., 2.01608416e+25
9.40221886e+24 -1.37605863e+25]]
这差别也太大了吧!怎么会这样?一个幅度为e-10
的矩阵被反转成了一个幅度为e+25
的矩阵?
这是否数学上正确,还是IEEE浮点值出现问题了?
如果这是数学上正确的,有人能解释一下背后的数学原理吗?
编辑:
根据下面的评论,我决定进行测试。
np.dot(matrix, new_matrix)
应该给出单位矩阵,A * A^T = Identity。
这是我的输出结果:
[[ 0. -3. -16. ..., 16. 8. 12. ]
[-24. -1.5 -8. ..., 32. -4. 36. ]
[ 40. 1. -64. ..., 24. 20. 24. ]
...,
[ 32. -0.5 48. ..., -16. -20. 16. ]
[ 40. 7. 16. ..., -48. -36. -28. ]
[ 16. 3. 12. ..., -80. 16. 0. ]]
为什么
numpy.linalg.inv()
会产生数值误差?np.allclose( np.dot(matrix, new_matrix), np.identity(4000) )
返回 False
。
numpy.linalg.det(m)
)和条件数(numpy.linalg.cond(m)
)是多少? - DSMnp.linalg.solve
通过分解计算解比直接求逆矩阵更快更准确。参考链接:http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/ - ali_m