跳到主内容

什么是层次聚类?不用预设也能分几类

2026-10-06 发布 来源:我告诉你AI导航 阅读

运营同事把一份三千人的客户表推到你面前,问这些人能分成几类。这类分组任务如今常交给 AI 处理,可如果手里只有 K-means,你得先反问一句你想分几类,而对方常常答不上来。层次聚类绕开了这个死结:它把从人人各成一类到全体归为一类的...

运营同事把一份三千人的客户表推到你面前,问这些人能分成几类。这类分组任务如今常交给 AI 处理,可如果手里只有 K-means,你得先反问一句你想分几类,而对方常常答不上来。层次聚类绕开了这个死结:它把从人人各成一类到全体归为一类的所有中间状态一次算完,画成一棵树,类别数量留到看完结构之后再定。这篇讲清它按什么规则合并、树状图怎么读、哪些情况下它会给出看似合理却误导人的分组,以及它和 K-means、DBSCAN 在假设上的根本差别。

它把分几类这个决定往后挪

聚类任务里最难受的一步,往往是开口就要一个 K。K 定错了,后面的业务解释全跟着错,而且错得没有任何提示。层次聚类的处理方式是把这件事拆成两半:机器负责算出所有可能的层次,人负责在树上挑一个高度切开。这个顺序调换看着不起眼,实际影响很大——你先看到哪两拨人最近、它们又和谁更远,再决定切几刀,判断依据从凭感觉变成了看结构。代价是它必须把所有层次都保存下来,这也解释了后面要说的计算量问题。

合并规则决定树的形状

每次合并都要回答一个问题:两类之间隔多远。这个类间距离的定义有四种常见选法,选哪个直接决定树长什么样,很多人只调了样本和距离,却没意识到自己换的是假设。

连接准则类间距离怎么算倾向形成的簇典型失效
单链取两类中最近的一对点细长的、串联的簇两点间只要有一条密集通道,就会被连成一类
全链取两类中最远的一对点紧凑、大小接近的簇大簇容易被拆开,长条结构识别不出来
平均链取两类所有点对距离的平均折中,相对稳健对簇的尺度差异仍然敏感
Ward选合并后组内方差增加最少的一对球形、方差相近的簇本质上仍假设簇是凸的,遇到环形结构会切错

四种准则没有优劣,只有匹配与否。同一份数据换一种连接方式,可能从三类变成七类,而你并没有改动任何一个样本。所以看到别人给的层次聚类结果,先问一句用的是哪种连接准则,比盯着树状图本身更能判断结论可不可信。距离本身怎么定义同样关键,欧氏距离和余弦距离在文本、嵌入向量上的表现差别很大,可参考 余弦相似度与欧氏距离的区别。

为什么早期的合并改不回来

层次聚类是贪心的:每一步只挑当下最近的两类合并,合完就不再回头。这个设计带来速度上的便利,也带来一个硬伤——第一步如果合错了,后面所有层次都建在这个错误之上,误差会沿着树往下传。想象整理一屋子档案,先把两份本不该放一起的材料装进同一个盒子,之后无论怎么整理上层目录,这个盒子里的内容都已经混了。K-means 反而没有这个包袱,它可以反复迭代、把点重新分配;层次聚类一旦合并,只能接受。

合并了就再也拆不回来

三个限制必须说清楚。计算量上,两两距离矩阵随样本数平方增长,常见实现是平方级空间、立方级时间,样本上万就开始吃力,这也是它在大数据场景里很少做首选的原因。稳健性上,单链对噪声极其敏感,一个孤立点就能把两团数据串起来;平均链和 Ward 好一些,但也谈不上免疫。解释性上,切几刀仍然是人定的,树状图只告诉你结构,不告诉你业务上该分几类,切在不同高度得到的结论可以完全不同,而没有一个内部标准能替你裁决。此外,它默认簇是距离近的一团,如果数据里根本没有簇结构,它照样会给你一棵漂亮的树——这是最危险的一种输出,因为图看起来永远合理。

什么时候选它,什么时候换掉

样本在几百到几千、又需要向别人解释类别之间的层次关系时,它很合适,比如少量客户的分群、基因表达谱的归类。数据量上去以后,通常换成 K-means,用速度换掉层次信息;数据里噪声多、簇形状不规则时,DBSCAN 更对路,它允许一部分点不属于任何簇。还有一种折中做法:先用层次聚类在小样本上看看大致该分几类,再把这个 K 交给 K-means 去跑全量,两边的好处各取一半。

看懂一张树状图能得到什么

对不写代码的人,树状图仍然有用,因为它把相似度变成了可以指着说的东西:这两类在很低的高度就合并了,说明它们几乎分不开;那两类要到很高的位置才并进来,说明差异明显。做业务判断时,这种结构信息比一个类别编号更有价值,它告诉你哪些群体是渐变的,哪些是断开的。真正的风险在于把树当成结论:树只是对你所选距离和连接准则的一次呈现,换个度量,故事可能就变了。

速查:层次聚类

  • 两种方向:自底向上聚合(常用)、自顶向下分裂
  • 四个关键选择:距离度量、连接准则、切树高度、是否标准化
  • 成本量级:随样本数平方增长,上万样本慎用
  • 最大风险:早期错误合并不可撤销,没有簇结构时也会输出一棵树

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]