我有以下数据帧:
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
度量。
for index, row in df.iterrows():
cos_sim = cosine_similarity(row.values.reshape(1, -1), test_file)
但是对于性能问题,我更喜欢使用更适合于矩阵计算的pandas或numpy方法。
我正在研究使用lambda函数的.apply()
或.assign()
方法,但我不知道如何继续(所有示例都使用了我没有的命名列)。
我想做一些像这样的事情
df.assign(cos_sim = cosine_similarity(df[:], test_file))
但是如何让当前行对其进行相似度运算呢?
我还使用df["cos_dist"] = cdist(np.stack(df.vector), test_file, metric="cosine")
之类的东西研究了scipy库中的cdist
,但我不知道如何保留原始数据帧中的索引信息。
发布于 2019-09-12 19:14:25
不需要apply
,只需让sklearn在整个数组上进行计算即可:
df['cos_sim'] = cosine_similarity(df, test_file).reshape(-1)
示例:
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
https://stackoverflow.com/questions/57910151
复制相似问题