Оставленная инверсия в numpy или scipy?

Я пытаюсь получить левую инверсию неквадратной матрицы в 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?

13
задан Amro 4 August 2012 в 03:55
поделиться

5 ответов

Используйте linalg.lstsq (A, y) , поскольку A не является квадратным. Подробнее см. здесь . Вы можете использовать linalg.решить (A, y) , если A квадратный, но не в вашем случае.

9
ответ дан 2 December 2019 в 00:03
поделиться

Вот метод, который будет работать с разреженными матрицами (что, судя по вашим комментариям, вам и нужно), который использует функцию 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, но безуспешно. Проблема в том, что все эти функции предназначены только для работы с квадратичными функциями. Если кто-нибудь найдет способ сделать это таким образом, я бы тоже хотел узнать.

2
ответ дан 2 December 2019 в 00:03
поделиться

Вы также можете найти эквивалент псевдообратной функции pinv в numpy / scipy в качестве альтернативы другим существующим ответам.

2
ответ дан 2 December 2019 в 00:03
поделиться

Я не тестировал его, но согласно этой веб-странице это:

linalg.solve(A,y)
0
ответ дан 2 December 2019 в 00:03
поделиться

Для тех, кто хочет решать большие разреженные задачи наименьших квадратов:

Я добавил алгоритм 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

2
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: