首页 > 解决方案 > 计算一维数组和二维数组中所有行之间余弦相似度的有效方法

问题描述

我有一个 1D 数组 shape(300, )和一个 2D 数组 shape (400, 300)。现在,我想计算这个二维数组中每一行与一维数组的余弦相似度。因此,我的结果应该是(400, )表示这些向量有多相似的形状。

我最初的想法是使用循环遍历二维数组中的行for,然后计算向量之间的余弦相似度。使用广播方法是否有更快的替代方案?

这是一个人为的例子:

In [29]: vec = np.random.randn(300,)
In [30]: arr = np.random.randn(400, 300)

下面是我想计算一维数组之间的相似性的方式:

inn = (vec * arr[0]).sum()  
vecnorm = numpy.sqrt((vec * vec).sum())  
rownorm = numpy.sqrt((arr[0] * arr[0]).sum())  
similarity_score = inn / vecnorm / rownorm  

我如何将其概括为arr[0]被二维数组替换?

标签: pythonarraysnumpycosine-similarity

解决方案


您可以使用cdist

import numpy as np
from scipy.spatial.distance import cdist


x = np.random.rand(1, 300)
Y = np.random.rand(400, 300)

similarities = 1 - cdist(x, Y, metric='cosine')
print(similarities.shape)

输出

(1, 400)

请注意,cdist返回cosine_distance(更多here),1 - cosine_similarity因此您需要转换结果。


推荐阅读