2017-10-06 283 views
0
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) 

我與大數據集的鄰接矩陣,我需要做的指數矩陣的工作指數(我用的是中信建投稀疏矩陣表示)。我是用玩具數據集像上面的錯誤測試並發現scipy.sparse.linalg.expm給出了與numpy.exp相同的numpy數組的不同答案。難道它sparse.linalg給出了numpy的一個密切的答案? 這兩個輸出都附上了。答案並不是很接近。以稀疏矩陣

enter image description here

回答

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.expm1data,並返回相同的稀疏副本。 np.expm1(sA)也有效。

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

+0

如何做一個稀疏矩陣元素明智的指數呢? –

+0

因爲'exp(0)'是1,所以指數將是密集的。所以儘可能稀疏計算可能沒有什麼優勢。查看我的編輯。 – hpaulj

+0

np.exp是否可以處理大型矩陣?我還需要在乘法之後進行乘法運算,因此,如果先將稀疏運算轉換爲稠密運算並再次稀疏乘法運算,那麼效率會不高? –