计算 2 行向量的 cos 相似度,而不是所有成对的 cdists
computing cos similarity of 2 row vectors, not all pairwise cdists
我有两个 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 的结果矩阵,其中每一行都是来自触发器和操作的相应行向量之间的余弦相似度。
我已经搜索过,但找不到执行此操作的方法。
你可以自己计算余弦相似度。
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
我有两个 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 的结果矩阵,其中每一行都是来自触发器和操作的相应行向量之间的余弦相似度。
我已经搜索过,但找不到执行此操作的方法。
你可以自己计算余弦相似度。
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