2010-02-12 14 views
13

Estoy tratando de obtener la inversa izquierda de una matriz no cuadrada en python usando numpy o scipy. ¿Cómo puedo traducir el siguiente código de Matlab a Python?Izquierda inversa en 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 

¿Hay un numpy o equivalente scipy de la izquierda del operador inversa \ en Matlab?

+0

Usted puede encontrar este enlace útil: http://mathesaurus.sourceforge.net/ matlab-numpy.html No estoy seguro si será una Sin embargo, responden a esta pregunta específica. – SapphireSun

Respuesta

9

Use linalg.lstsq(A,y) desde A is not square. Ver here para más detalles. Puede usar linalg.solve(A,y) si A es cuadrado, pero no en su caso.

+0

Estoy usando el módulo scipy.sparse, y A es una matriz dispersa. ¿Funciona linalg.lstsq (A, y) si A es escaso? – dzhelil

+0

Bueno, puede hacer 'scipy.linalg.lstsq (A.todense(), y.todense())', pero eso puede no ser una opción debido a la velocidad o la memoria. No estoy seguro acerca de 'lstsq' directamente en matrices dispersas. Este hilo puede ser de interés: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

Yo no lo he probado, pero de acuerdo con this web page es:

linalg.solve(A,y) 
+2

Eso es lo que estaba pensando, pero '\' en matlab solo lo hace si A es un matriz cuadrada. En ese caso, debe usar linalg.lstsq como dice Ramashalanka. –

2

También puede buscar el equivalente de la función pseudo-inversa pinv en numpy/scipy, como alternativa a las otras respuestas que es.

2

Aquí es un método que trabaja con matrices dispersas (que a partir de sus comentarios es lo que quiere), que utiliza la función leastsq del paquete optimizar el

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

Es algo feo debido a la forma en que tenía que conseguir las formas para que coincidieran de acuerdo con lo que leastsq quería. Tal vez alguien más sepa cómo hacer esto un poco más ordenado.

También he intentado hacer que algo funcione con las funciones en scipy.sparse.linalg utilizando LinearOperators, pero fue en vano. El problema es que todas esas funciones están hechas para manejar funciones cuadradas solamente. Si alguien encuentra una manera de hacerlo de esa manera, me gustaría saberlo también.

2

Para aquellos que deseen para resolver grandes problemas dispersos menos plazas:

He añadido el algoritmo LSQR a SciPy. Con la próxima versión, podrás hacer:

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) 

que devuelve la respuesta [1, 2].

Si desea utilizar esta nueva funcionalidad sin actualizar SciPy, puede descargar lsqr.py desde el repositorio de código en

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

0

Puede utilizar lsqr de scipy.sparse.linalg para resolver matriz dispersa sistemas con mínimos cuadrados

0

se puede calcular la inversa por la izquierda usando cálculos matriciales:

import numpy as np 

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

(¿Por qué?Porque:

enter image description here

)

prueba:

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

Resultado:

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