如何计算python中的大规模逆矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算python中的大规模逆矩阵相关的知识,希望对你有一定的参考价值。

我们知道我们可以在numpy的帮助下计算逆矩阵,如下所示。

matrix1 = np.matrix([[8,2,5],[7,3,1],[4,9,6]])
inverse_matrix1 = matrix1.I
result = np.matmul(matrix1, inverse_matrix1)

结果如下,我们很容易通过执行np.matmul来检查准确性。

matrix([[ 0.03585657,  0.1314741 , -0.05179283],
    [-0.15139442,  0.11155378,  0.10756972],
    [ 0.20318725, -0.25498008,  0.03984064]])

检查结果如下。

matrix([[ 1.00000000e+00,  0.00000000e+00,  2.77555756e-17],
    [ 0.00000000e+00,  1.00000000e+00,  3.46944695e-17],
    [-2.22044605e-16,  0.00000000e+00,  1.00000000e+00]])

但是,这种情况非常小。实际上,虽然我们应该避免计算大矩阵的逆矩阵,但有时我们必须这样做。我发现矩阵。当矩阵相对较大时,我无法为我提供相对准确的逆矩阵。示例如下所示。我想计算形状为(300,300)的高斯核矩阵的逆矩阵。

point = np.reshape(np.linspace(-5.0, 5.0, 300), (300, 1))
kernel_matrix_np = np.exp(-(point - np.transpose(point))**2 / (2 * 2**2))

我不知道如何计算这样的矩阵。非常感谢!

答案

您的示例之间的结果差异不是由于矩阵的大小,而是由于排名。第一个矩阵是满秩

>>> matrix_rank(matrix1)
3  ## Shape of the matrix

矩阵的形状,而在第二种情况下,矩阵的等级为19。

>>> matrix_rank(kernel_matrix_np)
19   ## Much less than the shape of the matrix

在这种情况下不可能恢复原始矩阵 - 需要满秩矩阵。正如@Brenlla所提到的,这反映在条件数中。粗略地说,条件数中的每个数量级代表一位精度损失。

>>> cond(kernel_matrix_np)
1.9605027391309521e+19

这些只是使用矩阵进行计算的两个方面,通常其中一个将指出问题所在。最后,有些情况使用pinv代替inv会给出稍微好一些的结果,尽管在这种情况下这不起作用,因为矩阵不是满秩。

以上是关于如何计算python中的大规模逆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中找出NXN矩阵的逆矩阵

条件数:逆矩阵与线性方程组

如何在 python 中并行化以下代码片段?

上三角矩阵的矩阵逆计算给出了大矩阵维度的误差

二扩域(GF(2^m))中的逆矩阵

python怎么实现矩阵的除法