Python简单聚类案例怎么编写?

wen python案例 2

Python简单聚类案例编写指南:从零开始掌握K-Means聚类

目录导读

  1. 聚类分析是什么?为什么选择Python实现?
  2. K-Means聚类原理:一句话讲清楚
  3. 环境准备与必备库安装
  4. 生成随机数据并聚类(动手做!)
  5. 用真实数据集(Iris鸢尾花)演示聚类
  6. 如何评估聚类效果?实战问答
  7. 常见错误与调优技巧
  8. 总结与进阶学习建议

聚类分析是什么?为什么选择Python实现?

问:聚类和分类有什么区别?
答:分类是有监督学习,需要提前标注好类别标签(猫” vs “狗”),而聚类是无监督学习,算法自行根据数据的相似度将数据分组,不需要提前知道类别,简单说,聚类帮你“发现数据中天然存在的群组”。

问:为什么用Python写聚类案例?
答:Python有三大优势:

  • 库丰富:scikit-learn、pandas、matplotlib一键搞定
  • 代码简洁:10行代码就能实现一个完整聚类流程
  • 社区成熟:遇到问题99%有现成解决方案

聚类广泛应用于用户分群、图像分割、异常检测、文档分类等场景,掌握Python聚类,等于掌握数据挖掘的基础技能。


K-Means聚类原理:一句话讲清楚

K-Means是最经典、最易上手的聚类算法,它的核心逻辑是:

  1. 确定要分几类(K值)
  2. 随机初始化K个中心点
  3. 计算每个点到中心点的距离,分配给最近的中心点
  4. 重新计算每个类的中心点(均值)
  5. 重复步骤3-4,直到中心点不再变化

实战要点:K值需要人工指定(这是最大局限),但可以通过“肘部法则”辅助选择。


环境准备与必备库安装

在写代码前,请确保安装以下库:

pip install numpy pandas matplotlib scikit-learn

推荐使用Jupyter NotebookGoogle 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值,但需要调epsmin_samples


常见错误与调优技巧

常见错误

  1. 忘了标准化数据:导致量纲大的特征主导聚类结果
  2. K值随意指定:不经过肘部图或业务分析
  3. 忽略随机种子的影响:K-Means初始中心随机,不同种子可能得到不同结果(设置random_state可复现)
  4. 数据量过大时调用默认参数:大数据集建议用MiniBatchKMeans提速

调优技巧

  • 使用PCA降维到2-3维可视化,先观察数据聚类潜质
  • 尝试不同距离度量(但K-Means只支持欧氏距离)
  • 对文本数据,先转为TF-IDF向量再聚类

总结与进阶学习建议

通过两个案例(模拟数据+真实数据集),你已经掌握了:

  • make_blobs生成测试数据
  • KMeans实现聚类
  • 用肘部法则选择K值
  • StandardScaler做数据标准化
  • inertia_和轮廓系数评估效果

进阶方向

  • 学习层次聚类(适合树形结构数据)
  • 学习DBSCAN(自动发现任意形状簇,无需指定K值)
  • 用聚类做图像压缩(降低颜色数量)
  • 将聚类应用在客户分群实战项目中

最后,记住一句心得:聚类没有绝对正确的答案,只有符合业务解释的“最合理分组”,多尝试、多可视化、多结合业务需求,你就能越用越顺手。


:如果你在CSDN或Stack Overflow搜索“Python K-Means案例”,以上内容已融合了社区最精华的知识点,并进行了去重重组,可以直接复制运行代码,边看边实操,动手能力是学习编程最快的路。

标签: 聚类算法 代码示例

抱歉,评论功能暂时关闭!