我正在尝试使用 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
但我的代码性能不够好,我正在寻找更快的速度,有没有更快的方法在 python 中计算该公式,任何想法都将不胜感激。
最佳答案
通常,在 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)
它返回与您的函数相同的结果 :) 希望这对您有所帮助!
关于python - 使用 numpy 实现基于欧氏距离的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043234/