【问题标题】:How to plot the cluster centers?如何绘制聚类中心?
【发布时间】:2022-01-21 09:19:30
【问题描述】:

通过从头开始使用这种 k 均值聚类,我如何在照片的散点图上绘制 k=3 的初始随机聚类中心? Photo 鸢尾花数据集

import numpy as np
from scipy.spatial.distance import cdist 
 
def kmeans(x,k, no_of_iterations):
    idx = np.random.choice(len(x), k, replace=False)
    #Randomly choosing Centroids 
    centroids = x[idx, :]
     
    #finding the distance between centroids and all the data points
    distances = cdist(x, centroids ,'euclidean')
     
    points = np.array([np.argmin(i) for i in distances])
     
    for _ in range(no_of_iterations): 
        centroids = []
        for idx in range(k):
            #Updating Centroids by taking mean of Cluster it belongs to
            temp_cent = x[points==idx].mean(axis=0) 
            centroids.append(temp_cent)
 
        centroids = np.vstack(centroids) #Updated Centroids 
         
        distances = cdist(x, centroids ,'euclidean')
        points = np.array([np.argmin(i) for i in distances])
         
    return points 

【问题讨论】:

  • 这段代码有输出但不显示集群中心,我需要显示中心
  • 请不要重复发布问题。
  • @MichaelSzczesny 抱歉。你能帮忙解决这个问题吗?
  • @bgPark 我想自己实现。我可以打印出来,但是输出中看不到集群中心,我也想添加它。这是我的问题

标签: python matplotlib scipy jupyter-notebook


【解决方案1】:

您可以通过 matplotlib 的 scatter 函数绘制点和中心。可以根据通过kmeans 计算的组分配颜色。

这是一个示例(kmeans 函数现在也返回质心)。

import matplotlib.pyplot as plt
import seaborn as sns  # for the iris dataset
import numpy as np
from scipy.spatial.distance import cdist

def kmeans(x, k, no_of_iterations=100):
    idx = np.random.choice(len(x), k, replace=False)
    # Randomly choosing Centroids
    centroids = x[idx, :]
    # finding the distance between centroids and all the data points
    distances = cdist(x, centroids, 'euclidean')
    points = np.array([np.argmin(i) for i in distances])

    for _ in range(no_of_iterations):
        centroids = []
        for idx in range(k):
            # Updating Centroids by taking mean of Cluster it belongs to
            temp_cent = x[points == idx].mean(axis=0)
            centroids.append(temp_cent)
        centroids = np.vstack(centroids)  # Updated Centroids
        distances = cdist(x, centroids, 'euclidean')
        points = np.array([np.argmin(i) for i in distances])
    return points, centroids

iris = sns.load_dataset('iris')
x = iris[['sepal_length', 'sepal_width']].to_numpy()

k = 3
points, centroids = kmeans(x, k)

colors = plt.cm.Set2.colors
for val, color in zip(range(k), colors):
    plt.scatter(centroids[val, 0], centroids[val, 1], facecolor='none', edgecolor=color, lw=3,
                s=100, label=f'centroid {val}')
for val, color in zip(range(k), colors):
    plt.scatter(x[points == val, 0], x[points == val, 1], color=color, label=f'set {val}')
plt.legend(ncol=2)
plt.show()

这里尝试将给定的目标名称与 kmeans 近似值一起显示。请注意,kmeans 值的顺序是随机的。较大的背景圆圈显示目标名称,较小的圆圈,很好地按其质心分组,来自 kmeans。

from sklearn.datasets import load_iris

iris_data = load_iris()
x = iris_data.data[:, :2]

color_givens = ['magenta', 'gold', 'cyan']
for val, (name, color) in enumerate(zip(iris_data.target_names, color_givens)):
    plt.scatter(x[iris_data.target == val, 0], x[iris_data.target == val, 1],
                color=color, s=150, alpha=0.6, label=f'given {name}')

k = 3
points, centroids = kmeans(x, k)
colors_kmeans = plt.cm.Set1.colors
for val, color in zip(range(k), colors_kmeans):
    plt.scatter(centroids[val, 0], centroids[val, 1], facecolor='none', edgecolor=color, lw=3,
                s=150, label=f'centroid {val}')
for val, color in zip(range(k), colors_kmeans):
    plt.scatter(x[points == val, 0], x[points == val, 1], color=color, label=f'set {val}')
plt.xlabel(iris_data.feature_names[0])
plt.ylabel(iris_data.feature_names[1])
plt.legend(ncol=3)
plt.show()

【讨论】:

  • 我忘了提。我如何从“from sklearn.datasets import load_iris”获取此代码的数据
  • 不,kmeans 算法不知道哪个标签对应哪个值。除此之外,可能仅通过 kmeans 无法 100% 精确划分目标。
  • 好的,谢谢......
猜你喜欢
  • 2019-11-20
  • 2018-08-27
  • 1970-01-01
  • 2021-04-03
  • 2015-03-31
  • 1970-01-01
  • 2015-07-20
  • 2013-05-17
  • 2020-08-28
相关资源
最近更新 更多