使用numpy实现基于欧氏距离的公式

Dan*_*l.V 1 python numpy matrix

我试图使用numpy在python中实现这个公式

在此输入图像描述

如上图所示,X是numpy矩阵,每个xi是n维向量,C也是numpy矩阵,每个Ci也是n维的向量,dist(Ci,xi)是这两个向量之间的欧氏距离.我在python中实现了一个代码:

value = 0
for i in range(X.shape[0]):
    min_value = math.inf
    #this for loop iterate k times
    for j in range(C.shape[0]):
        distance = (np.dot(X[i] - C[j],
                           X[i] - C[j])) ** .5
        min_value = min(min_value, distance)
    value += min_value
fitnessValue = value
Run Code Online (Sandbox Code Playgroud)

但是我的代码性能不够好我正在寻找更快,有没有更快的方法来计算python中的公式,任何想法都会感激不尽.

PAb*_*PAb 5

通常,在python中应尽可能避免运行重要次数的循环.

这里存在一个scipy函数,scipy.spatial.distance.cdist(C, X)它计算C和X之间的成对距离矩阵.也就是说,如果你调用distance_matrix = scipy.spatial.distance.cdist(C, X),你有distance_matrix [i,j] = dist(C_i,X_j).

然后,对于每个j,您想要计算所有i的dist(C_i,X_j)的最小值.你不需要循环来计算这个!numpy.minimum如果传递轴参数,该函数会为您执行此操作.

最后,通过调用numpy.sum函数来完成所有这些最小值的总和.

这使代码更具可读性和更快:

import scipy.spatial.distance
import numpy as np
def your_function(C, X):
    distance_matrix = scipy.spatial.distance.cdist(C, X)
    minimum = np.min(distance_matrix, axis=0)
    return np.sum(minimum)
Run Code Online (Sandbox Code Playgroud)

返回与您的函数相同的结果:)希望这会有所帮助!