2017-10-06 2 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) 

ich mit großen Datenmenge Adjazenzmatrix, wo ich exponentielle die Matrix tun müssen, arbeite (ich die csc Sparse Matrix Darstellung verwende) .Ich für Fehler-Datensatz wie oben unter Verwendung von Spielzeug testet und fand die scipy.sparse.linalg.expm gibt andere Antwort als numpy.exp für die gleiche numpy array.Souldnt es sparse.linalg geben eine enge Antwort auf die numpy one? Beide Ausgänge sind angeschlossen. Die Antworten sind nicht einmal knapp.Exponential einer Sparse Matrix Unter

enter image description here

Antwort

2

np.exp ist Element durch exponentielles Element. expm ist eine Matrix exponentiell, eine sehr unterschiedliche Berechnung.

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]]) 

Ich weiß nicht, ob es eine Funktion ist die spärliche exponentiell zu tun, aber die Stücke mit ausgewertet werden:

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 

Da die exp(0) ist 1, das Ergebnis, selbst mit einer dünnen Matrix, ist dicht. Es wäre also genauso einfach (und wahrscheinlich schneller), die dünn besetzte Matrix in dicht zu konvertieren und die Dichteberechnung durchzuführen.


Als @Desire kommentiert, gibt es eine np.expm1 Funktion. Und die Sparse Matrix hat

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.  ]]) 

Diese Methode gilt np.expm1 seine data, und gibt eine Kopie mit dem gleichen sparsity. np.expm1(sA) funktioniert auch.

sA.expm1()+1 funktioniert nicht. Sie müssen zuerst die Matrix dicht machen.

+0

Wie man elementweise Exponential einer dünnen Matrix dann tut? –

+0

Die Exponentialfunktion wird dicht sein, da 'exp (0)' 1 ist. Daher hat eine spärliche Berechnung, obwohl sie möglich ist, wahrscheinlich nur wenige Vorteile. Sieh dir meine Änderungen an. – hpaulj

+0

Kann np.exp auch mit großen Matrizen umgehen? Auch muss ich Multiplikation durchführen, nachdem ich die Multiplikation erhalten habe, also wird es nicht ineffizient sein, zuerst das Sparse in ein dichtes zu konvertieren, dann wieder in ein spärliches für die Multiplikation? –