为什么numpy和scipy中的矩阵求逆函数对大的二次矩阵返回不同的结果?

2024-04-25 22:14:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我定义了一个大的二次矩阵(例如150x150)。一次是numpy数组(matrixa),一次是scipy稀疏数组(matrixB)。在

import numpy as np
import scipy as sp

from scipy.sparse.linalg import spsolve

size = 150
A = np.zeros((size, size))
length = 1000
# Set some random numbers at random places
A[np.random.randint(0, size, (2, length)).tolist()] = \
    np.random.randint(0, size, (length, ))
B = sp.sparse.csc_matrix(A)

现在我计算两个矩阵的逆。对于矩阵B我使用两种方法来计算逆(sp.sparse.linalg.inv和{})。在

^{pr2}$

为了检查AB的两个倒数是否相等,我将求出差值的平方。在

# Is not equal zero, question: Why?
# Sometimes very small (~+-10**-27), sometimes very big (~+-10**5)
print("np.sum((inv_A - inv_B)**2): {}".format(np.sum((inv_A - inv_B)**2)))
# Should be zero
print("np.sum((inv_B - inv_B2)**2): {}".format(np.sum((inv_B - inv_B2)**2)))

问题是:如果我使用小矩阵,例如10x10,numpy作为scipy逆函数之间的误差非常小(大约~+-10**-32)。但我需要大矩阵的稀疏版本(例如500x500)。在

我是不是做错了什么,或者有没有可能在python中计算稀疏矩阵的正确的逆函数?在


Tags: importnumpysizeasnp矩阵randomscipy
1条回答
网友
1楼 · 发布于 2024-04-25 22:14:52

你的标题问题的答案是:因为你不幸地选择了示例矩阵。让我详细说明一下。在

机器精度是有限的,因此浮点运算很难达到100%的精度。试试看

>>> np.linspace(0, 0.9, 10)[1:] == np.linspace(0.1, 1, 10)[:-1]
array([ True,  True,  True,  True,  True, False,  True,  True,  True], dtype=bool)

通常情况下,这是没有问题的,因为错误太小而无法察觉。在

然而,对于许多计算,有些输入很难处理,并且可能会使数值算法过度拉伸。这当然适用于矩阵求逆,而你不幸地选择了如此困难的输入。在

实际上,可以通过查看矩阵的单数值来检查矩阵是否“病态”,请参见示例here。下面是用脚本生成的几个矩阵的矩阵条件数(size=200;行为良好的矩阵的值更接近1)

^{pr2}$

切换到行为良好的矩阵,你的结果应该会大大改善。在

相关问题 更多 >

    热门问题