使用 Python 中的 Scikit-Learn 对手写数字数据进行 K 均值聚类
简介
聚类是一种在无监督机器学习中非常重要的技术,它根据共享的特征将相似的数据片段组合在一起。K 均值聚类是一种流行的聚类算法。K 均值算法是一种迭代算法,它将数据分成 K 个集群,其中 K 是一个预定义的数字。该过程最小化了聚类中心与数据点之间平方距离的总和。在这篇文章中,我们将了解如何使用 Python 的 Scikit-Learn 库对手写数字数据执行 K 均值聚类。
定义
K 均值聚类是一种简单而有效的无监督学习方法,旨在将数据集划分为 K 个不同的、不重叠的聚类。它的工作原理是将每个数据点分配到其最近的质心,质心是分配给该聚类所有点的算术平均值。然后,算法迭代地重新计算质心,以最小化数据点与其对应质心之间平方距离的总和。此过程重复进行,直到收敛或达到预定义的迭代次数。
语法
from sklearn.cluster import KMeans # Load the digits dataset from sklearn.datasets import load_digits digits = load_digits() # Create a K-Means clustering model kmeans = KMeans(n_clusters=K) # Fit the model to the data kmeans.fit(digits.data) # Predict the cluster labels for the data labels = kmeans.predict(digits.data)
导入所需的库。从 sklearn.cluster 包中导入 KMeans 类。我们还通过 sklearn.datasets 包中的 load_digits 方法导入手写数字数据集。
使用 load_digits 函数加载手写数字数据集。此数据集包含手写数字的图像,每个数字都是一个 8x8 像素的图像。
初始化一个 KMeans 类实例以创建 K 均值聚类模型。n_clusters 参数指定我们想要创建的聚类数量 (K)。我们可以根据数据集和问题选择任何 K 值。
调用 fit 方法,并将数据集作为参数传递,以将 K 均值模型拟合到数据。此步骤确定聚类中心并将每个数据点映射到其最近的质心。
使用 predict 方法预测数据点聚类的标签。每个数据点都分配了一个标签,对应于它所属的聚类。
算法
步骤 1 − 应随机或使用指定的初始化方法初始化 K 个聚类中心。
步骤 2 − 基于欧几里得距离,将每个数据点放置到其最近的质心旁边。
步骤 3 − 计算分配给每个聚类所有数据点的平均值以更新质心。
步骤 4 − 根据需要重复步骤 2 和 3,直到收敛或达到分配的迭代次数。
步骤 5 − 我们得到最终的聚类分配。
方法
方法 1 − 聚类手写数字数据
方法 2 − 评估聚类性能
方法 1:聚类手写数字数据
示例
# Import the necessary libraries from sklearn.cluster import KMeans from sklearn.datasets import load_digits import matplotlib.pyplot as plt # Load the digits dataset digits = load_digits() # Create a K-Means clustering model kmeans = KMeans(n_clusters=10) # Fit the model to the data kmeans.fit(digits.data) # Predict the cluster labels for the data labels = kmeans.predict(digits.data) # Visualize the cluster centroids fig, ax = plt.subplots(2, 5, figsize=(8, 3)) centers = kmeans.cluster_centers_.reshape(10, 8, 8) for axi, center in zip(ax.flat, centers): axi.set(xticks=[], yticks=[]) axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary) # Show the plot plt.show()
输出
由于数据集中有 10 个不同的数字 (0-9),因此我们接下来通过初始化一个具有 n_clusters=10 的 KMeans 类的实例来建立一个 K 均值聚类模型。
然后,我们使用 fit 方法将模型拟合到数据,该方法确定聚类中心并将每个数据点相对于其最近的质心放置。
为了可视化聚类中心,我们将聚类中心调整为 8x8 图像,并使用 matplotlib 绘制它们。生成的图显示了每个聚类的代表性图像。
在这里,我们使用 plt.show() 在程序结束时显示绘图。
代码的输出是一个包含 10 个子图的绘图,这些子图以 2x5 网格的形式排列。对于给定的数字,每个子图对应于一个聚类中心。由于初始化完全随机,因此每次执行给定程序时,输出可能会有所不同。灰度质心图像显示了每个聚类的平均数字图像。由于聚类中心的初始位置是随机选择的,因此聚类结果可能略有不同。因此,生成的聚类中心及其在绘图中的排列方式在不同的运行之间可能会发生变化。
方法 2:评估聚类性能
示例
# Import the necessary libraries from sklearn.cluster import KMeans from sklearn.datasets import load_digits from sklearn.metrics import silhouette_score # Load the digits dataset digits = load_digits() # Create a K-Means clustering model kmeans = KMeans(n_clusters=10) # Fit the model to the data kmeans.fit(digits.data) # Predict the cluster labels for the data labels = kmeans.predict(digits.data) # Evaluate the clustering performance score = silhouette_score(digits.data, labels) print("Silhouette Score:", score)
输出
Silhouette Score: 0.18185624794421412
之后,我们将一个 K 均值聚类模型拟合到数据,并将 n_clusters 设置为 10。
然后,将数据点的预测聚类标签添加到 labels 变量中。
我们使用 sklearn.metrics 中的 silhouette_score 函数来评估聚类的性能。此度量评估数据点聚类紧密程度的值范围从 -1 到 1。较高的值表示聚类性能更好。
在最后一步,我们打印轮廓分数以评估聚类结果的质量。
输出显示在冒号之后,将显示实际的分数值。轮廓分数范围从 -1 到 1,分数越高表示聚类结果越好。它评估数据集中的每个样本与其分配的聚类相比,在多大程度上适合该聚类。分数越接近 1,聚类就越突出且分离得越好。运行代码时,将使用 K 均值算法对数字数据集进行聚类以获得轮廓分数。输出将是分数,并打印到控制台。
结论
K 均值聚类是一种灵活的方法,可用于在各种形式的数据中查找隐藏模式并将相关数据点组合在一起。通过理解和应用 K 均值聚类,您可以从数据中提取有价值的见解并做出明智的决策。