sklearn.metrics.pairwise.euclidean_distances 的输出似乎与doc上的公式不同

数据挖掘 机器学习 距离 公制
2022-02-14 09:03:45

文档给出sklearn.metrics.pairwise.euclidean_distances()了这个公式

dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y))。

将此公式应用于此示例

X = [[0, 1],
     [2, 3]]

Y = [[1, 2],
     [3, 4]]

np.dot(X,X) - 2*np.dot(X,Y) + np.dot(Y,Y)

给出这个结果

array([[ 3,  5],
       [-1,  1]])

同时调用 sklearn.metrics.pairwise.euclidean_distances()

euclidean_distances(X , Y, squared = True)

array([[ 2., 18.],
       [ 2.,  2.]])

的输出似乎euclidean_distances()与文档中的公式不一致。

1个回答

sklearn 文档的公式说它适用于行向量当您调用矩阵时,它需要矩阵乘积。xynp.dotXY

编辑(回答评论中的问题):
这并不简单,因为所需的行对行操作并不是通常的矩阵操作。的源代码euclidean_distances就是这样做的(除了它会进行大量输入检查,在可能的情况下对稀疏输入进行操作等):

(X*X).sum(axis=1)[:, np.newaxis] - 2*np.dot(X,Y.T) + (Y*Y).sum(axis=1)[np.newaxis, :]

这本身并不完全直截了当,所以我会多说一点。假设行,行。中间项,通过取,给我们一个矩阵,其的第的第的点积换句话说,在 numpy 数组上是坐标乘积;沿行求和为我们提供了行的平方范数。是一个不错的技巧:将第一项现在转换为矩阵,并将其添加到中间项的XmYnYTm×n(i,j)iXjY*newaxism×1m×n矩阵实际上将它添加到该矩阵的每一列(无需实际构建的平方范数的重复列的矩阵)。当然,最后一项也是如此:转换为矩阵使其添加到结果的每一行。X1×n