取稀疏矩阵的指数

时间:2017-10-06 22:18:25

标签: python numpy matrix sparse-matrix

A=sc.array([[0,2,1],[2,0,3],[1,3,0]])    
sA = sp.csc_matrix(A)
Q2=np.exp(A)
print Q2
Q1=sp.linalg.expm(sA)
print (Q1)  

我正在使用大数据集邻接矩阵,我需要对矩阵进行指数化(我使用的是csc稀疏矩阵表示)。我正在使用上面的玩具数据集测试bug,并找到了scipy.sparse.linalg。对于同一个numpy数组,expm给出了不同于numpy.exp的答案。难道它稀疏.linalg给出了numpy的一个接近答案吗? 两个输出都附有。答案甚至都没有。

enter image description here

1 个答案:

答案 0 :(得分:2)

np.exp逐个元素指数。 expm是矩阵指数,是一种非常不同的计算。

In [539]: A = np.array([[0,2,1],[2,0,3],[1,3,0]])
In [541]: np.exp(A)
Out[541]: 
array([[  1.        ,   7.3890561 ,   2.71828183],
       [  7.3890561 ,   1.        ,  20.08553692],
       [  2.71828183,  20.08553692,   1.        ]])
In [542]: np.exp?
In [543]: np.exp(2)
Out[543]: 7.3890560989306504

https://en.wikipedia.org/wiki/Matrix_exponential#Computing_the_matrix_exponential

In [545]: from scipy.sparse import linalg
In [547]: linalg.expm(A)
Out[547]: 
array([[ 13.45868182,  18.62459092,  16.65146966],
       [ 18.62459092,  26.50610262,  23.85956737],
       [ 16.65146966,  23.85956737,  21.61331982]])

我不知道是否有函数来执行稀疏指数,但可以使用以下函数评估这些部分:

In [565]: sA = sparse.csc_matrix(A)
In [566]: np.exp(sA.data)
Out[566]: 
array([  7.3890561 ,   2.71828183,   7.3890561 ,  20.08553692,
         2.71828183,  20.08553692])
In [567]: np.exp(0)
Out[567]: 1.0

由于exp(0)为1,即使使用稀疏矩阵,结果也是密集的。因此,将稀疏矩阵转换为密集并进行密集计算同样容易(并且可能更快)。

正如@Desire评论的那样,有一个np.expm1函数。稀疏矩阵

In [574]: sA.expm1().A
Out[574]: 
array([[  0.        ,   6.3890561 ,   1.71828183],
       [  6.3890561 ,   0.        ,  19.08553692],
       [  1.71828183,  19.08553692,   0.        ]])
In [575]: sA.expm1().A+1
Out[575]: 
array([[  1.        ,   7.3890561 ,   2.71828183],
       [  7.3890561 ,   1.        ,  20.08553692],
       [  2.71828183,  20.08553692,   1.        ]])

此方法将np.expm1应用于其data,并返回具有相同稀疏度的副本。 np.expm1(sA)也有效。

sA.expm1()+1不起作用。你必须首先使矩阵密集。