31 Python 聚类:层次聚类怎么理解?AGNES 和 DIANA 有什么区别?

Python 数据分析入门:层次聚类怎么理解?AGNES 和 DIANA 有什么区别?

前面我们已经介绍了聚类的基本概念,也讲了最经典的划分式聚类算法 K-Means。

但聚类并不只有"先设 K,再反复调整中心"这一种思路。

还有一类非常重要的方法,叫做:层次聚类

如果说 K-Means 更像是"直接把数据分成几组",

那么层次聚类更像是在回答这样一个问题:

这些样本之间,能不能形成一种从小到大、由细到粗的层次结构?(我理解就是探索的过程,自发现)

这也是它名字里"层次"两个字的含义。

这一篇就来把下面几个问题讲清楚:

  • 什么是层次聚类?
  • 为什么它和 K-Means 不是同一种思路?
  • AGNES 和 DIANA 分别在做什么?
  • 一个是"不断合并",一个是"不断拆分",它们到底差在哪?
  • Python 里怎么实现层次聚类?

一、什么是层次聚类?

层次聚类,顾名思义,就是把数据组织成一种层次结构

你可以先把它想象成"从零散样本到大类归并"的过程,

也可以理解成"从一个整体不断细分"的过程。

和 K-Means 这类划分方法不同,层次聚类并不是一开始就直接把数据定死为几类,

而是更强调:

样本之间是如何一步步合并,或者一步步拆分的。

也就是说,层次聚类关心的不只是"最后分成几类",还关心:

  • 这些类是怎么形成的
  • 哪些样本先聚到一起
  • 哪些簇之间更接近
  • 整个聚类过程有没有明显的层次关系

这类方法会对数据对象集合进行层次分解,形成一个由粗到细或由细到粗的聚类结构。


二、为什么叫"层次"聚类?

因为它的结果不是简单地给你一个"最终分组",

而是会呈现出一种分层组织的关系

比如一批学生数据,最开始可能每个学生都各自独立;

接着,学习行为最相似的学生先形成小组;

再往后,几个小组又会合并成更大的群体;

最后所有样本甚至可能归并成一个整体。

反过来,也可以从一个大群体开始,不断往下拆:

  • 先分成两大类
  • 再把其中一类继续拆分
  • 最后形成更细的多个子类

所以"层次聚类"的重点在于:

类与类之间不是平铺的,而是可以形成上下层关系。


三、层次聚类和 K-Means 有什么不同?

很多初学者学到这里时会问:

"它们不都是聚类吗?到底区别在哪?"

最核心的区别在于:

K-Means 的思路是

  • 先给出簇数 K
  • 直接把数据划分成 K 类
  • 通过不断更新中心来优化结果

层次聚类的思路是

  • 不一定一开始就固定最终类别
  • 更关注类是如何逐步形成的
  • 通过"合并"或"拆分"建立层次结构

也就是说:

K-Means 更像是直接分班,层次聚类更像是先观察谁和谁更接近,再慢慢组织出班级结构。

所以如果你关心的不只是"最后分成几类",而是想知道"这些类是怎么一步步形成的",

那层次聚类通常更有解释性。


四、层次聚类主要有哪两种思路?

层次聚类通常有两种经典路线:

  1. 凝聚式层次聚类:自底向上
  2. 分裂式层次聚类:自顶向下

这两种方法,正好是相反的思路。


五、什么是 AGNES?

AGNES 是典型的凝聚式层次聚类算法。

"凝聚式"这个词听起来有点抽象,其实很好理解:

从小往大合。

它的基本思路是:

  • 一开始,每个样本都是一个独立的簇
  • 然后每一步都找出最相似的两个簇
  • 把它们合并成一个更大的簇
  • 不断重复这个过程
  • 直到满足终止条件

教材中对凝聚式层次聚类的描述就是:

开始时把每个对象都作为一个簇,每一步合并两个最相似的簇,反复进行直到达到终止条件。

这就是 AGNES 的核心思想。


六、怎么直观理解 AGNES?

你可以把 AGNES 想成"搭积木"。

一开始:

  • 每个数据点都是一块单独的小积木

然后:

  • 先把最相近的两块拼在一起
  • 再把最接近的小组继续拼起来
  • 小组再变成更大的组
  • 最终形成一个层级结构

所以 AGNES 的特点是:

先有很多很小的簇,再不断合成更大的簇。

这种方法特别适合回答下面这种问题:

  • 哪些样本最先抱团?
  • 哪些小簇后来合并成了大簇?
  • 整个聚类过程是如何层层归并的?

七、什么是 DIANA?

DIANA 是典型的分裂式层次聚类算法。

它和 AGNES 正好相反。

"分裂式"可以理解成:

从大往小拆。

它的基本思路是:

  • 一开始,把所有对象都放在同一个簇里
  • 然后每一步选择一个簇进行分裂
  • 逐步把一个大簇拆成更小的簇
  • 一直拆到只剩单点簇,或者达到用户设定的簇数为止

这就是 DIANA 的核心逻辑。


八、怎么直观理解 DIANA?

你可以把 DIANA 想成"拆大团"。

一开始所有样本都在一起,像一个大集合。

然后算法会不断问:

  • 这个大集合内部,是不是其实已经有明显差异?
  • 能不能先拆出一个最不相似的小群体?
  • 剩下的部分还要不要继续拆?

于是:

  • 一个大簇拆成两个小簇
  • 小簇再继续拆
  • 最后形成多个更细的类别

所以 DIANA 的特点是:

先有一个大簇,再不断拆成更细的小簇。


九、AGNES 和 DIANA 的本质区别是什么?

如果只记一句话,那就是:

  • AGNES:从下往上合并
  • DIANA:从上往下拆分

更具体一点,可以对比如下:

对比维度 AGNES DIANA
聚类方向 自底向上 自顶向下
初始状态 每个样本单独成簇 所有样本先放在一个簇
每一步操作 合并最相似的两个簇 分裂一个簇
直观理解 搭积木 拆大团

所以它们的差异不是"哪个更高级",而是:

一个是在构建聚合过程,一个是在构建拆分过程。


十、层次聚类里,"相似"是怎么定义的?

这一步非常关键。

无论是 AGNES 还是 DIANA,都绕不开一个问题:

你怎么判断两个簇更接近?

对于 AGNES 来说,因为它每一步都要决定"合并哪两个簇",

所以必须先定义"簇之间的距离"。

在 Python 的层次聚类实现中,常见参数就包括:

  • n_clusters:最终簇数
  • affinity:样本间距离的定义
  • linkage:类间距离的定义

其中 linkage 很关键,常见方式包括:

  • ward
  • average
  • complete

你可以先这样直观理解:

  • average:看两组样本整体平均距离
  • complete:看两组中最远的那种情况
  • ward:更关注合并后整体的紧凑性

虽然名字看起来有点技术化,但本质上它们都在回答同一个问题:

两个簇到底算不算"接近"?

而这个定义不同,最终聚类结果也可能不同。


十一、层次聚类为什么有吸引力?

层次聚类之所以经典,不只是因为它方法老牌,而是因为它有一些很明显的优势。

1. 过程更有解释性

层次聚类不仅给你结果,还给你过程。

你能看到:

  • 哪些样本最先靠近
  • 哪些簇后来被合并
  • 整个结构是如何形成的

这一点是很多"直接划分"的算法不擅长提供的。

2. 适合分析样本之间的层级关系

在某些任务里,我们不只是想知道"分成几类",

还想知道"这些类之间有没有更高层次的相似关系"。

这时层次聚类就特别合适。

3. 不一定非要一开始就死定 K

层次聚类不像 K-Means 那样强依赖一开始给定簇中心。

很多时候你可以先构造出层次结构,再决定从哪一层截断,得到最终类别。


十二、层次聚类有哪些局限?

当然,它也不是万能的。

1. 计算开销通常更大

尤其在样本数量比较大时,层次聚类往往比 K-Means 更慢。

2. 一旦合并或拆分,通常不再回头

比如 AGNES 在某一步把两个簇合并了,后面一般不会再把它们拆开重新调整。

所以前面的决策会影响后面的结构。

3. 对距离定义比较敏感

不同的距离度量方式、不同的 linkage 策略,可能导致差异明显的聚类结果。

所以层次聚类虽然解释性强,但参数选择和距离定义同样很重要。


十三、Python 中怎么实现层次聚类?

在 sklearn 中,层次聚类可以使用:

python 复制代码
AgglomerativeClustering()

从名字也能看出来,它实现的是凝聚式层次聚类,也就是 AGNES 这一类思路。

下面给一个简单示例。

python 复制代码
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering

# 1. 生成数据
X, y = make_blobs(n_samples=300, centers=3, cluster_std=0.8, random_state=42)

# 2. 建立层次聚类模型
model = AgglomerativeClustering(n_clusters=3, linkage='ward')

# 3. 预测类别
labels = model.fit_predict(X)

# 4. 可视化
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=40)
plt.title("Agglomerative Clustering Result")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

十四、这段代码在做什么?

可以按步骤看。

1. 生成模拟数据

这里用 make_blobs 生成了 3 团比较明显的数据,方便观察聚类效果。

2. 建立模型

python 复制代码
model = AgglomerativeClustering(n_clusters=3, linkage='ward')

这里表示:

  • 最终分成 3 类
  • 使用 ward 方式来定义合并策略

3. 训练并得到类别

python 复制代码
labels = model.fit_predict(X)

模型会根据层次聚类思路,把样本逐步合并,最后给出每个样本所属的簇编号。

4. 可视化结果

最后把聚类后的结果画出来,不同颜色表示不同类别。


十五、什么时候适合考虑层次聚类?

如果你遇到下面这些情况,可以优先考虑层次聚类:

  • 想分析样本之间的层次关系
  • 不只是关心结果,还关心聚类形成过程
  • 希望得到更有解释性的聚类结构
  • 数据规模不算特别大
  • 想作为 K-Means 之外的补充分析方法

它尤其适合做"结构分析型"任务,而不只是"快速分组型"任务。


十六、课后思考

可以试着回答下面几个问题:

  1. 层次聚类和 K-Means 的核心思路有什么不同?
  2. 为什么 AGNES 叫"凝聚式"层次聚类?
  3. 为什么 DIANA 叫"分裂式"层次聚类?
  4. AGNES 和 DIANA 的初始状态分别是什么?
  5. 为什么层次聚类里,距离定义和 linkage 方式会影响最终结果?

如果这些问题你都能比较顺畅地回答出来,说明你已经抓住了层次聚类最核心的理解框架。


十七、本文总结

这篇文章主要回答了一个问题:

层次聚类到底在"层次"什么?AGNES 和 DIANA 又有什么区别?

可以把核心内容概括成下面几点:

  • 层次聚类强调的是数据如何形成层次结构
  • 它和 K-Means 的区别在于:不只是给最终结果,还关注聚类形成过程
  • AGNES 是凝聚式层次聚类,思路是自底向上不断合并
  • DIANA 是分裂式层次聚类,思路是自顶向下不断拆分
  • Python 中常用 AgglomerativeClustering() 实现凝聚式层次聚类
  • 层次聚类更有解释性,但也更依赖距离定义和合并策略

如果用一句话总结:

AGNES 是"从散到聚",DIANA 是"从整到分",它们共同构成了层次聚类最经典的两条路线。

相关推荐
炸炸鱼.34 分钟前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_1 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦2 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu2 小时前
Python 语法之数据结构详细解析
python
AI问答工程师2 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5203 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕3 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙3 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话4 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥4 小时前
VRChat开发环境配置,零基础教程
python