2010-02-12 10 views
13

Ich versuche, die linke inverse einer nicht-quadratischen Matrix in Python mit entweder numpy oder scipy zu erhalten. Wie kann ich den folgenden Matlab-Code in Python übersetzen?Linke inverse in numpy oder scipy?

>> A = [0,1; 0,1; 1,0] 

A = 

    0  1 
    0  1 
    1  0 

>> y = [2;2;1] 

y = 

    2 
    2 
    1 

>> A\y 

ans = 

    1.0000 
    2.0000 

Gibt es eine numpy oder scipy Äquivalent des linken inversen \ Operator in Matlab?

+0

Sie können diesen Link hilfreich: http://mathesaurus.sourceforge.net/ matlab-numpy.html Ich bin mir nicht sicher, ob es a nswer diese spezifische Frage obwohl. – SapphireSun

Antwort

9

Verwenden Sie linalg.lstsq(A,y), da A nicht quadratisch ist. Details siehe here. Sie können linalg.solve(A,y) verwenden, wenn A quadratisch ist, aber nicht in Ihrem Fall.

+0

Ich benutze das scipy.sparse Modul, und A ist eine spärliche Matrix. Funktioniert linalg.lstsq (A, y), wenn A spärlich ist? – dzhelil

+0

Nun können Sie tun 'scipy.linalg.lstsq (A.todense(), y.todense())', aber das ist möglicherweise keine Option aufgrund der Geschwindigkeit oder Speicher. Nicht sicher über 'lstsq' direkt auf dünn besetzten Matrizen. Dieser Thread könnte von Interesse sein: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

ich es nicht getestet haben, aber nach this web page es ist:

linalg.solve(A,y) 
+2

Das ist, was ich dachte, aber '\ 'in Matlab tut nur, wenn A ist quadratische Matrix. In diesem Fall müssen Sie linalg.lstsq verwenden, wie Ramashalanka sagt. –

2

Sie auch für das Äquivalent der pseudo-inverse Funktion pinv in numpy/scipy, als Alternative zu den anderen Antworten suchen kann, die ist.

2

Hier ist eine Methode, die mit spärlichen Matrizen arbeitet (die aus Ihren Kommentaren ist, was Sie wollen), die die leastsq Funktion aus dem optimize Paket

from numpy import * 
from scipy.sparse import csr_matrix 
from scipy.optimize import leastsq 
from numpy.random import rand 

A=csr_matrix([[0.,1.],[0.,1.],[1.,0.]]) 
b=array([[2.],[2.],[1.]]) 

def myfunc(x): 
    x.shape = (2,1) 
    return (A*x - b)[:,0] 

print leastsq(myfunc,rand(2))[0] 

erzeugt

[ 1. 2.] 

Es verwendet ist irgendwie hässlich, weil ich die Formen so zusammenbringen musste, dass sie sich an die Anforderungen von mindestsq anpassen. Vielleicht weiß jemand anders, wie man das etwas aufgeräumter macht.

Ich habe auch versucht, etwas mit den Funktionen in scipy.sparse.linalg zu arbeiten, indem Sie die LinearOperators verwenden, aber ohne Erfolg. Das Problem ist, dass all diese Funktionen nur für quadratische Funktionen verwendet werden. Wenn jemand einen Weg findet, dies zu tun, würde ich es gerne wissen.

2

Für diejenigen, die große spärlich kleinsten Quadrate Probleme lösen wollen:

ich den LSQR Algorithmus SciPy hinzugefügt haben. Mit der nächsten Version, werden Sie in der Lage zu tun:

from scipy.sparse import csr_matrix 
from scipy.sparse.linalg import lsqr 
import numpy as np 

A = csr_matrix([[0., 1], [0, 1], [1, 0]]) 
b = np.array([[2.], [2.], [1.]]) 

lsqr(A, b) 

die die [1, 2] Antwort zurückgibt.

Wenn Sie ohne ein Upgrade SciPy diese neue Funktionalität nutzen möchten, können Sie lsqr.py aus dem Code-Repository bei

http://projects.scipy.org/scipy/browser/trunk/scipy/sparse/linalg/isolve/lsqr.py

0

Sie lsqr von scipy.sparse.linalg Sparse Matrix zu lösen herunterladen können verwenden können Systeme mit der kleinsten Quadrate

0

Sie können die linken inverse Matrix unter Verwendung Berechnungen berechnen:

import numpy as np 

linv_A = np.linalg.solve(A.T.dot(A), A.T) 

(Warum?Denn:

enter image description here

)

Test:

np.set_printoptions(suppress=True, precision=3) 
np.random.seed(123) 

A = np.random.randn(3, 2) 
print('A\n', A) 

A_linv = np.linalg.solve(A.T.dot(A), A.T) 
print('A_linv.dot(A)\n', A_linv.dot(A)) 

Ergebnis:

A 
[[-1.086 0.997] 
[ 0.283 -1.506] 
[-0.579 1.651]] 
A_linv.dot(A) 
[[ 1. -0.] 
[ 0. 1.]]