【发布时间】:2017-02-26 03:01:34
【问题描述】:
我想实施奇异值分解 (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)
然后我通过对u、s_diag和vt的点积进行预测:
>>> tmp = np.dot(u, s_diag)
>>> pred = np.dot(tmp, vt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
我遇到了内存错误。但是,我检查了tmp 和vt 的大小和内存使用情况:
>>> 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 的内存占用超高?
【问题讨论】:
-
s_diag是密集的。tmp也。您正在小二维上组合tmp和vt。所以pred将是一个大的密集数组(686556, 85539) -
@hpaulj 你的意思是
pred将是686556*85539*8bytes = 470GB,这会导致内存错误吗? -
是的,类似的东西!
标签: numpy memory scipy sparse-matrix matrix-multiplication