Я пытаюсь получить левую инверсию неквадратной матрицы в Python с помощью или numpy или scipy. Как я могу перевести следующий код Matlab в Python?
>> 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
Есть ли numpy или scipy эквивалент левой инверсии \
оператор в Matlab?
Используйте linalg.lstsq (A, y)
, поскольку A
не является квадратным. Подробнее см. здесь . Вы можете использовать linalg.решить (A, y)
, если A
квадратный, но не в вашем случае.
Вот метод, который будет работать с разреженными матрицами (что, судя по вашим комментариям, вам и нужно), который использует функцию leastsq из пакета optimize
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]
generates
[ 1. 2.]
Он немного уродлив из-за того, что мне пришлось приводить формы в соответствие с тем, чего хотел leastsq. Возможно, кто-то знает, как сделать это более аккуратно.
Я также пытался заставить что-то работать с функциями из scipy.sparse.linalg, используя LinearOperators, но безуспешно. Проблема в том, что все эти функции предназначены только для работы с квадратичными функциями. Если кто-нибудь найдет способ сделать это таким образом, я бы тоже хотел узнать.
Вы также можете найти эквивалент псевдообратной функции pinv
в numpy / scipy
в качестве альтернативы другим существующим ответам.
Я не тестировал его, но согласно этой веб-странице это:
linalg.solve(A,y)
Для тех, кто хочет решать большие разреженные задачи наименьших квадратов:
Я добавил алгоритм LSQR в SciPy. В следующем релизе вы сможете сделать:
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)
что вернет ответ [1, 2]
.
Если вы хотите использовать эту новую функциональность без обновления SciPy, вы можете загрузить lsqr.py
из репозитория кода по адресу
http://projects.scipy.org/scipy/browser/trunk/scipy/sparse/linalg/isolve/lsqr.py