在Python中计算大型稀疏矩阵的乘积

7
我想要相乘两个大的稀疏矩阵。第一个矩阵是150,000x300,000,第二个矩阵是300,000x300,000。第一个矩阵有大约1,000,000个非零项,第二个矩阵有大约20,000,000个非零项。是否有一种简单的方法来获取这些矩阵的乘积?
我目前正在使用csr或csc格式存储矩阵,并尝试matrix_a * matrix_b。这会导致错误ValueError:array is too big。
我猜想我可以使用pytables将单独的矩阵存储在磁盘上,将它们拆分成较小的块,并从许多块的乘积构建最终矩阵乘积。但我希望实现相对简单的解决方案。
编辑:我希望有一个适用于任意大的稀疏矩阵的解决方案,同时隐藏(或避免)在内存和磁盘之间移动单个块涉及的账务处理。

结果应该具有什么形状? - eumiro
@miro: 150,000乘以300,000。但我预计产品仍将稀疏。 - DanB
1个回答

6
奇怪的是,下面这个方法对我起作用了:
import scipy.sparse
mat1 = scipy.sparse.rand(150e3, 300e3, density=1e6/150e3/300e3)
mat2 = scipy.sparse.rand(300e3, 300e3, density=20e6/150e3/300e3)
cmat1 = scipy.sparse.csc_matrix(mat1)
cmat2 = scipy.sparse.csc_matrix(mat2)
res = cmat1 * cmat2

我正在使用最新的scipy。Python使用的RAM量约为3GB。
也许你的矩阵乘积不是非常稀疏的?

上面对 sparse.rand 的第一次调用给了我“ValueError: Trying to generate a random sparse matrix such as the product of dimensions is greater than 2147483647 - this is not supported on this machine.”这个错误。这台机器正在运行32位Ubuntu 12.04。 - DanB
1
@DanB:scipy.sparse.rand错误是一个已知的问题(请参见此处以获取解决方法)。 - talonmies
我认为问题在于您的机器是32位的。您当前矩阵乘法问题的内存使用量达到了几个G,因此很容易超过32位内存分配的限制。所以如果您只能使用32位机器,您将不得不采用分块或基于磁盘的乘法方法。我认为这是解决办法。 - sega_sai
@sega_sai:这正是我本来期望要做的(尽管我没有意识到我应该能够在64位机器上处理这个问题)。我的更深层次的问题是“最直接的按块或基于磁盘的乘法方式是什么”。我想避免在内存和磁盘之间来回切换块所涉及的繁琐工作。 - DanB
@DanB - 你最终搞定了乘法吗?你是怎么做到的? - idoda

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