在 Python 中为每次迭代绘制 KMeans 聚类中心

Posted

技术标签:

【中文标题】在 Python 中为每次迭代绘制 KMeans 聚类中心【英文标题】:Plotting the KMeans Cluster Centers for every iteration in Python 【发布时间】:2021-04-03 13:12:17 【问题描述】:

我创建了一个包含 6 个集群的数据集,并使用下面的代码对其进行可视化,并找到每次迭代的集群中心点,现在我想可视化 KMeans 算法中集群质心更新的演示。该演示应包括通过生成 2×2 轴图形的前四次迭代。 我找到了这些点,但我无法绘制它们,请您查看我的代码并通过查看,帮助我编写散点图算法吗?

到目前为止,这是我的代码:

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets import make_blobs
data = make_blobs(n_samples=200, n_features=8, 
                           centers=6, cluster_std=1.8,random_state=101)
data[0].shape
plt.scatter(data[0][:,0],data[0][:,1],c=data[1],cmap='brg')

plt.show()
from sklearn.cluster import KMeans

print("First iteration points:")
kmeans = KMeans(n_clusters=6,random_state=0,max_iter=1)
kmeans.fit(data[0])
centroids=kmeans.cluster_centers_
print(kmeans.cluster_centers_)
print("Second iteration points:")
kmeans = KMeans(n_clusters=6,random_state=0,max_iter=2)
kmeans.fit(data[0])
print(kmeans.cluster_centers_)
print("Third iteration points:")
kmeans = KMeans(n_clusters=6,random_state=0,max_iter=3)
kmeans.fit(data[0])
print(kmeans.cluster_centers_)
print("Forth iteration points:")
kmeans = KMeans(n_clusters=6,random_state=0,max_iter=4)
kmeans.fit(data[0])
print(kmeans.cluster_centers_)

【问题讨论】:

“你能看看我的代码,然后看看,写散点图的算法” - 我认为你应该先尝试一下。不幸的是,Stack Overflow 不是让其他人为您编写代码的正确地方。您可以在 matplotlib 文档中找到示例(例如 matplotlib.org/3.3.3/gallery/shapes_and_collections/…) 是的,我尝试了十亿次,我的意思不是让你写代码我只是需要帮助,我的说法是错误的,我改变了它 【参考方案1】:

您可以使用plt.scatter()plt.subplots() 来实现此目的,如下所示:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
data = make_blobs(n_samples=200, n_features=8, 
                           centers=6, cluster_std=1.8,random_state=101)

fig, ax = plt.subplots(nrows=2, ncols=2,figsize=(10,10))

from sklearn.cluster import KMeans
c=d=0
for i in range(4):
    ax[c,d].title.set_text(f"i+1 iteration points:")
    kmeans = KMeans(n_clusters=6,random_state=0,max_iter=i+1)
    kmeans.fit(data[0])
    centroids=kmeans.cluster_centers_
    ax[c,d].scatter(data[0][:,0],data[0][:,1],c=data[1],cmap='brg')
    ax[c,d].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='black')
    d+=1
    if d==2:
        c+=1
        d=0

这将产生:

【讨论】:

首先,非常感谢您的回答,但我认为这不是我问题的正确答案,因为当我每次迭代都这样做时,它会给出完全相同的输出。我的输出应该是这样的:datascience.stackexchange.com/questions/87131/… 更新了我的答案。请检查这是否是您想要的。 您将获得相同的输出,因为在您创建的 blob 的第一次迭代之后质心没有改变。您可以打印并检查它。

以上是关于在 Python 中为每次迭代绘制 KMeans 聚类中心的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何在python中的4维数据上绘制kmeans聚类?

如何在一个imageview中为每次点击调用不同的可绘制动画?

如何在 R 中为 kmeans 指定距离度量?

kmeans与kmeans++的python实现

如何在k-means中记录每次迭代的质心?

在 Sklearn 中再次绘制测试、验证和训练 Acc Epochs