我将K-Means应用于一个包含随机年龄和体重数据集的问题上,应用K-Means后,我仍然不明白为什么数据点未能向中心点收敛。
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值)。