Python KMeans聚类算法完整教程 | 原理与实践
- Python
- 2025-08-11
- 334
Python KMeans聚类算法教程
作者:AI技术专家 | 最后更新:2023年10月15日
目录
1. 什么是KMeans聚类?
KMeans聚类是一种无监督学习算法,用于将数据集划分为K个不同的组(簇)。聚类分析的目标是将相似的数据点分组在一起,同时使不同组之间的差异最大化。
KMeans算法的主要特点:
- 简单且高效的聚类算法
- 需要预先指定聚类数量K
- 基于距离的聚类方法(通常使用欧氏距离)
- 迭代优化,收敛到局部最优解
2. KMeans算法原理
KMeans算法的核心思想是通过迭代寻找K个簇的最佳中心点(质心),使得每个数据点到其所属簇质心的距离平方和最小。
算法涉及两个关键概念:
- 质心(Centroid):每个簇的中心点,由簇内所有点的均值计算得出
- 距离度量:通常使用欧氏距离计算数据点与质心的距离
目标函数(WCSS)
J = Σ(数据点到其质心的距离²)
3. KMeans算法步骤
KMeans聚类通过以下步骤实现:
- 初始化:随机选择K个点作为初始质心
- 分配数据点:将每个数据点分配到距离最近的质心所在的簇
- 更新质心:重新计算每个簇的质心(均值)
- 迭代:重复步骤2和3,直到质心不再变化或达到最大迭代次数
算法终止条件
- 质心位置不再变化
- 达到最大迭代次数
- 目标函数(WCSS)的变化小于阈值
4. Python实现KMeans
使用Python的scikit-learn库可以轻松实现KMeans聚类。首先确保安装了必要的库:
pip install numpy matplotlib scikit-learn
下面是完整的KMeans聚类实现代码:
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
# 1. 创建模拟数据集
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
# 2. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 创建KMeans模型并训练
kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, max_iter=300, random_state=0)
kmeans.fit(X_scaled)
# 4. 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 5. 评估聚类效果
silhouette_avg = silhouette_score(X_scaled, labels)
print(f"轮廓系数: {silhouette_avg:.3f}")
# 6. 可视化聚类结果
plt.figure(figsize=(10, 6))
# 绘制数据点
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis',
s=50, alpha=0.8, edgecolor='k')
# 绘制质心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X',
s=200, edgecolor='k', label='质心')
plt.title('KMeans聚类结果 (K=4)')
plt.xlabel('特征 1 (标准化)')
plt.ylabel('特征 2 (标准化)')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
代码解释:
- make_blobs:创建模拟数据集,包含4个簇
- StandardScaler:标准化数据,使每个特征均值为0,方差为1
- KMeans参数:
- n_clusters:聚类数量K
- init:初始化方法('k-means++'更优)
- n_init:不同初始化的运行次数
- max_iter:最大迭代次数
- 轮廓系数:评估聚类质量(-1到1,越大越好)
5. 聚类结果可视化
可视化是理解聚类结果的关键。使用matplotlib可以直观地展示聚类效果:
在实际项目中,你可能需要:
- 使用PCA或t-SNE进行降维以可视化高维数据
- 创建不同角度的3D散点图
- 绘制聚类边界
- 使用不同颜色和标记区分簇
6. 如何选择K值?
确定最佳聚类数K是KMeans算法的关键挑战。常用的方法有:
肘部法则(Elbow Method)
计算不同K值对应的WCSS(簇内平方和),选择WCSS下降速度变缓的点(肘部)。
# 肘部法则实现
wcss = []
k_range = range(1, 11)
for k in k_range:
kmeans = KMeans(n_clusters=k, init='k-means++', random_state=0)
kmeans.fit(X_scaled)
wcss.append(kmeans.inertia_)
# 绘制肘部图
plt.figure(figsize=(10, 6))
plt.plot(k_range, wcss, 'bo-')
plt.xlabel('聚类数量 K')
plt.ylabel('WCSS (簇内平方和)')
plt.title('肘部法则选择最佳K值')
plt.grid(True)
plt.show()
轮廓系数(Silhouette Score)
轮廓系数衡量一个数据点与其自身簇的相似度与其他簇的差异程度。取值范围在[-1,1],越大表示聚类效果越好。
实际选择建议:
- 结合业务背景和实际需求
- 使用多种方法交叉验证
- K值通常在2-10之间
- 避免选择过多簇导致过拟合
7. 实际应用场景
KMeans聚类在各个领域都有广泛应用:
客户细分
根据购买行为、人口统计特征等对客户进行分组,制定个性化营销策略。
图像压缩
将图像颜色减少到K种主要颜色,降低存储空间。
异常检测
识别与其他数据点显著不同的异常点。
文档分类
对文本文档进行主题分组。
8. 算法优缺点
优点
- ✓ 简单易懂,实现方便
- ✓ 计算效率高,适用于大数据集
- ✓ 对球形簇效果良好
- ✓ 可扩展性强,容易并行化
缺点
- ✗ 需要预先指定K值
- ✗ 对初始质心敏感
- ✗ 对噪声和异常值敏感
- ✗ 不适合非凸形状的簇
改进方法
- K-Means++:改进初始质心选择
- Mini-Batch KMeans:适用于大数据集
- 数据预处理:标准化、去除异常值
- 结合其他算法:如DBSCAN处理非凸簇
总结
KMeans聚类是机器学习中最常用的无监督学习算法之一,适用于多种聚类任务。通过本教程,你学习了KMeans的原理、Python实现、可视化方法和最佳实践。
记住:数据预处理、K值选择和结果解释是成功应用KMeans的关键步骤!
本文由ShiFangLan于2025-08-11发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20257881.html
发表评论