我有一个稀疏矩阵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 ,我真的需要转换稀疏矩阵吗?有没有人有这方面的想法?
谢谢!
答案 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}完成的事情都可以在没有它的情况下完成”