作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个矩阵形状 (4000, 4000),我想取逆矩阵。 (对于如此大的矩阵,我对逆矩阵的直觉会崩溃。)
起始矩阵的值大小为 e-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]
[ 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
。
最佳答案
你的矩阵条件不好,因为
np.linalg.cond(matrix) > np.finfo(matrix.dtype).eps
根据this answer您可以考虑使用 Singular Value Decomposition来求逆这样的矩阵。
关于python - numpy.linalg.inv() 是否给出了正确的矩阵逆?编辑: Why does inv() gives numerical errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188979/
我是一名优秀的程序员,十分优秀!