1

我有一个稀疏矩阵 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()),它运行良好。但是,如果我想计算生成的矩阵,我真的需要转换稀疏矩阵吗?有人对此有想法吗?

谢谢!

4

2 回答 2

2

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

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

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

于 2012-11-03T13:56:13.650 回答
0

您的答案就在这里:C 中的良好矩阵求逆例程(不要让标题打扰您,讨论是关于 scipy 的)

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

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

于 2012-11-02T13:52:22.087 回答