python - numpy.linalg.inv() 是否给出了正确的矩阵逆?编辑: Why does inv() gives numerical errors?

标签 python numpy matrix matrix-inverse

我有一个矩阵形状 (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/

相关文章:

向量化双求和的 Pythonic 方法

python - 将 linreg 函数从 pinescript 转换为 Python?

当设置为长时间后时,Python 计时器脚本不会运行

python - NumPy 相当于 Matlab 的 magic()

python - 如何在多维数组中插入列?

python - 删除数组之间而不是内部的重复项的最有效方法是什么?

c - opengl矩阵数学乘法

python - 如何管理 Python 循环中的副作用?

python - Django 和 weasyprint,合并 pdf

python - 如何将 numpy 数组中的图像读入 PIL 图像?