如何计算一个巨大稀疏矩阵的(1 - 稀疏矩阵)?

3
我对此进行了大量研究,但没有找到实际的解决方案。我正在使用scipy创建csr稀疏矩阵,并希望从全部为1的等效矩阵中减去此矩阵。在scipy和numpy符号中,如果矩阵不是稀疏的,我们可以通过简单地编写1-MatrixVariable来实现。然而,如果矩阵是稀疏的,就没有实现这个操作。我能想到以下显而易见的解决方案:遍历整个稀疏矩阵,将所有零元素设置为1,所有非零元素设置为0。但这将创建一个大多数元素为1,只有少数元素为0的矩阵,这不再是稀疏矩阵,并且由于其巨大的大小,无法转换为密集矩阵。有什么替代和有效的方法吗?谢谢。

你想用这个 1 - matrix 做什么?或许可以在不创建中间结果的情况下实现。 - YXD
2个回答

1

您的新矩阵不会是稀疏的,因为它将在任何地方都有1,所以您需要一个密集的数组来保存它:

new_mat = np.ones(sps_mat.shape, sps_mat.dtype) - sps_mat.todense()

这需要您的矩阵适合内存。实际上,它需要在内存中适合3次。如果这是一个问题,您可以通过以下方式使其更有效:

new_mat = sps_mat.todense()
new_mat *= -1
new_mat += 1

1
@Bhanu 嗯,问题的关键在于你的矩阵不再是稀疏的了。如果你想在一般情况下使用这个新矩阵,那么没有简单的方法可以做到。另一方面,如果你正在寻找某些特定的应用程序,那么也许有一个解决方法。但是如果我们不知道你想要它做什么,我们就无法提供帮助。 - Jaime
是的,没错。事实上,新矩阵就像稀疏矩阵一样,但它将有很多1而非很多0。我正在尝试在Theano的RBM中计算伪似然值,具体请参见方法:“get_pseudo_likelihood_cost”链接 - bitspersecond

0

您可以将稀疏矩阵中的数据作为一维数组进行访问,如下:

ss.data *= -1
ss.data += 1

对于稀疏矩阵中所有非零元素,将像1-ss一样工作。


谢谢,但我确实需要使用稀疏矩阵的所有元素值。例如:f = mean((1-ss) * vector) - bitspersecond
但是这种方法会使用稀疏矩阵的所有元素。使用 ss.data 是访问和更改它们的一种方式... - Saullo G. P. Castro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接