【发布时间】:2019-02-02 12:54:34
【问题描述】:
我有一个形状为(300, ) 的一维数组和一个形状为(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] 被二维数组替换?
【问题讨论】:
-
你的输出是(300,)?如果你有 400 个向量要“测试”,那么你的输出将是 (400,),一个简单的点积就可以了......
-
@Julien 感谢您发现错字。改正了
-
你的余弦相似度计算是什么?您可以给我们一个完整的工作示例,其中包含 (4,3) 和 (3,) 形状的数组。
-
@hpaulj 用这些细节更新了问题。请检查!
-
对于两个二维数组的通用解决方案,请参阅我的另一篇文章stackoverflow.com/a/61643023/13484859
标签: python arrays numpy cosine-similarity