如何使用 Python 绘制 K 均值聚类?

在本文中,我们将了解如何绘制 K 均值聚类。

K-means 聚类是一种迭代聚类方法,它将数据分割成k 个簇,其中每个观测值属于具有最近平均值(簇质心)的簇。

绘制 K 均值聚类的步骤

本文演示了如何可视化集群。我们将使用数字数据集来实现我们的目标。

1. 准备绘图数据

首先让我们准备好数据。

#Importing required modules
 
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import numpy as np
 
#Load Data
data = load_digits().data
pca = PCA(2)
 
#Transform the data
df = pca.fit_transform(data)
 
df.shape

输出:

(1797, 2)

Digits 数据集包含大小为 8×8 像素的图像,将其展平以创建长度为 64 的特征向量。我们使用PCA来减少维数,以便我们可以使用 2D 散点图可视化结果。

2. 对数据应用 K 均值

现在,让我们对数据应用 K 均值来创建聚类。

在数字数据集中,我们已经知道标签范围从 0 到 9,因此我们有 10 个类(或簇)。

但在现实生活中执行 K 均值挑战时,最具挑战性的任务是确定簇的数量。

确定最佳簇数的方法有多种,如Elbow法、Average Silhouette法。但确定簇的数量将是另一个演讲的主题。

#Import required module
from sklearn.cluster import KMeans
 
#Initialize the class object
kmeans = KMeans(n_clusters= 10)
 
#predict the labels of clusters.
label = kmeans.fit_predict(df)
 
print(label)

输出:

out: [0 3 7 ... 7 4 9]

kmeans.fit_predict方法返回每个数据点所属的簇标签数组。

3. 绘制标签 0 K 均值聚类

现在,是时候了解并了解如何绘制各个聚类了。

标签数组保留数据点的索引或序列,因此我们可以利用此特性使用numpy的布尔索引来过滤数据点。

让我们使用matplotlib 库可视化标签为 0 的簇。

import matplotlib.pyplot as plt
 
#filter rows of original data
filtered_label0 = df[label == 0]
 
#plotting the results
plt.scatter(filtered_label0[:,0] , filtered_label0[:,1])
plt.show()
绘制标签 0

上面的代码首先过滤并保留属于簇标签 0 的数据点,然后创建散点图。

看看我们如何传递一个布尔系列来过滤 [label == 0]。对过滤后的数据建立索引并传递给plt.scatter(x,y) 进行绘图。x = 过滤标签0[:, 0] , y = 过滤标签0[:, 1]。

4. 绘制额外的 K 均值聚类

现在,我们有了一些想法,让我们绘制标签为 2 和 8 的簇。

#filter rows of original data
filtered_label2 = df[label == 2]
 
filtered_label8 = df[label == 8]
 
#Plotting the results
plt.scatter(filtered_label2[:,0] , filtered_label2[:,1] , color = 'red')
plt.scatter(filtered_label8[:,0] , filtered_label8[:,1] , color = 'black')
plt.show()
绘制标签 2 和 8

精彩的 !

5. 绘制所有 K 均值聚类

现在,我们已经获得了工作机制,让我们将其应用到所有集群。

#Getting unique labels
 
u_labels = np.unique(label)
 
#plotting the results:
 
for i in u_labels:
    plt.scatter(df[label == i , 0] , df[label == i , 1] , label = i)
plt.legend()
plt.show()
最终簇

上面的代码根据每个唯一的类每次迭代一次来迭代过滤数据。我们得到的结果是所有集群的最终可视化。

6. 绘制簇质心

#Getting the Centroids
centroids = kmeans.cluster_centers_
u_labels = np.unique(label)
 
#plotting the results:
 
for i in u_labels:
    plt.scatter(df[label == i , 0] , df[label == i , 1] , label = i)
plt.scatter(centroids[:,0] , centroids[:,1] , s = 80, color = 'k)
plt.legend()
plt.show()
簇及其各自的质心

kmeans.cluster_centers_返回质心位置数组。

这是我们上面看到的完整代码。

#Importing required modules
 
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import numpy as np
 
#Load Data
data = load_digits().data
pca = PCA(2)
 
#Transform the data
df = pca.fit_transform(data)
 
#Import KMeans module
from sklearn.cluster import KMeans
 
#Initialize the class object
kmeans = KMeans(n_clusters= 10)
 
#predict the labels of clusters.
label = kmeans.fit_predict(df)
 
#Getting unique labels
u_labels = np.unique(label)
 
#plotting the results:
for i in u_labels:
    plt.scatter(df[label == i , 0] , df[label == i , 1] , label = i)
plt.legend()
plt.show()

结论

在本文中,我们了解了如何可视化由 k 均值算法形成的簇。下次再见,祝学习愉快!