我想实现奇异值分解(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
我得到了一个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
在内存使用方面是否超级昂贵?
答案 0 :(得分:0)
我认为你得到这个错误,因为np.dot无法处理稀疏矩阵。
作为检查,请尝试将矩阵转换为完整。
检查稀疏文档(https://docs.scipy.org/doc/scipy/reference/sparse.html)
尝试:
np.dot(u.toarray(), s_diag.toarray())
或使用
u.dot(s_diag)