python - 如何在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
给出更好的结果,尽管在这种情况下这不起作用,因为矩阵不是满秩的。
推荐阅读
- android - 如何使用jetpack compose在单击时删除视图组件
- putty - 使用 PLink 和 echo 自动化 HP Procruve Switch
- list - 如何在递归置换函数中一一返回置换列表元素?
- django - 如何保存这个表格?
- java - 使用仅具有本地缓存且没有 Gradle Enterprise 服务器的 Gradle Enterprise Maven 扩展
- excel - Excel - 替换非公式单元格中的“/”字符
- c++ - 如何使用 WinAPI 每帧只重绘一次子窗口?
- vmware - vmware 解锁程序错误:“找不到文件 - darwin*.*”
- firebase - 有没有一种简单有效的方法来查询 Firebase 上的地理点?
- c++ - 字符串和 getline 字符