计算2个行向量的cos相似度,而不是所有成对的cdists

时间:2018-04-15 20:56:54

标签: python scikit-learn cosine-similarity

我有两个pandas df触发器和动作,包含在行中写入的25维特征向量,并希望相应行之间的余弦相似性。下面的代码生成20675 x 20675成对余弦相似度矩阵:

trigger.shape
(20675, 25)
action.shape
(20675, 25)
from scipy.spatial.distance import cdist
result = cdist(trigger, action, metric='cosine')
result.shape
(20675, 20675)

我想得到一个形状为20675 x 1的结果矩阵,其中每一行是来自触发器和动作的相应行向量之间的余弦相似性。

我已经搜索过,无法找到办法。

1 个答案:

答案 0 :(得分:1)

您可以自己计算余弦相似度。

from scipy import lingalg
cosineSim1 = 1 - np.sum(a * b, axis=-1)/(linalg.norm(a,axis=-1) * linalg.norm(b,axis=-1))

测试您是否获得正确的值:

from scipy import spatial
cosineSim2 = []
for row_a, row_b in zip(a,b):
    cosineSim2.append(spatial.distance.cosine(row_a, row_b))
np.allclose(cosineSim1, cosineSim2). # Should output True

时间测试:

timeit.timeit(func1, number=100)   # computes cosineSim1
0.006364107131958008

timeit.timeit(func2, number=100)  # computes cosineSim2
0.34532594680786133