为什么矩阵乘法会根据它们的分组方式给出不同的结果?

时间:2017-04-20 23:48:51

标签: numpy matrix

我们知道A*B*C = A*(B*C),但为什么这个矩阵乘法会得到不同的结果?

import numpy as np

A = np.array([[1,2,3],[4,5,6]])

B = np.array([[1,2,3],[4,5,6],[7,8,9]])

print( A.dot( np.linalg.inv(B) ).dot(A.T) )

print( A.dot( np.linalg.inv(B).dot(A.T) ) )

结果是

[[ 0.5  2. ]
 [ 1.   4. ]]

[[  2.   4.]
 [  8.  16.]]

2 个答案:

答案 0 :(得分:3)

if (test == static_cast<int16_t>(0xFFFE)) { 排名不足以取得逆转。要获得至少一致的结果,请使用B作为伪逆。

np.linalg.pinv
np.linalg.matrix_rank(B)
# we want 3

# we got 2
2

答案 1 :(得分:3)

浮点算术运算不关联。通常我们没有注意到这一点,因为矩阵A*(B*C)(A*B)*C之间的数值差异很小。但在这种情况下,你试图反转Numpy实际上试图做的不可逆矩阵B,得到一些荒谬的结果:

[[  3.15251974e+15  -6.30503948e+15   3.15251974e+15]
 [ -6.30503948e+15   1.26100790e+16  -6.30503948e+15]
 [  3.15251974e+15  -6.30503948e+15   3.15251974e+15]]

这些数字的大小是这样的,在双精度水平上可以预期大小为1的误差(你得到大约16个准确的数字)。由于大量的消除,A和A.T的乘法使矩阵变回小的东西。但是当非常大的数字相互抵消时,相对误差会增大;结果最终变得毫无意义。