手动找到质心和标记数据点之间的距离

Manually find the distance between centroid and labelled data points

我对一些数据 X 进行了聚类分析,得到了标签 y 和质心 c。现在,我正在尝试计算 X 他们分配的集群的质心 c 之间的距离。当我们有少量点时这很容易:

import numpy as np

# 10 random points in 3D space
X = np.random.rand(10,3)

# define the number of clusters, say 3
clusters = 3

# give each point a random label 
# (in the real code this is found using KMeans, for example)
y = np.asarray([np.random.randint(0,clusters) for i in range(10)]).reshape(-1,1)

# randomly assign location of centroids 
# (in the real code this is found using KMeans, for example)
c = np.random.rand(clusters,3)

# calculate distances
distances = []
for i in range(len(X)):
    distances.append(np.linalg.norm(X[i]-c[y[i][0]]))

不幸的是,实际数据有更多的行。有没有办法以某种方式对其进行矢量化(而不是使用 for loop)?我似乎无法理解映射。

感谢 numpy 的 array indexing,您实际上可以将 for 循环变成单行循环并完全避免显式循环:

distances = np.linalg.norm(X- np.einsum('ijk->ik', c[y]), axis=1)

将执行与原始 for 循环相同的操作。

编辑:谢谢@Kris,我忘记了 axis 关键字,因为我没有指定它,numpy 自动计算了整个展平矩阵的范数,而不仅仅是沿着行(轴 1)。我现在更新了它,它应该 return 每个点的距离数组。此外,@Kris 建议将 einsum 用于其特定应用。