【问题标题】:How to calculate pairwise cosine distance of matrix using broadcasting in python如何在python中使用广播计算矩阵的成对余弦距离
【发布时间】:2023-12-31 23:20:01
【问题描述】:

我有一个这样的矩阵,其中每一行都是一个向量,并且需要在不使用循环的情况下计算向量之间的成对余弦距离(在本例中,作为 2x2 矩阵)?我了解笛卡尔距离可以填充一个维度,但不知道这里的最佳方法。

m = np.array([[1, 3, 5],[2,6,10]])

【问题讨论】:

  • 为什么不允许使用循环?这似乎是一个武断的步骤,确实会限制你的进步。
  • @RoboMop Looping 被禁止,以确保学生理解numpy广播功能的隐式迭代。

标签: python numpy


【解决方案1】:

这种类型的问题会让你斥责“堆栈不适合做作业”,但我想你可以这样做......

from numpy import linalg as LA
import numpy as np
m = np.array([[1, 3, 5],[2,6,10]])
cos = float(sum(m[0]*m[1]))/float(LA.norm(m[0])*LA.norm(m[1]))

当然,如果你想避免使用linlag

float(sum(m[0]*m[1]))/(float(sum(m[0]*m[0]))**0.5*float(sum(m[1]*m[1]))**0.5)

查看链接->https://en.wikipedia.org/wiki/Cosine_similarity

【讨论】:

  • 谢谢,但我应该指定我正在寻找一种避免循环的通用解决方案,而不是假设它只是 2 个向量
  • 我不知道如何在没有循环的情况下进行成对组合对不起。就像您可以使用 ittertoolsmap 一样,或者您可以在一个类中容纳计算,但我认为这超出了这一点,因为您仍然需要一个循环来生成结果成对矩阵。