小矩阵的Numpy dot product MemoryError

时间:2016-10-17 07:53:58

标签: numpy memory scipy sparse-matrix matrix-multiplication

我想实现奇异值分解(SVD)作为推荐系统的协同过滤方法。我有这个sparse_matrix,其中行表示用户和列表示项目,每个矩阵条目表示用户项目评级。

>>> type(sparse_matrix)
scipy.sparse.csr.csr_matrix

首先,我使用SVD对此矩阵进行了分解:

from scipy.sparse.linalg import svds
u, s, vt = svds(sparse_matrix.asfptype(), k = 2)
s_diag = np.diag(s)

然后我通过取us_diagvt的点积来进行预测:

>>> tmp = np.dot(u, s_diag)
>>> pred = np.dot(tmp, vt)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

我得到了一个MemoryError。但是,我检查了tmpvt的大小和内存使用情况:

>>> tmp.shape
(686556, 2)
>>> tmp.nbytes
10984896
>>> vt.shape
(2, 85539)
>>> vt.nbytes
1368624

表示tmp约为11MB,vt为1.4MB。但是在np.dot(tmp, vt)时,我的系统有超过50GB的可用内存,这对于这个计算似乎已经足够了。那么为什么我会得到这个MemoryError?我的代码有问题吗?或者np.dot在内存使用方面是否超级昂贵?

1 个答案:

答案 0 :(得分:0)

我认为你得到这个错误,因为np.dot无法处理稀疏矩阵。

作为检查,请尝试将矩阵转换为完整。

检查稀疏文档(https://docs.scipy.org/doc/scipy/reference/sparse.html

尝试:

np.dot(u.toarray(), s_diag.toarray())

或使用

u.dot(s_diag)