2016-11-08 189 views
0

我试过scipy。[sparse] .linalg.inv。它返回一个矩阵不是正方形的错误。python如何反转稀疏矩阵

我试过numpy.linalg.inv,它返回一个错误,它显示我传递了一个0维数组。

谁能帮助我如何逆A 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]]) 

做一个稀疏副本:

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

toarraypinv是同样的事情之前:

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 inv - 因为它不知道如何正确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

此外,由于您使用的CSR矩阵从SciPy的图书馆中,我认为速度的问题,所以阅读:

The difference of pseudo-inverse between SciPy and Numpy

我不确定CSR矩阵是否有与pinv相似的方法,但是如果不是,可以使用“my_csr_matrix.toarray()”方法将CSR转换为一个numpy矩阵,但考虑开销等(这将取决于应用程序好或不好)。

+0

我试过my_csr_matrix.toarray()和np.linalg.inv。每次我使用numpy的方法。它显示LinAlgError:给出的0维数组。数组必须至少是二维的 – Kyle

+1

(1)您可以请您分享您的代码,并且(2)注意“pinv”中的“p”,它不是“inv”。 – denvar