Python 两个矩阵之间的余弦距离

Python 两个矩阵之间的余弦距离,python,numpy,cosine-similarity,Python,Numpy,Cosine Similarity,取两个矩阵,arr1,arr2,大小分别为mxn和pxn。我试图找到它们相关行的余弦距离,作为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.sq

取两个矩阵,arr1,arr2,大小分别为mxn和pxn。我试图找到它们相关行的余弦距离,作为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函数中的一个正在做一些事情,而不是我认为它所做的事情。

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

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


如果p不同于n,则arr1和arr2的行不是相同的lentgh。在这种情况下,如何计算它们的内积?@M.Massias sorry的意思是M乘以n,p乘以n。它们应该具有相同的列数。
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 ]])