在本文中,我们将了解如何绘制 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 的数据点,然后创建散点图。
看看我们如何传递一个布尔系列来过滤 [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() |
精彩的 !
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 均值算法形成的簇。下次再见,祝学习愉快!