当前位置:首页 > Python > 正文

Python KMeans聚类算法完整教程 | 原理与实践

Python KMeans聚类算法教程

作者:AI技术专家 | 最后更新:2023年10月15日

1. 什么是KMeans聚类?

KMeans聚类是一种无监督学习算法,用于将数据集划分为K个不同的组(簇)。聚类分析的目标是将相似的数据点分组在一起,同时使不同组之间的差异最大化。

KMeans算法的主要特点:

  • 简单且高效的聚类算法
  • 需要预先指定聚类数量K
  • 基于距离的聚类方法(通常使用欧氏距离)
  • 迭代优化,收敛到局部最优解

2. KMeans算法原理

KMeans算法的核心思想是通过迭代寻找K个簇的最佳中心点(质心),使得每个数据点到其所属簇质心的距离平方和最小。

算法涉及两个关键概念:

  • 质心(Centroid):每个簇的中心点,由簇内所有点的均值计算得出
  • 距离度量:通常使用欧氏距离计算数据点与质心的距离

目标函数(WCSS)

J = Σ(数据点到其质心的距离²)

3. KMeans算法步骤

KMeans聚类通过以下步骤实现:

  1. 初始化:随机选择K个点作为初始质心
  2. 分配数据点:将每个数据点分配到距离最近的质心所在的簇
  3. 更新质心:重新计算每个簇的质心(均值)
  4. 迭代:重复步骤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可以直观地展示聚类效果:

KMeans聚类可视化 (4个簇)

在实际项目中,你可能需要:

  • 使用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的关键步骤!

发表评论