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的一个接近答案吗? 两个输出都附有。答案甚至都没有。
答案 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
不起作用。你必须首先使矩阵密集。