1503其他聚类方法

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:掌握层次聚类(AgglomerativeClustering)的基本思想(自底向上合并);掌握 DBSCAN 的核心概念(密度可达、核心点、边界点、噪声点);理解 k-means、层次聚类、DBSCAN 三种方法的适用场景差异。
  • ⚙️ 能力目标:能够使用 AgglomerativeClustering 进行聚类并绘制树状图(dendrogram);能够使用 DBSCAN 处理非球形簇数据;能够根据数据特点初步选择合适的聚类方法。
  • 💡 素养目标:建立“没有万能算法,只有合适算法”的工程思维;理解不同聚类方法的设计哲学——基于距离 vs 基于密度。

【重点与难点】

  • 🟢 教学重点:层次聚类的合并过程(距离最近的簇合并);DBSCAN 的核心概念(eps、min_samples);三种方法的对比与选型。
  • 🟡 教学难点:理解 DBSCAN 的“密度可达”概念;理解层次聚类中“距离度量方式”对聚类结果的影响。

📌 一、 课程导入(5 分钟)

回顾与反思

  • k-means 简单高效,但有两个明显的局限:
    1. 需要指定 K 值(有些时候我们根本不知道数据有几群)。
    2. 只能发现球形簇(如果数据形状复杂,比如月牙形、环形,k-means 会失效)。

展示问题: 在大屏幕上同时展示三张散点图:

  1. 圆形簇(k-means 擅长)。
  2. 月牙形簇(k-means 不擅长)。
  3. 环形簇(k-means 彻底失效)。

引出新课: 今天介绍两种新的聚类方法,分别解决上述两个问题:

  • 层次聚类 → 不需要提前指定 K 值(自动生成聚类树)。
  • DBSCAN → 可以处理任意形状的簇(基于密度,而非距离)。
  • 👨‍🏫 教师活动:展示三种数据形状的散点图;提问“如果只用 k-means,哪张图的效果会最差?”;引出“需要新的工具”的结论。
  • 🧑‍🎓 学生活动:观察三张散点图,思考 k-means 在月牙形和环形数据上会如何失败(画出可能的质心和聚类边界)。

通过视觉对比制造“k-means 能力边界”的认知,为引入新方法建立必要性。让学生意识到:没有万能模型,选择合适的方法比优化参数更重要。


📖 二、 解决问题过程(一):层次聚类(Hierarchical Clustering)

1. 核心思想——自底向上合并(凝聚层次聚类)

flowchart TD
    A["每个样本单独作为一个簇"] --> B["计算所有簇两两之间的距离"]
    B --> C["合并距离最近的两个簇"]
    C --> D{"是否达到停止条件<br>(K值或距离阈值)"}
    D -->|否| B
    D -->|是| E["输出聚类结果(树状图)"]

关键概念——树状图(Dendrogram)

  • 横轴:每个样本
  • 纵轴:合并时的距离(或相似度)
  • 从下往上看:距离越近的样本越先合并
  • 选择一条水平线切断树 → 得到不同 K 值的聚类结果

2. 代码实现

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.cluster import AgglomerativeClustering
 4from scipy.cluster.hierarchy import dendrogram, linkage
 5from sklearn.datasets import make_blobs
 6
 7# 生成数据
 8X, _ = make_blobs(n_samples=50, centers=3, cluster_std=0.6, random_state=42)
 9
10# 训练层次聚类(K=3)
11agg = AgglomerativeClustering(n_clusters=3)
12y_pred = agg.fit_predict(X)
13
14# 可视化
15plt.figure(figsize=(8, 5))
16plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
17plt.title('层次聚类结果 (K=3)')
18plt.grid(True)
19plt.show()
20
21# 绘制树状图
22linkage_matrix = linkage(X, method='ward')
23plt.figure(figsize=(10, 5))
24dendrogram(linkage_matrix)
25plt.title('树状图 Dendrogram')
26plt.xlabel('样本索引')
27plt.ylabel('合并距离')
28plt.axhline(y=5, color='r', linestyle='--', label='在距离=5处切断 → 自动得到聚类数')
29plt.legend()
30plt.show()

3. 层次聚类的优势

  • 不需要预设 K 值(通过树状图决定切断位置)。
  • 可解释性强(树状图直观展示聚类层次关系)。
  • 适用于小数据集(计算复杂度 O(n³),不适合大数据)。
  • 👨‍🏫 教师活动:运行层次聚类代码,展示树状图;用红色虚线演示“在不同高度切断 → 得到不同 K 值”。
  • 🧑‍🎓 学生活动:观察树状图,尝试在不同的切断高度读取对应的 K 值;讨论“如果数据量很大,这种方法会遇到什么问题”。

树状图的视觉呈现比 k-means 的 inertia 曲线更直观地展示了“聚类的层次结构”。学生通过“用鼠标拖动切断线”的交互,能直观理解“不同距离阈值 → 不同聚类粒度”。


📖 三、 解决问题过程(二):DBSCAN(基于密度的聚类)

1. 核心思想——密度相连

k-means 用“距离”定义相似性,DBSCAN 用“密度”定义簇——密集区域形成一个簇

2. 三个关键概念

概念 定义 图示
核心点(Core Point) 在半径 eps 内至少包含 min_samples 个点 红色点
边界点(Border Point) 在核心点的 eps 范围内,但自身密度不够 绿色点(附着在红色簇的边缘)
噪声点(Noise Point) 既不是核心点,也不在任何核心点的 eps 范围内 蓝色点(孤立点)
flowchart LR
    subgraph 核心点
        A["eps 范围内 ≥ min_samples 个点"]
    end
    subgraph 边界点
        B["在核心点附近,但自身密度不够"]
    end
    subgraph 噪声点
        C["孤立、不属于任何簇"]
    end
    D["密度可达:由核心点→边界点→……传播"] --> E["形成完整簇"]

3. 两个核心参数

参数 含义 调参直觉
eps 邻域半径 太小 → 很多点被标为噪声;太大 → 所有点聚成一团
min_samples 成为核心点所需的最少邻居数 太大 → 核心点减少,簇变少;太小 → 噪声点减少,簇增多

4. 代码实现

 1from sklearn.cluster import DBSCAN
 2from sklearn.datasets import make_moons
 3
 4# 生成月牙形数据(k-means 的克星)
 5X, _ = make_moons(n_samples=300, noise=0.05, random_state=42)
 6
 7# DBSCAN 聚类
 8dbscan = DBSCAN(eps=0.3, min_samples=5)
 9y_pred = dbscan.fit_predict(X)
10
11# 可视化
12plt.figure(figsize=(8, 5))
13plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
14plt.title('DBSCAN 聚类结果(月牙形数据)')
15plt.grid(True)
16plt.show()
17
18print(f"类别数:{len(set(y_pred)) - (1 if -1 in y_pred else 0)}")
19print(f"噪声点数:{sum(y_pred == -1)}")

5. DBSCAN 的优势

  • 不需要指定 K 值(自动发现簇数量)。
  • 能发现任意形状的簇(月牙形、环形等)。
  • 能自动识别噪声点(标记为 -1)。
  • 👨‍🏫 教师活动:在月牙形数据上运行 DBSCAN,对比 k-means 的失败结果;调整 eps 和 min_samples,展示参数变化的影响。
  • 🧑‍🎓 学生活动:在本地运行 DBSCAN 代码;尝试不同的 eps 值(0.1, 0.2, 0.3, 0.5),观察聚类结果和噪声点数量的变化。

通过“月牙形”这一 k-means 的典型失败案例,展示 DBSCAN 的独特优势,加深“不同算法解决不同问题”的工程选型意识。


✍️ 四、 解决问题过程(三):三种聚类方法的对比与选型

1. 完整对比表格

维度 K-Means 层次聚类 DBSCAN
是否需要预设 K ✅ 需要 ❌ 不需要(通过树状图决定) ❌ 不需要(自动发现)
簇形状 仅限球形 任意形状(受距离度量影响) 任意形状(基于密度)
噪声处理 ❌ 无(每个点必归一类) ❌ 无 ✅ 自动标记噪声为 -1
计算复杂度 O(n·K·d·t) O(n²·log n) O(n·log n)
适用数据量 大(快速) 小(树状图绘制慢) 中等(对 eps 敏感)
主要缺点 需指定 K,仅球形簇 计算慢,不适合大数据 对参数 eps 敏感

2. 选型决策树(快速指南)

flowchart TD
    A["📊 待聚类数据"] --> B{"是否知道 K 值?"}
    B -->|知道| C{"簇形状是否规则(球形)?"}
    B -->|不知道| D{"是否需要自动识别噪声?"}
C --&gt;|是| E[&#34;✅ K-Means&#34;]
C --&gt;|否| F[&#34;✅ DBSCAN&#34;]

D --&gt;|是| G[&#34;✅ DBSCAN&#34;]
D --&gt;|否| H{&#34;数据量是否适中(&lt; 5000)?&#34;}

H --&gt;|是| I[&#34;✅ 层次聚类&#34;]
H --&gt;|否| J[&#34;⚠️ 尝试 DBSCAN 或降维后层次聚类&#34;]</pre>

3. 典型案例推荐

应用场景 推荐方法 理由
客户分群(已知分3类) K-Means 速度快,结果稳定
探索性数据分析(未知K) 层次聚类 树状图辅助判断K值
地理空间位置聚类 DBSCAN 可发现任意形状的热点区域
图像压缩(颜色量化) K-Means 效率高,效果好
异常检测(数据中有离群点) DBSCAN 自动识别噪声
生物分类(物种亲缘关系) 层次聚类 树状图展示进化关系
  • 👨‍🏫 教师活动:逐个讲解对比表格中的维度;用“选型决策树”引导学生快速定位合适算法;展示每个典型案例的简短代码或结果图。
  • 🧑‍🎓 学生活动:选择一个自己感兴趣的应用场景,用决策树推导出推荐算法;分组讨论“如果业务方要求既要知道K值又要识别噪声,应该怎么办?”(答案:先用DBSCAN识别噪声,再对剩余数据用K-Means)。

选型决策树将三类算法的特征转化为一个可操作的决策流程,帮助学生在面对新数据时快速做出合理选择。典型案例帮助学生建立“场景-算法”的映射记忆。


📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 聚类方法全景(第三次课)"]

    subgraph C1["📌 K-Means"]
        direction TB
        A1["✅ 快速、简单"]
        A2["⚠️ 需指定K、仅球形簇"]
    end

    subgraph C2["📌 层次聚类"]
        direction TB
        B1["✅ 不需K、树状图直观"]
        B2["⚠️ 计算慢、不适合大数据"]
    end

    subgraph C3["📌 DBSCAN"]
        direction TB
        C1_node["✅ 任意形状、自动识别噪声"]
        C2_node["⚠️ 对eps参数敏感"]
    end

    subgraph C4["🎯 选型原则"]
        direction TB
        D1["K已知 + 球形 → K-Means"]
        D2["探索性分析 → 层次聚类"]
        D3["复杂形状 + 噪声 → DBSCAN"]
    end

    root --> C1
    root --> C2
    root --> C3
    root --> C4

    style root fill:#1565c0,stroke:#0d47a1,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e3f2fd,stroke:#1e88e5,stroke-width:1px
    style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C3 fill:#e8f5e9,stroke:#43a047,stroke-width:1px
    style C4 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 以下哪种聚类方法能够自动识别数据集中的噪声点?
  • A. K-Means
  • B. 层次聚类
  • C. DBSCAN
  • D. 以上都不能
【答案】

【解析】C。DBSCAN 将密度不足的孤立点标记为 -1(噪声),K-Means 和层次聚类每个点都会被分配到某个簇。

  1. 以下哪种聚类方法最适合发现月牙形(非球形)的数据簇?
  • A. K-Means
  • B. DBSCAN
  • C. 层次聚类(使用欧氏距离)
  • D. 以上所有方法效果相同
【答案】

【解析】B。K-Means 基于欧氏距离,只能发现球形簇。DBSCAN 基于密度,可以识别任意形状的簇。

  1. 层次聚类相对于 K-Means 的主要优势是?
  • A. 计算速度更快
  • B. 不需要预设 K 值,可通过树状图确定
  • C. 能自动识别噪声点
  • D. 适用于任意形状的簇
【答案】

【解析】B。层次聚类通过树状图展示聚类层次,用户可在不同高度切断获得不同 K 值。A 错误(层次聚类更慢),C 是 DBSCAN 的特点,D 受限距离度量。

二、 匹配题

题目:将下列应用场景与最合适的聚类方法匹配。

场景 方法
① 已知要分成 5 个客户群,数据量 10 万条 A. 层次聚类
② 探索数据是否有自然分组,数据量 500 条 B. DBSCAN
③ 地理空间热点发现,存在大量噪声点 C. K-Means
【答案】

① → C(K-Means,速度快,K已知) ② → A(层次聚类,探索性分析,数据量小) ③ → B(DBSCAN,任意形状 + 噪声识别)

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础作业:使用 make_moons 生成月牙形数据,分别用 K-Means 和 DBSCAN 进行聚类,并排显示两张聚类结果图,观察差异。
  2. 层次聚类作业:使用 make_blobs 生成 200 个样本、4 个簇的数据,使用 AgglomerativeClustering 进行聚类,并绘制树状图。
  3. DBSCAN 调参作业:在月牙形数据上,固定 min_samples=5,分别设置 eps=0.05, 0.1, 0.2, 0.3, 0.5, 1.0,记录每个 eps 对应的簇数量和噪声点数量,分析参数变化对结果的影响规律。
  4. 综合对比作业:生成一个包含噪声点的环形数据集(make_circles),分别用 K-Means、层次聚类、DBSCAN 三种方法聚类,对比结果并写出 150 字以内的总结。
  5. 拓展阅读:查阅资料,了解“谱聚类(Spectral Clustering)”的基本思想,它与本节学习的三种方法有何不同?

📋 七、 板书设计

🛠️ 板书设计…
 1📊 聚类方法全景 – 第三次课
 2
 3一、 层次聚类(Hierarchical)
 4    核心:自底向上合并(每个点→合并最近的→……→树状图)
 5    优点:不需要K值,树状图直观
 6    缺点:计算慢(O(n²·logn)),不适合大数据
 7
 8二、 DBSCAN(Density-Based)
 9    核心:密度相连(核心点→边界点→噪声点)
10    核心参数:eps(半径)、min_samples(最小邻居数)
11    优点:任意形状簇、自动识别噪声
12    缺点:对eps参数敏感
13
14三、 选型原则(记忆口诀)
15    · 知道K,球形簇 → K-Means(快)
16    · 不知K,小数据 → 层次聚类(看树状图)
17    · 形状怪,有噪声 → DBSCAN(密度为王)
18
19四、 三方法对比(一句话总结)
20    K-Means:基于距离,硬划分
21    层次聚类:基于距离,层次划分
22    DBSCAN:基于密度,灵活划分

本课用到的单词

英文术语 发音(美式) 中文释义 专业语境解释
Hierarchical Clustering /ˌhaɪəˈrɑːr.kɪ.kəl ˈklʌs.tər.ɪŋ/ 层次聚类 通过自底向上合并或自顶向下分裂构建聚类层次树的方法。
Dendrogram /ˈden.droʊ.ɡræm/ 树状图 展示层次聚类合并过程的树形图,横轴为样本,纵轴为合并距离。
DBSCAN /diː.biː.es.siːˈeɪn/ 基于密度的聚类 Density-Based Spatial Clustering of Applications with Noise,一种基于密度连通性的聚类方法。
Epsilon (eps) /ˈep.sɪ.lɒn/ 邻域半径 DBSCAN 中定义“邻域”的半径参数,核心概念。
Core Point /kɔːr pɔɪnt/ 核心点 DBSCAN 中邻域内至少有 min_samples 个点的样本。
Noise Point /nɔɪz pɔɪnt/ 噪声点 DBSCAN 中不属于任何簇的孤立点,标记为 -1。
Density Reachable /ˈden.sə.ti rɪˈtʃə.bəl/ 密度可达 DBSCAN 中通过一系列核心点连接起来的点的关系。