年龄和体重的 K-Means

K-Means on age and weight

我已经将 K-Means 应用到我有年龄和体重的随机数据集的问题上,应用 K 均值后,我仍然无法理解为什么数据点没有收敛到质心。

age = [20,21,22,20,21,22,23,27,28,26,23,28,29,33,28,25,24,28,29,30,33,31,40,22,28,29,27,25,29,23]
weight = [80,50,70,50,82,49,60,66,76,45,66,86,77,56,76,81,72,92,72,91,72,75,60,61,99,54,56,45,40,76]

df_main = pd.DataFrame({'age':age_array,'weight':weight_array})

X_std = StandardScaler().fit_transform(df)

# Run local implementation of kmeans
km = KMeans(n_clusters=2, max_iter=100)

km.fit(X_std)
centroids = km.cluster_centers_
# Plot the clustered data
fig, ax = plt.subplots(figsize=(6, 6))

plt.scatter(X_std[km.labels_ == 0, 0], X_std[km.labels_ == 0, 1],
            c='green', label='cluster 1')

plt.scatter(X_std[km.labels_ == 1, 0], X_std[km.labels_ == 1, 1],
            c='blue', label='cluster 2')

plt.scatter(centroids[:, 0], centroids[:, 1], marker='*', s=50,
            c='red', label='centroid')

plt.legend()

plt.xlim([-2, 2])

plt.ylim([-2, 2])

plt.xlabel('Age')

plt.ylabel('Height')

plt.title('Visualization of clustered data', fontweight='bold')

我觉得你还没有完全理解k-means

每次迭代都会重新计算质心以最小化它们与数据点之间的距离,这实际上发生了什么。 (在第一次迭代中,它们是随机选择或通过其他初始化选择的)。

流程结束后,我们会为每个数据点重新计算它到质心的距离,最小距离将决定该数据点属于哪个集合。 因此,质心通常不会收敛到任何数据点,实际上,如果发生这种情况,则表明您的超参数可以优化(例如减少 k)。