首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用每行与向量之间的余弦距离创建数据框列

使用每行与向量之间的余弦距离创建数据框列
EN

Stack Overflow用户
提问于 2019-09-12 23:35:22
回答 1查看 646关注 0票数 0

我有以下数据帧:

代码语言:javascript
代码运行次数:0
运行
复制
file_1  0.797647  ...  0.000000
file_2  0.000000  ...  0.000000
file_3  0.000000  ...  0.000000

让我们称它为df。每一行都有一个索引(file_x)和4096列(没有名称)。

我还有一个大小为4096的向量(称为test_file),我想为它计算与df中的每一行的余弦相似度。其基本思想是将结果追加到一个新列中,我可以对该列进行排序,以获得最佳的5个结果。

到目前为止,我一直使用iterrows()在向量和每一行之间执行cosine_similarity度量。

代码语言:javascript
代码运行次数:0
运行
复制
for index, row in df.iterrows():
    cos_sim = cosine_similarity(row.values.reshape(1, -1), test_file)

但是对于性能问题,我更喜欢使用更适合于矩阵计算的pandas或numpy方法。

我正在研究使用lambda函数的.apply().assign()方法,但我不知道如何继续(所有示例都使用了我没有的命名列)。

我想做一些像这样的事情

代码语言:javascript
代码运行次数:0
运行
复制
df.assign(cos_sim = cosine_similarity(df[:], test_file))

但是如何让当前行对其进行相似度运算呢?

我还使用df["cos_dist"] = cdist(np.stack(df.vector), test_file, metric="cosine")之类的东西研究了scipy库中的cdist,但我不知道如何保留原始数据帧中的索引信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-13 03:14:25

不需要apply,只需让sklearn在整个数组上进行计算即可:

代码语言:javascript
代码运行次数:0
运行
复制
df['cos_sim'] = cosine_similarity(df, test_file).reshape(-1)

示例:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd, numpy as np
from sklearn.metrics.pairwise import cosine_similarity

n,m = 4,3
np.random.seed(0)
df = pd.DataFrame(np.random.randn(m,n), index=['file_{}'.format(i) for i in range(1,m+1)])
test_file = np.random.randn(1,n)

df['cos_sim'] = cosine_similarity(df, test_file).reshape(-1)
print(df)

#               0         1         2         3   cos_sim
#file_1  1.764052  0.400157  0.978738  2.240893  0.890653
#file_2  1.867558 -0.977278  0.950088 -0.151357  0.760393
#file_3 -0.103219  0.410599  0.144044  1.454274  0.360205
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57910151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档