Python简单聚类案例编写指南:从零开始掌握K-Means聚类
目录导读
- 聚类分析是什么?为什么选择Python实现?
- K-Means聚类原理:一句话讲清楚
- 环境准备与必备库安装
- 生成随机数据并聚类(动手做!)
- 用真实数据集(Iris鸢尾花)演示聚类
- 如何评估聚类效果?实战问答
- 常见错误与调优技巧
- 总结与进阶学习建议
聚类分析是什么?为什么选择Python实现?
问:聚类和分类有什么区别?
答:分类是有监督学习,需要提前标注好类别标签(猫” vs “狗”),而聚类是无监督学习,算法自行根据数据的相似度将数据分组,不需要提前知道类别,简单说,聚类帮你“发现数据中天然存在的群组”。
问:为什么用Python写聚类案例?
答:Python有三大优势:
- 库丰富:scikit-learn、pandas、matplotlib一键搞定
- 代码简洁:10行代码就能实现一个完整聚类流程
- 社区成熟:遇到问题99%有现成解决方案
聚类广泛应用于用户分群、图像分割、异常检测、文档分类等场景,掌握Python聚类,等于掌握数据挖掘的基础技能。
K-Means聚类原理:一句话讲清楚
K-Means是最经典、最易上手的聚类算法,它的核心逻辑是:
- 确定要分几类(K值)
- 随机初始化K个中心点
- 计算每个点到中心点的距离,分配给最近的中心点
- 重新计算每个类的中心点(均值)
- 重复步骤3-4,直到中心点不再变化
实战要点:K值需要人工指定(这是最大局限),但可以通过“肘部法则”辅助选择。
环境准备与必备库安装
在写代码前,请确保安装以下库:
pip install numpy pandas matplotlib scikit-learn
推荐使用Jupyter Notebook或Google Colab作为IDE,可以交互式查看图表效果。
案例一:生成随机数据并聚类(动手做!)
这是最经典的入门案例——用make_blobs生成3个簇的模拟数据,然后用K-Means聚类。
1 完整代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 生成300个样本,分为3个簇
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=42)
# 可视化原始数据(不显示标签)
plt.scatter(X[:, 0], X[:, 1], s=50)"原始数据分布")
plt.show()
# 创建K-Means模型,指定K=3
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
y_pred = kmeans.predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c='red', marker='X', s=200, label='中心点')"K-Means聚类结果(K=3)")
plt.legend()
plt.show()
2 结果解读
运行后你将看到:
- 原始数据点颜色统一,无法区分群组
- 聚类后,不同簇被赋予不同颜色,红色×标记是聚类中心
- 完美将数据分为3组,与真实标签(y_true)非常接近
问:如果K值选错会怎样?
答:假如设n_clusters=2,会发现两个簇的中心点会落在两个大群组中间,而第三个群组会被强行合并,效果明显变差,这就是为什么我们需要“调优K值”。
案例二:用真实数据集(Iris鸢尾花)演示聚类
Iris数据集是机器学习界的“Hello World”,它有150个样本,4个特征(花萼长、宽,花瓣长、宽),实际有3类鸢尾花,我们只取前两个特征做可视化。
1 代码实现
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
X = iris.data[:, :2] # 只取前两列(花萼长度和宽度)
y_true = iris.target
# 使用肘部法则找最佳K
inertias = []
for k in range(1, 8):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
inertias.append(kmeans.inertia_)
# 绘制肘部图
plt.plot(range(1, 8), inertias, marker='o')
plt.xlabel('K值')
plt.ylabel('惯性(误差平方和)')'肘部法则确定最佳K')
plt.show()
# 根据肘部图,选K=3
kmeans_iris = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans_iris.fit_predict(X)
# 对比真实标签与聚类结果
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis')
ax1.set_title("真实标签")
ax2.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
ax2.set_title("K-Means聚类结果")
plt.show()
2 结果分析
- 肘部图显示:K=3时曲线下降速度明显变缓(肘部点),因此选K=3合理
- 对比两张散点图:聚类结果与真实标签大致吻合,但边缘有少量样本划分不一致,这说明无监督聚类无法100%复现有监督分类,但也足够揭示数据的底层结构。
问:为什么不直接用全部4个特征?
答:为了可视化,如果你的数据维度超过2,可以先用PCA降维到2维再画图,或者直接看聚类评估指标(如轮廓系数)。
如何评估聚类效果?实战问答
问:聚类效果好坏怎么量化?
答:常用指标包括:
- 轮廓系数(Silhouette Score):取值范围[-1,1],越接近1说明簇内紧密、簇间分离好
- 惯性(Inertia):样本到簇中心距离平方和,越小越好,但会随K单调递减(不能单纯用这个选K)
- 调整兰德指数(ARI):需要真实标签时才可用(如Iris数据集)
Q:我的数据聚类效果很差,怎么办?
A:先检查数据是否需要标准化,因为不同特征量纲不同(比如年龄和收入)会影响距离计算,解决办法很简单:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
Q:除了K-Means,还有什么简单的聚类方法?
A:初学者推荐顺序:K-Means → 层次聚类 → DBSCAN(适合任意形状的簇),注意DBSCAN不需要指定K值,但需要调eps和min_samples。
常见错误与调优技巧
常见错误
- 忘了标准化数据:导致量纲大的特征主导聚类结果
- K值随意指定:不经过肘部图或业务分析
- 忽略随机种子的影响:K-Means初始中心随机,不同种子可能得到不同结果(设置
random_state可复现) - 数据量过大时调用默认参数:大数据集建议用
MiniBatchKMeans提速
调优技巧
- 使用PCA降维到2-3维可视化,先观察数据聚类潜质
- 尝试不同距离度量(但K-Means只支持欧氏距离)
- 对文本数据,先转为TF-IDF向量再聚类
总结与进阶学习建议
通过两个案例(模拟数据+真实数据集),你已经掌握了:
- 用
make_blobs生成测试数据 - 用
KMeans实现聚类 - 用肘部法则选择K值
- 用
StandardScaler做数据标准化 - 用
inertia_和轮廓系数评估效果
进阶方向:
- 学习层次聚类(适合树形结构数据)
- 学习DBSCAN(自动发现任意形状簇,无需指定K值)
- 用聚类做图像压缩(降低颜色数量)
- 将聚类应用在客户分群实战项目中
最后,记住一句心得:聚类没有绝对正确的答案,只有符合业务解释的“最合理分组”,多尝试、多可视化、多结合业务需求,你就能越用越顺手。
附:如果你在CSDN或Stack Overflow搜索“Python K-Means案例”,以上内容已融合了社区最精华的知识点,并进行了去重重组,可以直接复制运行代码,边看边实操,动手能力是学习编程最快的路。