【问题标题】:python how to inverse a sparse matrix [closed]python如何逆稀疏矩阵[关闭]
【发布时间】:2016-11-08 18:55:11
【问题描述】:

我试过 scipy.[sparse].linalg.inv。它返回一个矩阵不是正方形的错误。

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

任何人都可以帮助我如何反转类型为的 scipy CSR 矩阵:

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

【问题讨论】:

  • 你需要去学习一些线性代数。你的矩阵不是方阵,只有方阵实际上有逆矩阵。

标签: python numpy matrix scipy


【解决方案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 - 因为它不知道如何正确读取该数据结构

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 ofAis expected to be non-sparse, it will likely be faster to convertAto 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

【讨论】:

    【解决方案2】:

    尝试查看 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 矩阵方法,但如果没有,您可以使用“my_csr_matrix.toarray()”方法将您的 CSR 转换为 numpy 矩阵,但是,请考虑开销等(这将取决于应用程序是否可以)。

    【讨论】:

    • 我试过 my_csr_matrix.toarray() 和 np.linalg.inv。每次我使用 numpy.它显示 LinAlgError: 0-dimensional array given。数组必须至少是二维的
    • (1) 你能分享你的代码吗?(2) 注意“pinv”中的“p”,它不是“inv”。
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2023-04-10
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多