如何计算scipy中稀疏矩阵的广义逆

时间:2012-11-02 04:42:28

标签: numpy scipy sparse-matrix scientific-computing matrix-inverse

我有一个稀疏矩阵W,当我使用linalg.pinv(W)时,它会抛出一些错误:

Traceback (most recent call last):
  File "/Users/ad9075/PycharmProjects/bednmf/test.py", line 14, in testNmfRun
    self.factor = factorization(self.V)
  File "/Users/ad9075/PycharmProjects/bednmf/nmf.py", line 18, in factorization
    W_trans = linalg.pinv(W)
  File "/Library/Python/2.7/site-packages/scipy/linalg/basic.py", line 540, in pinv
    b = np.identity(a.shape[0], dtype=a.dtype)
IndexError: tuple index out of range`

但是当我将其修改为linalg.pinv(W.todense())时,效果很好。但是,如果我想计算 Generaized inverse ,我真的需要转换稀疏矩阵吗?有没有人有这方面的想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

稀疏矩阵的逆(和广义逆)通常是密集的,除非您可以置换矩阵的行和列,使其成为块对角线。

因此,您的问题分为两部分:(i)找到使其成为块对角线的置换,以及(ii)为每个块分别使用linalg.pinv计算广义逆。如果矩阵足够小,只需先将其转换为密集矩阵,然后计算伪逆也是有效的。

另一方面,如果你想要计算类似“A ^ { - 1} x”的东西,那么使用gmres或其他一些迭代例程可能是一种更有效的解决方案。

答案 1 :(得分:0)

你的答案就在这里:Good matrix inversion routines in C(不要让标题打扰你,讨论是关于scipy)

但你必须知道逆矩阵不一定是稀疏矩阵,正如George E. Forsythe和Cleve B. Moler所说:

  

“几乎任何你可以用A ^ { - 1}完成的事情都可以在没有它的情况下完成”