【问题标题】:K-Means centroids not visible in 3D clustering plotK-Means 质心在 3D 聚类图中不可见
【发布时间】:2022-01-23 01:35:12
【问题描述】:

当我使用此代码在 2D 中绘制聚类结果时:

from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# create 2d data 
x, label = make_blobs(n_samples=3000, n_features=2, centers=4,
                      cluster_std=3, random_state=42)

# cluster data
kmeans = KMeans(init="k-means++", n_clusters=4, random_state=42)
kmeans.fit(x)

# plot clusters and centroids
fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111)
ax.scatter(x[:,0],x[:,1], c=kmeans.labels_, cmap='viridis',
           edgecolor='k', s=40, alpha = 0.5)
ax.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1],
           s = 300, c = 'r', marker='*', label = 'Centroid')
ax.set_title("2D Kmeans clustering")
ax.set_xlabel("X")
ax.set_ylabel("Y")   
plt.show()

我得到以下输出:

但是当我尝试使用此代码在 3D 中绘制聚类结果时:

from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# create 3d data 
x, label = make_blobs(n_samples=3000, n_features=3, centers=4,
                      cluster_std=3, random_state=42)

# cluster data
kmeans = KMeans(init="k-means++", n_clusters=4, random_state=42)
kmeans.fit(x)

# plot clusters and centroids
fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[:,0], x[:,1], x[:,2] ,c=kmeans.labels_, cmap='viridis',
           edgecolor='k', s=40, alpha = 0.5)
ax.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1],
           kmeans.cluster_centers_[:,2], s = 300, c = 'r',
           marker='*', label = 'Centroid')
ax.set_title("3D Kmeans clustering")
ax.set_xlabel("X")
ax.set_ylabel("Y")   
ax.set_zlabel("Z") 
plt.show()

我得到以下输出:

如您所见,每个集群的质心不可见。我想在 3d 图中看到质心星星,我该如何实现?

提前感谢您的帮助!

【问题讨论】:

    标签: python matplotlib scikit-learn k-means


    【解决方案1】:

    质心星被点云包围,因此不容易看到。您可以通过使点更小(s=10 或更小)和更透明(alpha=0.1 或更小)来使它们更明显,如以下代码行所示:

    ax.scatter(x[:,0], x[:,1], x[:,2] ,c=kmeans.labels_, cmap='viridis',
           edgecolor='k', s=10, alpha = 0.1)
    

    【讨论】:

    • 感谢您的回答,如果我让点更小更透明,那么集群看起来不太好,我想保持原样,但通过将中心向前推进来使中心可见。跨度>
    • @RoseGod 如果您将它们带到前面,它们将位于不正确的位置,因此这是对位置的误传。将图形放大,减少轴限制,使点更小,使质心可见。
    • @TrentonMcKinney 好的,所以不要让他们前进,但我宁愿找到一个不改变情节外观的不同解决方案,也许是一些可以使质心可见的 zorder,这可能吗?
    • @RoseGod 我的理解是 3d 轴忽略 zorder
    • @TrentonMcKinney 所以使用 matplotlib 唯一的选择是改变点的大小和透明度。谢谢!
    猜你喜欢
    • 2020-02-21
    • 2018-09-19
    • 1970-01-01
    • 2018-04-27
    • 2021-11-25
    • 2016-05-29
    • 2016-05-29
    • 2015-06-04
    • 2018-07-02
    相关资源
    最近更新 更多