在数据挖掘与机器学习领域,聚类分析是探索数据内在结构、发现数据分布规律的重要手段。K-Means作为最经典、最常用的聚类算法之一,凭借其简单高效的特性,被广泛应用于客户分群、图像分割、异常检测等场景。本文将深入解析K-Means算法原理,并通过Python代码实现从数据准备、模型构建到结果评估的全流程,带你掌握这一实用的数据处理工具。
一、K-Means聚类模型原理
K-Means算法属于无监督学习,旨在将数据集划分为K个不同的簇(Cluster),使得同一簇内的数据点相似度较高,不同簇间的数据点相似度较低。其核心思想基于数据点与聚类中心的距离,通过不断迭代调整聚类中心的位置,最小化每个数据点到其所属簇中心的距离平方和(即畸变函数)。
算法流程如下:
1. 初始化:随机选择K个数据点作为初始聚类中心。
2. 分配数据点:计算每个数据点到K个聚类中心的距离(通常使用欧氏距离),将数据点分配到距离最近的聚类中心所在的簇。
3. 更新聚类中心:计算每个簇内数据点的均值,将其作为新的聚类中心。
4. 迭代优化:重复步骤2和步骤3,直到聚类中心不再发生显著变化,或达到预设的最大迭代次数。
畸变函数 J 定义为:
J = \sum_{i=1}^{K} \sum_{x \in C_i} \| x - \mu_i \|^2
其中,K 是簇的数量,C_i 是第 i 个簇,\mu_i 是第 i 个簇的中心,x 是数据点。算法通过最小化 J 实现聚类效果的优化。
二、Python实现K-Means聚类的准备工作
在Python中实现K-Means聚类,需安装相关库。scikit-learn 提供了高效的K-Means算法实现,numpy 用于数值计算,pandas 处理数据,matplotlib 则用于可视化聚类结果。使用以下命令安装:
pip install scikit-learn numpy pandas matplotlib
三、数据准备
以经典的鸢尾花数据集为例(也适用于其他特征数据),该数据集包含150个样本,每个样本具有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。我们将通过K-Means算法尝试挖掘数据中潜在的类别结构。
from sklearn.datasets import load_iris
import pandas as pd
# 加载鸢尾花数据集
iris = load_iris()
# 将数据集转换为DataFrame格式
data = pd.DataFrame(iris.data, columns=iris.feature_names)
此时,data 中存储了鸢尾花数据的特征信息,通过 data.head() 可查看前几行数据:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
四、构建K-Means聚类模型
4.1 确定聚类簇数K
K值的选择对聚类结果影响较大。常见的方法有“肘部法则”(Elbow Method),通过计算不同K值下的畸变函数 J ,绘制K与 J 的关系图,曲线拐点(类似肘部)对应的K值通常是较优选择。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
# 计算不同K值下的畸变函数
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(data)
wcss.append(kmeans.inertia_)
# 绘制肘部法则图
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters (K)')
plt.ylabel('WCSS')
plt.show()
运行代码后,通过观察曲线形状,发现K=3时曲线出现明显拐点,因此选择K=3作为聚类簇数。
4.2 创建K-Means模型对象
使用 scikit-learn 中的 KMeans 类创建模型,并设置参数:
# 创建K-Means模型对象,设置K=3
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10, random_state=0)
其中,n_clusters 指定聚类簇数,init='k-means++' 表示使用优化的初始聚类中心选择方法,max_iter 是最大迭代次数,n_init 是重复初始化聚类中心的次数,以选取最优结果。
4.3 训练模型
使用数据集对模型进行训练:
# 训练K-Means模型
kmeans.fit(data)
训练完成后,模型将数据划分为3个簇,并确定了每个簇的中心。
五、结果分析与可视化
5.1 查看聚类标签
获取每个数据点所属的簇标签:
# 获取聚类标签
labels = kmeans.labels_
data['cluster_label'] = labels
此时,data 数据框新增 cluster_label 列,记录每个样本的聚类结果。
5.2 可视化聚类结果
由于鸢尾花数据集有4个特征,为便于可视化,选取其中两个特征(如“sepal length (cm)”和“sepal width (cm)”)绘制散点图:
plt.scatter(data[data['cluster_label']==0]['sepal length (cm)'], data[data['cluster_label']==0]['sepal width (cm)'], s=100, c='red', label='Cluster 1')
plt.scatter(data[data['cluster_label']==1]['sepal length (cm)'], data[data['cluster_label']==1]['sepal width (cm)'], s=100, c='blue', label='Cluster 2')
plt.scatter(data[data['cluster_label']==2]['sepal length (cm)'], data[data['cluster_label']==2]['sepal width (cm)'], s=100, c='green', label='Cluster 3')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='yellow', label='Centroids')
plt.title('K-Means Clustering Results')
plt.xlabel('Sepal Length (cm)')
plt.ylabel('Sepal Width (cm)')
plt.legend()
plt.show()
运行代码后,生成的散点图将不同簇的数据点用不同颜色区分,并标记出聚类中心,直观展示聚类效果。
六、评估聚类效果
常用的聚类评估指标有轮廓系数(Silhouette Score),它综合衡量了数据点与其所属簇内其他点的紧密程度(内聚度),以及与其他簇的分离程度(分离度),取值范围在[-1, 1]之间,越接近1表示聚类效果越好。
from sklearn.metrics import silhouette_score
# 计算轮廓系数
silhouette_avg = silhouette_score(data, labels)
print("轮廓系数:", silhouette_avg)
通过计算轮廓系数,可以量化评估K-Means模型的聚类质量,辅助调整模型参数或优化聚类策略。
七、总结
本文详细介绍了基于Python的K-Means聚类模型全流程实现,从算法原理、数据准备到模型构建、结果分析与评估,完整呈现了K-Means在数据挖掘中的应用。K-Means算法虽然简单,但在实际场景中需注意K值选择、数据预处理等问题。通过结合更多聚类评估指标和优化技巧,K-Means可以成为探索数据内在规律、支持决策分析的强大工具。