矩阵 cosine_similarity 中的内存错误

数据挖掘 scikit-学习 推荐系统 余弦距离 电影镜头
2022-02-08 12:39:22

我有 (20905040, 7) 的数据集向用户推荐 10 种不同的产品,
它可能比这更大,但无论如何我在处理

cosine_sim = cosine_similarity(normalized_df,normalized_df)

-------------------------------------------------- ------------------------------------- MemoryError Traceback (last last最近调用) in 1 get_ipython().run_line_magic('time', '') -- --> 2 cosine_sim = cosine_similarity(normalized_df,normalized_df)

~/venv/lib/python3.6/site-packages/sklearn/metrics/pairwise.py in cosine_similarity(X, Y, dense_output) 1034 1035 K = safe_sparse_dot(X_normalized, Y_normalized.T, -> 1036 dense_output=dense_output) 1037第1038章

~/venv/lib/python3.6/site-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output) 140 return ret 141 else: --> 142 return np.dot(a, b) 143 144

内存错误:

问题
1. 当我有太多行时,如何应用余弦相似度?
2.他们在谈论内存吗?或者什么内存错误?
3.有没有办法使用gpu进行余弦相似度训练?
4. 有什么好主意吗?

1个回答

这是在谈论RAM。有几个因素将决定您可以使用多少行/列。而不是行/列,只考虑元素总数可能更容易:num_rows * num_cols. 您将需要的内存将与此数字有关。

有些方法可能需要更少的工作记忆来解决问题——通常内存和速度是权衡的一部分。如果在计算结果时使用更少的内存,则一次可以做的更少,因此需要更长的时间。

如果你有浮点数(带小数的),那么 Pandas 通常float64默认使用数据类型。您可以尝试float32改用。它提供了大约一半的准确性,但也只使用了一半的内存。您可以通过在计算之前简单地添加这一行来做到这一点cosine_similarity

import numpy as np

normalized_df = normalized_df.astype(np.float32)
cosine_sim = cosine_similarity(normalized_df, normalized_df)

这是一个关于使用 Keras 计算余弦相似度的线程,然后可以在 GPU 上完成。我要指出,(单个)GPU 的可用工作内存通常比您的计算机本身少。

这是一篇关于如何扩展计算以使用 Spark 等工具进行分布式计算的博客。如果您有几台计算机可用,这将允许您处理更大的矩阵。