numpy矩阵幂函数和矩阵乘法

时间:2020-01-22 10:30:44

标签: python numpy matrix

在numpy.linalg.matrix_power中进行的计算与将矩阵直接多次相乘之间有什么区别?这就是我观察到的并感到困惑的地方。

>> Matrix A:
[[2 4 5], 
 [4 4 5],
 [8 3 1]]

>> numpy.linalg.matrix_power(A, 3)
[[556 501 530]
 [676 579 600]
 [708 500 471]]

>> (A * A) * A
[[556 501 530]
 [676 579 600]
 [708 500 471]]

但是

>> A = normalize(A, axis=1, norm='l1')
[[0.18181818 0.36363636 0.45454545]
 [0.30769231 0.30769231 0.38461538]
 [0.66666667 0.25       0.08333333]]

>> numpy.linalg.matrix_power(A, 3)
[[0.34477471 0.31773179 0.3374935],
[0.36065187 0.31371769 0.32563044],
[0.42154896 0.2984543  0.27999674]]

>> (A * A) * A
[[0.00601052 0.04808415 0.09391435]
 [0.02913063 0.02913063 0.05689577]
 [0.2962963  0.015625   0.0005787 ]]

为什么结果不同?正确的(预期的)计算是哪一个?

这是我正在检查的简单代码

import numpy as np

A = np.matrix([[2, 4, 5], [4, 4, 5], [8, 3, 1]])
#A = normalize(A, axis=1, norm='l1') #uncommented for the 2nd part

print(A)
print(np.linalg.matrix_power(A, 3))
print((A * A) * A)

1 个答案:

答案 0 :(得分:0)

In [1]: from sklearn.preprocessing import normalize  

以numpy数组开头:

In [2]: A = np.array([[2,4,5],[4,4,5],[8,3,1]])                                                  

从中制作一个np.matrix

In [3]: M = np.matrix(A)                                                                         
In [4]: A                                                                                        
Out[4]: 
array([[2, 4, 5],
       [4, 4, 5],
       [8, 3, 1]])
In [5]: M                                                                                        
Out[5]: 
matrix([[2, 4, 5],
        [4, 4, 5],
        [8, 3, 1]])

*对于A是元素方面的:

In [6]: (A*A)                                                                                    
Out[6]: 
array([[ 4, 16, 25],
       [16, 16, 25],
       [64,  9,  1]])

但是M的矩阵乘法:

In [7]: M*M                                                                                      
Out[7]: 
matrix([[60, 39, 35],
        [64, 47, 45],
        [36, 47, 56]])
In [8]: A@A                      # also np.dot(A,A)                                                                   
Out[8]: 
array([[60, 39, 35],
       [64, 47, 45],
       [36, 47, 56]])

通过M通过normalize

In [9]: N = normalize(M)                                                                         
In [10]: N                                                                                       
Out[10]: 
array([[0.2981424 , 0.59628479, 0.74535599],
       [0.52981294, 0.52981294, 0.66226618],
       [0.92998111, 0.34874292, 0.11624764]])

结果是numpy数组,而不是Matrix。因此N*N将是元素化的。

像这样的混乱是为什么不再推荐np.matrix的一部分。