python - numpy ndarray 中匹配行之间的余弦相似度

标签 python arrays numpy distance cosine-similarity

我有 2 个 (n_samples, n_dimensions) 数组,并且我想要每对相应的行,因此输出将为 (n_samples, )

使用sklearn's implementation我得到 (n_samples, n_samples) 结果 - 这显然会进行大量不相关的计算,这在我的情况下是 Not Acceptable 。

使用1 - scipy's implementation是不可能的,因为它需要向量而不是矩阵。

执行我正在寻找的内容的最有效方法是什么?

最佳答案

假设两个数组xy具有相同的形状,

  1. 使用 np.einsum 计算逐元素点积 ( reference )
  2. 计算每行 xy 的 L2(欧几里得)范数的乘积
  3. 将 (1) 的结果除以 (2)

def matrix_cosine(x, y):
    return np.einsum('ij,ij->i', x, y) / (
              np.linalg.norm(x, axis=1) * np.linalg.norm(y, axis=1)
    )

还有一些要测试的代码;

x = np.random.randn(100000, 100)

%timeit matrix_cosine(x, x)
82.8 ms ± 2.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

assert np.allclose(matrix_cosine(x, x), np.ones(x.shape[0]))

关于python - numpy ndarray 中匹配行之间的余弦相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49218285/

相关文章:

java - 如何对数组进行升序排序?

c - 从函数冲突类型返回数组

Python BeautifulSoup 看不到下拉列表选项值

python - 从字符串中删除 "."和 "\"

python - 在 Python 3 中运行代码以使用步进电机

python - 在 Python 中读取原始二进制图像

python - 在 python 中实现基于 FFT 的二维核密度估计器,并将其与 SciPy 实现进行比较

Python 检查字符串是否在 dir() 中以及是否将该字符串转换为方法/函数调用

javascript - 如何将 javascript 数组发送到 Servlet

Numpy FFT 稳定性