【发布时间】:2014-09-13 23:51:01
【问题描述】:
我试图在一个巨大的矩阵和它自己之间找到点积。
矩阵的形状(371744、36154) 非零数 - 577731 [非常稀疏]
mat1 是 scipy.sparse.csr_matrix 如果我使用 mat1 * mat1.T 我得到一个值错误,这看起来是因为结果矩阵中有太多非零元素并且索引指针根据here溢出p>
dp_data = data_m * data_m.T
File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 247, in __mul__
return self._mul_sparse_matrix(other)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 300, in _mul_sparse_matrix
return self.tocsr()._mul_sparse_matrix(other)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 290, in _mul_sparse_matrix
indices = np.empty(nnz, dtype=np.intc)
ValueError: negative dimensions are not allowed
我也试过 np.dot
但是doc 说,
“从 NumPy 1.7 开始,np.dot 不知道稀疏矩阵,因此使用它会导致意外结果或错误。应该获得相应的密集矩阵首先是"
当我使用 mat1.toarray() 或 todense() 时出现内存错误,因为矩阵很大!!我有16GB的内存!该程序似乎适用于较小的输入!
data_array = data_m.toarray()
File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 550, in toarray
return self.tocoo(copy=False).toarray()
File "/usr/lib/python2.7/dist-packages/scipy/sparse/coo.py", line 219, in toarray
B = np.zeros(self.shape, dtype=self.dtype)
MemoryError
我正在使用 Numpy 版本 1.8.1 Numpy 版本 0.9.0
我还怎么做这个乘法?
【问题讨论】:
-
这是一个已知问题(您有更多适合 32 位 int 的非零项),已在最近的 scipy 版本中解决。更新到最新版本,您就可以上路了。
-
这行得通,但我仍然需要巨大的点积!我无法将其放入内存中,我现在出现内存错误!
-
购买更多内存怎么样?
-
如果我对 LinAlg 的记忆有问题,请提前原谅。你可以把问题分解成更小的块,以后可以重新组合吗? AB 会不会与 Abi 的 i 上的总和相同,其中 bi 是 B 的第 i 个 col?您可以扩展它并从 B 的子集制作矩阵(一次可能是 1/4 的列)。不知道这会有多有效,但我认为它会完成工作。也非常容易进行并行计算。
-
你试过用稀疏矩阵的
dot属性代替np.dot吗?
标签: python numpy scipy sparse-matrix matrix-multiplication