15

numpyまたはscipyを使用して、Pythonで非正方行列の左逆行列を取得しようとしています。次の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

\Matlabに左逆演算子に相当するnumpyまたはscipyはありますか?

4

7 に答える 7

10

は正方形ではないlinalg.lstsq(A,y)ので使用してください。A詳細はこちらをご覧ください。が正方形のlinalg.solve(A,y)場合は使用できますが、あなたの場合は使用できません。A

于 2010-02-12T08:20:10.087 に答える
2

他の答えの代わりに、で疑似逆関数pinvに相当するものを探すこともできます。numpy/scipy

于 2010-02-12T14:58:25.423 に答える
2

これは、optimizeパッケージの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.]

lesssqが望むものに応じて形状を一致させる必要があったため、これはちょっと醜いです。多分誰か他の人がこれをもう少し整頓する方法を知っています。

また、LinearOperatorsを使用して、scipy.sparse.linalgの関数で動作するようにしようとしましたが、役に立ちませんでした。問題は、これらの関数がすべて正方形の関数のみを処理するように作成されていることです。誰かがその方法を見つけたら、私も知りたいです。

于 2010-02-12T17:10:54.187 に答える
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

于 2010-03-02T19:21:22.220 に答える
1

行列計算を使用して左逆行列を計算できます。

import numpy as np

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

(なぜですか?理由:

ここに画像の説明を入力してください

)。

テスト:

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.]]
于 2017-02-06T11:27:38.207 に答える
0

私はそれをテストしていませんが、このWebページによると次のとおりです。

linalg.solve(A,y)
于 2010-02-12T08:23:21.157 に答える
0

scipy.sparse.linalgのlsqrを使用して、最小二乗法のスパース行列システムを解くことができます。

于 2011-05-10T22:20:29.900 に答える