gpt4 book ai didi

python - 非常大数据集的余弦相似度

转载 作者:行者123 更新时间:2023-12-03 22:11:41 24 4
gpt4 key购买 nike

我在计算 100 维向量的大列表之间的余弦相似度时遇到问题。当我使用 from sklearn.metrics.pairwise import cosine_similarity , 我得到 MemoryError在我的 16 GB 机器上。每个数组都非常适合我的内存,但我得到 MemoryError期间np.dot()内部通话

这是我的用例以及我目前如何解决它。

这是我的 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 及其相应的余弦分数)。

我目前的方法(我知道这是低效且消耗内存的):

第一步:创建以下形状的 super 数据框
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 步:制作一个元组列表来存储 keychild_vector_1和值,例如所有这些组合的余弦相似度数。

第 4 步:使用 sort() 获取前 N 个列表 - 这样我就可以得到子向量名称以及它与父向量的余弦相似度分数。

PS: I know this is highly inefficient but I couldn't think of a better way to faster compute cosine similarity between each of child vector and parent vector and get the top-N values.



任何帮助将不胜感激。

最佳答案

即使您的 (500000, 100) 数组(父级及其子级)适合内存
任何关于它的成对度量都不会。原因是,顾名思义,成对度量计算任何两个 child 的距离。为了存储这些距离,您需要一个 (500000,500000) 大小的浮点数组,如果我的计算正确,它将需要大约 100 GB 的内存。

幸运的是,您的问题有一个简单的解决方案。如果我理解正确,您只想拥有 child 和 parent 之间的距离,这将导致长度为 500000 的向量很容易存储在内存中。

为此,您只需要为仅包含 parent_vector 的 cosine_similarity 提供第二个参数

import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

df = pd.DataFrame(np.random.rand(500000,100))
df['distances'] = cosine_similarity(df, df.iloc[0:1]) # Here I assume that the parent vector is stored as the first row in the dataframe, but you could also store it separately

n = 10 # or however many you want
n_largest = df['distances'].nlargest(n + 1) # this contains the parent itself as the most similar entry, hence n+1 to get n children

希望能解决你的问题。

关于python - 非常大数据集的余弦相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53875473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com