小矩阵的 Numpy 点积 MemoryError
Posted
技术标签:
【中文标题】小矩阵的 Numpy 点积 MemoryError【英文标题】:Numpy dot product MemoryError for small matrices 【发布时间】: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,这会导致内存错误吗?
是的,类似的东西!
【参考方案1】:
我认为您收到此错误是因为 np.dot 无法处理稀疏矩阵。
作为检查,请尝试将矩阵转换为完整的。
检查稀疏文档 (https://docs.scipy.org/doc/scipy/reference/sparse.html)
试试:
np.dot(u.toarray(), s_diag.toarray())
或使用
u.dot(s_diag)
【讨论】:
谢谢回复,但u
、vt
和s_diag
属于numpy.ndarray
类型,没有toarray
属性以上是关于小矩阵的 Numpy 点积 MemoryError的主要内容,如果未能解决你的问题,请参考以下文章
scipy稀疏矩阵和numpy数组之间的点积给出ValueError
生成 numpy.MultivariateNormal 时出现 MemoryError