2010-02-12 20 views
13

Sto cercando di ottenere l'inversa a sinistra di una matrice non quadrata in python usando numpy o scipy. Come posso tradurre il seguente codice Matlab in Python?Sinistra inversa in numpy o 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 

Esiste un NumPy o equivalente SciPy della sinistra inversa \ operatore in Matlab?

+0

Si potrebbe trovare questo link utile: http://mathesaurus.sourceforge.net/ matlab-numpy.html Non sono sicuro che sarà un rispondi a questa domanda specifica però. – SapphireSun

risposta

9

Utilizzare linalg.lstsq(A,y) dal A non quadrato. Vedi here per i dettagli. Puoi usare linalg.solve(A,y) se A è quadrato, ma non nel tuo caso.

+0

Sto usando il modulo scipy.sparse e A è una matrice sparsa. Linalg.lstsq (A, y) funziona se A è scarso? – dzhelil

+0

Bene si può fare 'scipy.linalg.lstsq (A.todense(), y.todense())', ma potrebbe non essere un'opzione a causa della velocità o della memoria. Non sono sicuro di 'lstsq' direttamente su matrici sparse. Questo thread potrebbe essere di interesse: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

non l'ho provato, ma secondo this web page è:

linalg.solve(A,y) 
+2

Questo è quello che stavo pensando, ma "\" in matlab lo fa solo se A è un matrice quadrata. In tal caso, devi usare linalg.lstsq come dice Ramashalanka. –

2

Si può anche cercare l'equivalente della funzione di pseudo-inversa pinv in numpy/scipy, in alternativa alle altre risposte che è.

2

Qui è un metodo che funzionerà con matrici sparse (che dai vostri commenti è quello che volete), che utilizza la funzione leastsq dal pacchetto ottimizzare

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] 

genera

[ 1. 2.] 

E ' tipo di brutto a causa di come dovevo ottenere le forme per abbinarle secondo quanto volevano i leastsq. Forse qualcun altro sa come renderlo un po 'più ordinato.

Ho anche provato a far funzionare qualcosa con le funzioni in scipy.sparse.linalg utilizzando i LinearOperators, ma senza successo. Il problema è che tutte queste funzioni sono fatte per gestire solo le funzioni quadrate. Se qualcuno trova un modo per farlo in quel modo, mi piacerebbe saperlo.

2

Per coloro che desiderano per risolvere grandi sparse problemi di minimi quadrati:

ho aggiunto l'algoritmo LSQR a SciPy. Con la prossima release, sarete in grado di fare:

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) 

che restituisce la risposta [1, 2].

Se vuoi utilizzare questa nuova funzionalità senza aggiornare SciPy, è possibile scaricare lsqr.py dal repository di codice a

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

0

È possibile utilizzare lsqr da scipy.sparse.linalg per risolvere matrici sparse sistemi con minimi quadrati

0

È possibile calcolare l'inverso sinistra utilizzando calcoli con matrici:

import numpy as np 

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

(Perché?Perché:

enter image description here

)

prova:

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

Risultato:

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