取两个矩阵,分别是大小为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]中,但由于某种原因我得到了该区间的值。我认为我的其中一个不正常的功能正在做的事情不同于我的想法。
答案 0 :(得分:1)
听起来你需要除以你的向量数组的L2范数的外积:
arr1.dot(arr2.T) / np.outer(np.linalg.norm(arr1, axis=1),
np.linalg.norm(arr2, axis=1))
e.g。
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 ]])