【问题标题】:K-Means on age and weight年龄和体重的 K 均值
【发布时间】:2021-12-01 02:44:15
【问题描述】:

我已将 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')

【问题讨论】:

  • “数据点未收敛到质心”是什么意思?数据点是静态的,它们不能收敛到任何东西
  • 我无法区分哪个点进入集群 1,哪个点进入集群 2,因为两者都合并了。它们不应该像一条线,表明上面的点属于第一簇,下面的点属于第二簇吗?对不起,如果我错了,我是新手。 @ForceBru
  • 一个集群是蓝色的,另一个是绿色的——在我看来它们并没有合并。如果您使用的是 scikit-learn,km.labels_ 正是对点进行分类的方法,看起来您这样做是正确的

标签: python machine-learning k-means


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我的概念很弱。我读过它,所以我开始实施,我想我需要学习更多。 :),谢谢。
猜你喜欢
  • 2021-10-31
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多