【问题标题】:cosine distance between two matrices两个矩阵之间的余弦距离
【发布时间】:2015-10-16 01:05:50
【问题描述】:

分别取大小为 mxn 和 pxn 的两个矩阵 arr1、arr2。我试图找到他们尊重的行的余弦距离作为 mxp 矩阵。本质上,我想取行的成对点积,然后除以每行范数的外积。

import numpy as np
def cosine_distance(arr1, arr2):
    numerator = np.dot(arr1, arr2.T)
    denominator = np.outer(
        np.sqrt(np.square(arr1).sum(1)),
        np.sqrt(np.square(arr2).sum(1)))
   return np.nan_to_num(np.divide(numerator, denominator))

我认为这应该返回一个 mxn 矩阵,其中包含 [-1.0, 1.0] 中的条目,但由于某种原因,我得到了超出该区间的值。我在想我的这些 numpy 函数之一正在做一些我认为它所做的事情。

【问题讨论】:

  • 如果 p 与 n 不同,则 arr1 和 arr2 的行长度不同。在这种情况下,你如何计算它们的内积?
  • @M.Massias 抱歉,意思是 m by n 和 p by n。它们应该具有相同的列数。

标签: python numpy cosine-similarity


【解决方案1】:

听起来您需要除以向量数组的 L2 范数的外积:

arr1.dot(arr2.T) / np.outer(np.linalg.norm(arr1, axis=1),
                            np.linalg.norm(arr2, axis=1))

例如

In [4]: arr1 = np.array([[1., -2., 3.],
                         [0., 0.5, 2.],
                         [-1., 1.5, 1.5],
                         [2., -0.5, 0.]])

In [5]: arr2 = np.array([[0., -3., 1.],
                         [1.5, 0.25, 1.]])

In [6]: arr1.dot(arr2.T)/np.outer(np.linalg.norm(arr1, axis=1),
                                  np.linalg.norm(arr2, axis=1))
Out[6]: 
array([[ 0.76063883,  0.58737848],
       [ 0.0766965 ,  0.56635211],
       [-0.40451992,  0.08785611],
       [ 0.2300895 ,  0.7662411 ]])

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 2016-11-29
    • 2017-01-13
    • 2016-08-23
    • 2020-10-28
    • 2021-07-15
    • 2022-11-21
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多