2010-02-12 3 views
13

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

+0

Вы можете найти эту ссылку полезным: http://mathesaurus.sourceforge.net/ matlab-numpy.html Я не уверен, что это будет Однако этот конкретный вопрос. – SapphireSun

ответ

9

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

+0

Я использую модуль scipy.sparse, а A - разреженная матрица. Работает ли linalg.lstsq (A, y), если A разрежен? – dzhelil

+0

Ну, вы можете сделать 'scipy.linalg.lstsq (A.todense(), y.todense())', но это может быть не вариант из-за скорости или памяти. Не уверены в 'lstsq' непосредственно на разреженных матрицах. Эта тема может представлять интерес: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

Я не проверял, но по this web page это:

linalg.solve(A,y) 
+2

Вот что я думал, но '' 'в matlab только делает это, если A является квадратная матрица. В этом случае вы должны использовать linalg.lstsq, как говорит Рамашаланка. –

2

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

2

Вот метод, который будет работать с разреженными матрицами (которые из ваших комментариев, что вы хотите), которая использует функцию leastsq из пакета оптимизируют

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] 

генерирует

[ 1. 2.] 

Это вроде уродливого из-за того, как мне нужно было получить фигуры, чтобы они соответствовали тому, что хотел наименьший. Может быть, кто-то еще знает, как сделать это немного более аккуратным.

Я также попытался получить что-то для работы с функциями в scipy.sparse.linalg с помощью LinearOperators, но безрезультатно. Проблема в том, что все эти функции предназначены для обработки только квадратных функций. Если кто-то найдет способ сделать это таким образом, я тоже хотел бы знать.

2

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

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

0

Вы можете использовать lsqr из scipy.sparse.linalg для решения разреженной матрицы системы с методом наименьших квадратов

0

можно рассчитать левый обратный с помощью матричных вычислений:

import numpy as np 

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

(Почему?Потому что:

enter image description here

)

Тест:

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

Результат:

A 
[[-1.086 0.997] 
[ 0.283 -1.506] 
[-0.579 1.651]] 
A_linv.dot(A) 
[[ 1. -0.] 
[ 0. 1.]] 
Смежные вопросы