小矩阵的 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)

然后我通过对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

我遇到了内存错误。但是,我检查了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 的内存占用超高?

【问题讨论】:

s_diag 是密集的。 tmp 也。您正在小二维上组合 tmpvt。所以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)

【讨论】:

谢谢回复,但uvts_diag属于numpy.ndarray类型,没有toarray属性

以上是关于小矩阵的 Numpy 点积 MemoryError的主要内容,如果未能解决你的问题,请参考以下文章

Numpy:点积和 dot() 矩阵相乘

scipy稀疏矩阵和numpy数组之间的点积给出ValueError

生成 numpy.MultivariateNormal 时出现 MemoryError

为什么两个numpy (n,)向量的矩阵@乘积是点积,而不是外积?

NumPy 点积:取向量积的积(而不是求和)

Python Numpy中的几个矩阵乘法