【发布时间】:2019-05-21 09:02:00
【问题描述】:
我在计算 100 维向量的大型列表之间的余弦相似度时遇到问题。当我使用 from sklearn.metrics.pairwise import cosine_similarity 时,我在 16 GB 的机器上得到了 MemoryError。每个数组都非常适合我的记忆,但在 np.dot() 内部调用期间我得到了 MemoryError
这是我的用例以及我目前的处理方式。
这是我的 100 维父向量,我需要将其与其他 500,000 个相同维度(即 100)的不同向量进行比较
parent_vector = [1, 2, 3, 4 ..., 100]
这是我的子向量(本例中包含一些虚构的随机数)
child_vector_1 = [2, 3, 4, ....., 101]
child_vector_2 = [3, 4, 5, ....., 102]
child_vector_3 = [4, 5, 6, ....., 103]
.......
.......
child_vector_500000 = [3, 4, 5, ....., 103]
我的最终目标是获得与父向量具有非常高余弦相似度的前 N 个子向量(其名称如 child_vector_1 及其对应的余弦分数)。
我目前的方法(我知道这种方法效率低且消耗内存):
第 1 步:创建以下形状的超级数据框
parent_vector 1, 2, 3, ....., 100
child_vector_1 2, 3, 4, ....., 101
child_vector_2 3, 4, 5, ....., 102
child_vector_3 4, 5, 6, ....., 103
......................................
child_vector_500000 3, 4, 5, ....., 103
第2步:使用
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(df)
获取所有向量之间的成对余弦相似度(如上图所示)
第 3 步:制作一个元组列表以存储 key(例如 child_vector_1)和值(例如所有此类组合的余弦相似度数)。
第 4 步: 使用列表中的sort() 获取前 N 个 - 这样我就可以得到子向量名称以及它与父向量的余弦相似度分数。
PS:我知道这非常低效,但我想不出更好的方法 更快地计算每个子向量之间的余弦相似度的方法 和父向量,并获取前 N 个值。
任何帮助将不胜感激。
【问题讨论】:
-
您能否提供一些示例数据以供使用。另外,请提供关于小样本数据和所需输出的工作解决方案,以便 SO 社区可以提出更有效的替代方案。
-
@sgokhales 即使我也面临同样的问题。您解决了问题吗?
标签: python numpy dataframe cosine-similarity