2016-11-08 35 views
0

私はscipyを試しました。[sparse] .linalg.inv。行列が正方形ではないというエラーを返します。python疎行列を逆にする方法

私はnumpy.linalg.invを試しましたが、0次元配列を渡したというエラーを返します。

、誰もがそのタイプであるscipyのダウンロードCSR行列を逆にする方法私を助けることができます:

<10000x31331 sparse matrix of type '<type 'numpy.float64'>' 
    with 801667 stored elements in Compressed Sparse Row format> 
+6

あなたは、いくつかの線形代数を学ぶ行く必要があります。あなたの行列は正方形ではなく、実際に正方行列だけが逆行列を持ちます。 – user2357112

答えて

1

小さな配列行います

In [435]: A=np.array([[1,0,2,0],[0,1,3,0],[3,0,0,4]]) 
In [436]: A 
Out[436]: 
array([[1, 0, 2, 0], 
     [0, 1, 3, 0], 
     [3, 0, 0, 4]]) 
In [437]: np.linalg.pinv(A) 
Out[437]: 
array([[ 0.61538462, -0.36923077, 0.04615385], 
     [-0.57692308, 0.44615385, 0.06923077], 
     [ 0.19230769, 0.18461538, -0.02307692], 
     [-0.46153846, 0.27692308, 0.21538462]]) 

スパースコピーしてください:toarray

In [439]: M=sparse.csr_matrix(A) 

pinvは前と同じものである:

In [441]: np.linalg.pinv(M.toarray()) 
Out[441]: 
array([[ 0.61538462, -0.36923077, 0.04615385], 
     [-0.57692308, 0.44615385, 0.06923077], 
     [ 0.19230769, 0.18461538, -0.02307692], 
     [-0.46153846, 0.27692308, 0.21538462]]) 

は使用できませんスパース行列上に直接numpyを置く - それは正しい方法を知らないのでLY

In [442]: np.linalg.pinv(M) 
... 
LinAlgError: 0-dimensional array given. Array must be at least two-dimensional 

そのデータ構造を読んであり、スパースlinalg invがあるが、それはただspsolve(A,I)です。 If the inverse of A is expected to be non-sparse, it will likely be faster to convert A to dense and use scipy.linalg.inv.同じ警告がpinvまたは同等のものに当てはまる可能性があります。

私は手を離れていません。pinvはスパースリストにありますが、lsqrがあります。

===================

pseudo inverse of sparse matrix in python(2011)

擬似逆が密である可能性が高いという考えをサポートしています。しかし、それはまた、svdsを利用するまばらな解決策を示唆している。

また

How to calculate the generalized inverse of a Sparse Matrix in scipy

1

はnp.linalg.pinvを見てみた試してみてください。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.pinv.html

これが "行列の一般化された逆行列であり、これは矩形(そうでなければ、非正方形)行列に対して有効である。指摘したように、方形行列に固有の逆は存在しませんが、追加の要件(最小二乗で再構成誤差を最小限に抑える)を課すと、固有の解を得ることができます。その解釈にはちょっと注意してください。

あなたは時間があるときに、よりここにいくつかを読む:https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse

はまた、あなたがscipyのダウンロードライブラリからCSRマトリックスを用いているので、私はスピードの問題を前提とするので、この読み:

The difference of pseudo-inverse between SciPy and Numpy

を私はpinvに似たCSR行列のメソッドがあるかどうかは確かではありませんが、そうでない場合は、CSRを "my_csr_matrix.toarray()"メソッドのnumpy行列に変換できますが、オーバーヘッドなどを考慮してください(アプリケーション依存かどうかOKかどうか)。

+0

私はmy_csr_matrix.toarray()とnp.linalg.invを試しました。毎回numpyのメソッドを使用しました。 LinAlgError:0次元の配列を示しています。配列は少なくとも2次元でなければなりません – Kyle

+1

(1)あなたのコードを共有してください(2) "pinv"に "p"があることを気にしてください、それは "inv"ではありません。 – denvar