想象一下,你要举办一场大型家族聚会:八大房亲戚,有人住得近、有人性格像、有人多年不来往。你不能提前决定“必须分五桌”,因为到底该分几桌,取决于亲疏关系自发形成的格局。于是你画了一张家谱:先是小家庭,再是大家族,最后汇成整个宗族——什么时候想切几桌,就在家谱上相应的高度切一刀。这就是层次聚类(Hierarchical Clustering)的直观模样:它把每个数据点当成一个人,通过“谁和谁更亲近”的信息,自底向上不断合并,最终画出一棵可供任意裁剪的“家族树”(树状图)。 层次聚类的核心优势在于:它不需要你预先定好簇数,而是先把数据的层级结构完整呈现出来,再让你根据业务需要挑选切割位置。无论是客户分群、基因表达分析,还是文档主题组织,只要你想探索“数据天然长什么样”,它都是极好的起点。

岗位关联

掌握层次聚类,意味着你能在“不知道分几类”的探索性场景中找到数据的自然层级,这是算法工程师做无监督分析的基本功,也是向业务方讲清“数据是分层的”这件事的最佳工具。

目录
  1. 可视化演示
  2. 认识层次聚类
  3. 距离度量
  4. 合并策略
  5. 算法流程
  6. 树状图解读
  7. 簇数选择
  8. 应用与局限
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示自底向上层次聚类两大核心:数据点从个体逐步合并为簇的聚合过程,以及树状图(Dendrogram)的U型连接结构与三种簇间连接方式(单连接/全连接/均连接)。

本节配有交互动效(进入视口后自动加载,约 3KB)。

自底向上聚合合并过程 初始:8个数据点各自为一簇 合并:距离最近的点对优先合并 终止:所有点合并为一个簇 d(C_i, C_j) = min ||x_i - x_j|| 每步合并距离最近的两个簇直至全部聚合。

认识层次聚类

回到那场家族聚会。你站在大厅中央,不打算硬性规定“分五桌”,而是先观察:谁和谁总在一起聊天,谁家与谁家来往密切。渐渐地,小圈子浮现出来,小圈子又聚成大圈子,最终整个家族形成一张层次分明的网。这张网就是我们说的“树状结构”——最底下是每一个具体的人,越往上越亲近的人被越早圈到一起。

在机器学习里,这种“不预设分组数、先找出层级结构”的做法,就叫层次聚类。它属于无监督学习,就像一个家族史学家,不被告知“该分成几个家族”,只被告知每个人的特征,然后通过特征间的远近,把数据组织成一棵树。层次聚类有两种方向:自底向上的“聚合式”,也就是本篇文章的主角,它从每个样本独自成簇开始,不断合并最近的簇;另一种是自顶向下的“分裂式”,一开始把所有样本当成一个簇,再不断拆开。

聚合式层次聚类之所以受欢迎,是因为它的输出非常灵活:合并过程形成一棵树,你可以在这棵树的任意高度“切一刀”,得到想要的聚类结果,而不需要提前回答“到底分几类”。这个特性尤其适合探索性分析——当我们对数据一无所知、只想看看它天然长成什么样的时候,层次聚类是最诚实的助手。

聚合式层次聚类在每一轮只做一件事:把当前所有簇中“距离最近”的两个簇合并成一个新簇。用集合语言描述,设当前簇集合为 $C_t$,选中的两个簇是 $C_i$、$C_j$,则下一轮的簇集合变为:

就这样,家族聚会从一个人一个人开始,逐步合并成小家庭、大家族,最后汇成一个根节点。下一节我们来看,到底用什么标准判断“谁和谁更亲近”。

Ct+1=(Ct∖{Ci,Cj})∪{Ci∪Cj}C_{t+1} = \left( C_t \setminus \{C_i, C_j\} \right) \cup \{C_i \cup C_j\}
这个式子只是在说:把旧集合里的两个簇拿掉,放进一个合并后的新簇,其余簇原地不动。
  1. 当前簇集合$C_t$ 表示第 $t$ 轮时手中所有的簇,初始时每个样本各自成一个簇。
  2. 选出最近两簇$C_i$、$C_j$ 是当前距离最近的两个簇,这一步由“距离度量”和“合并策略”共同决定。
  3. 移走旧簇$C_t \setminus \{C_i, C_j\}$ 表示从集合中删掉这两个旧簇,避免它们被重复合并。
  4. 加入新簇$\cup \{C_i \cup C_j\}$ 表示把两个旧簇的元素合并成一个新簇,再放回集合中,循环往复直到只剩一个簇。

距离度量

要判断两位亲戚“亲不亲”,标准可以有很多:住得近不近、性格合不合、每年走动的次数多不多。机器学习中的距离度量就是这套标准的数学化。最朴素也最常用的,是欧氏距离——想象你在城市地图上画一条直线连接两个点,这条直线的长度就是欧氏距离。它直接衡量两个样本在每个特征维度上的综合差异。

把每个样本看成多维空间里的一个点,特征就是这个点的坐标。对于两个样本 $x$ 和 $y$,它们的欧氏距离是:

其中 $p$ 是特征个数,$x_k$、$y_k$ 是它们在第 $k$ 个特征上的取值。

除了欧氏距离,还有一种常见的“曼哈顿距离”,它不追求直线,而是像在城市街区里只能横平竖直地走路一样,把每个维度上的绝对差直接相加。它更适合特征维度彼此独立、且不希望大差距被过度放大的场景。而在文本或用户画像等高维稀疏数据里,人们还会用余弦相似度来衡量方向的“合拍”程度。

需要特别注意的是:在算距离之前,一定要先做特征标准化。假如“年收入”以万元为单位、“年龄”以岁为单位,收入数值往往在几十的量级,年龄只有几十,距离计算会被收入主导,就像家族聚会中只看“谁有钱”而忽略了性格合不合。通常的做法是把每个特征缩放到均值 0、方差 1,让所有维度在距离计算里“平等发言”。

d(x,y)=∑k=1p(xk−yk)2d(x, y) = \sqrt{\sum_{k=1}^{p} \left( x_k - y_k \right)^2}
  1. 特征差值$x_k - y_k$ 表示两个样本在第 $k$ 个维度上的差距,比如“年龄差了 5 岁”。
  2. 逐维平方$\left( x_k - y_k \right)^2$ 把每个维度的差距取平方,既消除正负号,也放大较大差距的影响。
  3. 所有维度求和$\sum_{k=1}^{p}$ 把各个特征上的差距平方加总,得到一个总的差异量。
  4. 开方还原$\sqrt{\cdot}$ 将平方和开根号,把单位还原成原始量纲,这就是两点间的直线距离。

合并策略

现在问题来了:两个“家族”各有很多人,到底用什么指标判断这两个家族整不整亲近?这就像两家人商量联姻:是只看两家关系最好的那两个人,还是要求所有人彼此都熟络?三种经典策略给出了不同答案。

单连接(single linkage)只看两个簇之间“最近的一对点”的距离,像媒人只看两人来电就撮合两家。它的好处是能发现细长的簇,但坏处是容易产生“链式效应”——如果 A 与 B 近、B 与 C 近,即使 A 与 C 毫无关系,也会被一路连到一起。全连接(complete linkage)则看“最远的一对点”的距离,要求两家所有人都能接受,形成的簇更紧凑,但对离群点很敏感。平均连接(average linkage)取所有点对距离的平均值,是折中且常用的选择。

单连接的簇间距离定义为:

除了这三种,还有 Ward 法:它不直接看簇间距离,而是计算“如果合并这两个簇,簇内方差会增加多少”,我们总是选择让方差增加最小的合并方式。这就像两家合并成一个大家庭时,希望新家庭内部的生活方式最一致,不要吵吵闹闹。Ward 法在现实中很受欢迎,因为它倾向于生成大小均匀、紧凑的球状簇。

选择哪种合并策略,直接决定了家族树的形状。如果你用的是单连接,树状图容易拉出长长的“链”;如果希望每个簇都抱团紧密,全连接或 Ward 会更合适。实际项目中,平均连接和 Ward 是默认首选。

dsingle(Ci,Cj)=min⁡a∈Ci,b∈Cjd(a,b)d_{\text{single}}(C_i, C_j) = \min_{a \in C_i, b \in C_j} d(a, b)
  1. 任取两点$a \in C_i$ 表示从簇 $C_i$ 中任取一个样本,$b \in C_j$ 同理取自另一个簇。
  2. 点对距离$d(a, b)$ 是这两个点之间的距离,由上一节的距离度量计算。
  3. 取最小值$\min$ 表示扫描所有跨簇点对,挑出最小的那个距离,作为两个簇之间的“亲密度”。

算法流程

现在我们把整个“写家谱”的过程整理成一份可执行的操作手册。假设我们有一份 8 位亲戚名单,每个人的性格、收入、爱好都记录在案。聚合式层次聚类的算法流程如下:

1. 初始化:把每个样本看作一个独立的簇,此时共有 $n$ 个簇。

2. 计算距离矩阵:用选定的距离度量,计算所有簇两两之间的距离,得到一个 $n \times n$ 的对称矩阵。

3. 寻找最近簇:在距离矩阵中找到最小值对应的两个簇。

4. 合并:将这两个簇合并成一个新簇,簇数减一。

5. 更新距离矩阵:用选定的合并策略,计算新簇与其余所有簇的距离,替换掉旧记录。

6. 重复:重复步骤 3-5,直到所有样本合并成一个大簇。

这个过程像极了写家谱:先列出所有人,再比较谁和谁最亲密,把最亲密的两家写成一个小家庭,然后重新评估这个小家庭与其他家庭的关系,继续合并,一层一层往上盖。

在平均连接策略下,新簇 $C_i \cup C_j$ 与某个旧簇 $C_k$ 的距离,可以高效地由旧距离递推得到:

这种递推式更新的好处是效率高:不必每次重新计算所有点对,而是复用之前算好的簇间距离。整个过程就像家族图谱中的“关系簿”不断变薄,直到最后只剩一行记录——所有人在同一个根节点下。

从代码实现的角度看,这个流程可以用一个距离矩阵加一个循环轻松实现。下面“Python 演示”一节会给出完整可运行的代码,让大家亲眼看到这棵家族树长出来的过程。

davg(Ci∪Cj,Ck)=∣Ci∣ davg(Ci,Ck)+∣Cj∣ davg(Cj,Ck)∣Ci∣+∣Cj∣d_{\text{avg}}(C_i \cup C_j, C_k) = \frac{|C_i| \, d_{\text{avg}}(C_i, C_k) + |C_j| \, d_{\text{avg}}(C_j, C_k)}{|C_i| + |C_j|}
  1. 按人数加权$|C_i|$ 是簇 $C_i$ 中的样本个数,簇越大,它对平均距离的影响越大。
  2. 两项距离$d_{\text{avg}}(C_i, C_k)$ 与 $d_{\text{avg}}(C_j, C_k)$ 分别是新簇的两个组成部分到 $C_k$ 的平均距离。
  3. 加权平均分子是两个距离乘各自人数再加总,分母是总人数,得到的比值就是合并后的簇到 $C_k$ 的平均距离。

树状图解读

合并过程完成后,我们得到的不只是最终的聚类结果,更是一张完整的“家谱图”——树状图(dendrogram)。它的横轴排列着所有样本(相当于每个家族成员),纵轴表示合并时两个簇之间的距离(相当于亲缘关系跨越了多少代)。图中每一根竖线代表一个样本或一个簇,竖线之间连接的高度,就是它们被合并时的距离。

读树状图有两条心法。第一,竖线连接的高度越低,说明两个样本越亲近——就像家谱上亲兄弟比远方表亲离得更近。第二,在任意高度画一条水平线,这条线穿过的竖线数量,就是对应聚类数。水平线切得越低,得到的簇越多也越细;切得越高,簇越少越粗。这正是层次聚类“不需要预设簇数”的精髓:树先画好,切哪里由你决定。

更严格地说,给定切割高度 $h$,树状图中被切开的子树数量就是聚类数。令每个内部节点记录其合并高度,则:

举个例子:如果我们在高度 0.5 处横切一刀,发现竖线穿过了 3 根,那么数据可以分成 3 个簇;把刀提到高度 1.2,竖线只剩下 2 根,就变成 2 个簇。树状图就像一张家族总谱,任何世代的划分都可以通过一次切割实现,这也是它比 K-Means 更灵活的地方。

k(h)=#{子树的根∣该根的合并高度>h}k(h) = \#\left\{ \text{子树的根} \mid \text{该根的合并高度} > h \right\}
  1. 子树根树状图中每个内部节点是一棵子树的根,它代表一次合并产生的新簇。
  2. 合并高度每个内部节点都有一个合并高度,即参与合并的两个簇当时的距离。
  3. 大于阈值如果某个根的合并高度大于 $h$,说明它在切割线上方,它对应的子树会被保留为一个独立簇。
  4. 计数$\#$ 表示统计满足条件的根的个数,这个数就是在高度 $h$ 切割得到的簇数。

簇数选择

树状图画好了,可到底切几刀、分几族才合适?这里没有绝对正确的答案,但有几条实用的经验法则。

第一种是距离阈值法:直接观察树状图中合并距离的变化。如果某次合并发生时距离突然跳得很大,说明之前合并的都是“亲密家人”,而这次合并的是“远房亲戚”,那么在这个跳变之前的位置切割往往是自然的。另一种更量化的做法是寻找“高度跳变”最大的位置:将合并距离从小到大排序,找到相邻两次合并距离差最大的点,把它对应的合并轮次作为簇数的候选。

假设第 $t$ 次合并的距离为 $d_t$(按合并发生的先后排序),我们寻找跳变最大的位置:

除了看距离跳变,业务需求同样重要。做客户分群时,运营团队可能只需要 4 个细分人群,因为资源只够设计 4 套运营方案;即使统计上更合理的切分点是 6 族,也要尊重业务约束。轮廓系数则是纯数据视角的辅助指标:它衡量样本与自己簇内样本的相似度是否远高于与最近邻簇的相似度,数值越高说明聚类越清晰。

需要提醒的是,簇数选择本质上是一种“艺术 + 科学”的权衡:树状图提供了全面信息,但最终的切割高度必须结合可解释性和业务目标。就像家族聚会中,切几桌要看餐厅大小、人数和人际关系,而不是只看家谱图上哪条线最长。

t∗=arg⁡max⁡t  (dt+1−dt)t^* = \arg\max_{t} \; \left( d_{t+1} - d_t \right)
  1. 合并距离序列$d_t$ 是第 $t$ 次合并时的簇间距离;距离越大,说明被合并的两个簇越不相像。
  2. 相邻差$d_{t+1} - d_t$ 表示相邻两次合并之间的距离增长量,也就是“这次突然疏远了多少”。
  3. 取最大$\arg\max$ 找到使该差值最大的 $t$,这往往意味着从这里再往上合并就是“强行拉郎配”了。

应用与局限

家族谱画好了,它的价值不只是挂在墙上,而是能指导现实决策。层次聚类在工业界有三个非常典型的应用方向。第一是客户分群:电商公司不知道用户到底分几类,用层次聚类画出用户消费行为树,再结合运营需求决定分 5 类还是 8 类,为每类用户定制运营策略。第二是基因表达分析:生物学家对数千个基因的表达谱做层次聚类,树状图可以同时展示基因间的层级关系,帮助发现功能相似的基因模块。第三是文档主题组织:把新闻或知识库文档按词频向量聚成主题树,从根节点到叶子节点就是“主题”→“子主题”→“单篇文档”的层级目录。

然而,家族树再美,也有让人头疼的短板。最直接的是计算复杂度。聚合式层次聚类需要维护一个 $n \times n$ 的距离矩阵,合并一层的代价是找全矩阵最小值,所以总时间开销通常为:

另一个问题是对离群点敏感。一个离群点可能会被一路拖到很晚才被合并,形成一条细长的“尾巴”,干扰整棵树的形状。此外,层次聚类是贪心且不可逆的:一旦两个簇合并,后续就不能拆开重来,这也意味着早期的错误合并会被放大到后续所有层级。

正因为这些局限,层次聚类最适合中小规模、探索性的分析场景。当数据量巨大时,工程上常先用 K-Means 做粗略预聚类,再对每类内部做层次聚类,兼顾可扩展性与层级解释性。

T(n)=O(n2log⁡n),M(n)=O(n2)T(n) = O(n^2 \log n), \qquad M(n) = O(n^2)
  1. 样本数$n$ 是样本总量,每个样本初始是一个簇,参与合并的轮数为 $n-1$。
  2. 每轮扫描每一轮都要在距离矩阵中寻找最小值,朴素实现需要扫描整个矩阵。
  3. 对数因子$\log n$ 来自使用优先队列等数据结构加速最小距离查找的代价。
  4. 空间占用$M(n) = O(n^2)$ 表示距离矩阵本身就要存 $n^2$ 个距离值,当样本量达到十万级时,内存会捉襟见肘。

AI 应用场景

客户分群:让运营方案跟着人群走

阶段:探索性数据分析与特征工程后的无监督聚类

解决的问题:运营团队拿到几百万条用户行为数据,却说不清“到底有哪几类人”。传统做法是凭经验拍脑袋定几个分组,很容易分错。层次聚类先画出用户行为的树状图,让运营在树上看到自然形成的人群层级,再结合资源约束挑选切割高度,得到可解释的分群结果。

具体案例:某电商平台对用户按“月消费金额、购买频次、品类偏好”三个特征做标准化后,用平均连接的层次聚类画树状图。树状图显示 3 个自然大类,其中“高价值数码爱好者”还能细分出“新品尝鲜型”和“性价比敏感型”两个亚类,运营因此设计了不同的推送策略。

基因表达分析:从海量基因中看生物层级

阶段:生物信息学中的无监督聚类

解决的问题:基因数量动辄上万,且功能层级关系未知。层次聚类不需要预设基因模块数量,能同时揭示基因间的粗细层级,这是 K-Means 很难提供的视角。

具体案例:研究人员对 50 个样本、2000 个基因的表达谱做层次聚类,发现树状图先分出“免疫相关”与“代谢相关”两大分支,进一步在分支内找到更细的功能模块,最终结合通路数据库验证了这些模块的生物学意义。

文档主题层级:让知识库自己长出一棵目录树

阶段:文本向量化后的无监督聚类

解决的问题:企业内部知识库文档杂乱无章,人工维护目录成本极高。层次聚类可以将文档按向量相似度组织成从粗到细的主题树,作为自动目录。

具体案例:某法律咨询平台将 2 万篇问答按 TF-IDF 向量做层次聚类,树状图顶层分出“劳动纠纷”“婚姻家庭”“合同纠纷”等大类,每个大类下又自然分出更细的子主题,产品团队直接把这棵树导入了问答导航栏。

Python 演示

python22 行
import numpy as npfrom scipy.cluster.hierarchy import linkage, dendrogram, fclusterimport matplotlib.pyplot as plt  def main():    data = np.array([        [1.0, 0.8], [1.2, 1.1], [3.0, 2.8], [3.2, 3.5],        [6.0, 5.8], [6.5, 6.2], [0.5, 4.5], [4.0, 0.6]    ])    names = ['小明', '小红', '阿强', '阿丽', '老张', '老王', '小美', '大刘']    Z = linkage(data, method='average', metric='euclidean')    dendrogram(Z, labels=names)    plt.title('客户家族谱:平均连接下的层次聚类')    plt.ylabel('合并距离')    plt.show()    labels = fcluster(Z, t=2.0, criterion='distance')    print('切割高度 2.0 时的簇标签:', labels)  if __name__ == '__main__':    main()
目的:用八个模拟人物特征完成一次完整的聚合层次聚类,画出树状图,并在高度 2.0 处切出簇标签。
  1. data = np.array([...])构造八位“家族成员”的二维特征,每行是 (消费金额,活跃度) 的标准化取值。
  2. linkage(data, method='average', metric='euclidean')以欧氏距离计算点间距离、以平均连接策略合并簇,返回合并记录矩阵 Z。
  3. dendrogram(Z, labels=names)把合并记录画成树状图,就像把家谱画到纸上供人阅读。
  4. fcluster(Z, t=2.0, criterion='distance')在树状高度 2.0 处水平切一刀,返回每个样本所属簇的编号。

常见误区

误区不是说“不需要预设簇数”吗?那应该什么参数都不用调,直接把数据丢进去就能出结果。

正解不需要预设簇数 ≠ 没有参数。你仍然要选择距离度量(欧氏、曼哈顿等)、合并策略(单连接、全连接、平均连接、Ward),以及最后切割树状图的高度。这就像办家宴,不用规定桌数,但还得选场地、定菜系、挑名单。

为何常见:“无需预设簇数”是相对 K-Means 必须给定 k 而言的亮点,初学者容易把“不设 k”误当成“零参数”。

误区树状图纵轴上的数值一定是欧氏距离的实际大小,比如高度 5 就是两个簇相距 5 个单位。

正解纵轴高度确实表示合并时的距离,但这个“距离”已经被合并策略重新定义了。单连接取最小值、全连接取最大值、Ward 法用的是方差增量,它们都能画出树状图,但纵轴含义各不相同。看树状图时应关注“相对高低”,而不是绝对数值。

为何常见:大多数人习惯把纵轴当坐标轴读,忽略了距离度量在计算前已经被策略变换过。

误区都是算两簇距离,选哪个策略差别不大,随便用一个就行。

正解差别非常大。单连接只看最近的一对点,容易拉出细长的链式簇;全连接要求所有点都近,生成的是紧凑的球状簇。同一份数据,用单连接可能画出倾斜的长条,用全连接则画出规则的圆团,这会在切割高度和簇数选择上带来完全不同的结论。

为何常见:初学时只关注算法名字,忽略了“簇间距离的定义”才是决定树形状的核心变量。

误区反正都是算距离,原始特征直接丢进去就行,标准化会“弄丢信息”。

正解不标准化会让数值范围大的特征主导距离计算。比如“年收入”范围是 0-100 万,“年龄”只有 0-100,“距离”几乎只看收入差异,性格合不合根本排不上号。标准化能让每个特征在距离计算里公平发声。

为何常见:初学无监督学习时没有“特征尺度”的概念,以为聚类只是几何操作,忽略了输入质量决定输出质量。

误区层次聚类贪心且不可逆,所以它不如那些能反复调整的算法“高级”。

正解不可逆确实是局限,但贪心的“只合并最近的一对”恰恰保证了每步局部最优,让树状图有意义。实际项目如果担心错误被放大,可以先用 K-Means 预聚类减少样本量,再对每个类做层次聚类。理解算法的代价,才能设计出正确的使用姿势。

为何常见:把算法缺点当成“不能用”的理由,其实每种算法都有代价,关键是在合适场景下尽量规避。

面试题

Q1. 聚合式层次聚类的初始状态是什么?

单选题 · easy

  • A.所有样本合并成一个大簇
  • B.每个样本各自独立成一个簇← 正确答案
  • C.随机挑 k 个样本作为中心
  • D.所有样本放在一个集合中

答案:B。聚合式自底向上合并,起点是每个样本各自成簇,然后不断合并最近的两簇。B 正好对应“先列名单再联姻”的起点;A 是分裂式的起点;C 是 K-Means 的做法;D 表述虽然接近样本集合,但没有“独立成簇”的含义。

Q2. 欧氏距离的计算假设是特征数据属于哪种类型?

单选题 · easy

  • A.连续数值特征← 正确答案
  • B.离散类别特征
  • C.文本字符串特征
  • D.有序分类特征

答案:A。欧氏距离在连续数值空间上计算多维坐标间的直线距离,只有连续数值特征才谈得上“坐标差距”。类别特征需要先做编码或改用其他距离,文本更适合余弦相似度。

Q3. 单连接聚类最典型的问题是什么?

单选题 · mid

  • A.生成的簇过于紧凑
  • B.容易产生链式效应← 正确答案
  • C.对类别特征无法处理
  • D.总是得到球状簇

答案:B。单连接只看两个簇最近的一对点,任何两个簇只要有一对点很近就会被合并,从而像锁链一样把互不相关的样本串在一起。链式效应是它的经典缺陷;全连接才倾向于紧凑球状簇。

Q4. 在树状图中,切割高度越低,通常得到的簇数会怎样?

单选题 · mid

  • A.越少
  • B.越多← 正确答案
  • C.不变
  • D.最多只能得到 2 个

答案:B。水平线越低,离叶子越近,穿过它的竖线就越多,被切开的子树也越多。就像在族谱中从更近的世代划分,分支自然更多;把线提到顶部就只剩整棵树的根。

Q5. 层次聚类相比 K-Means 的优势有哪些?

多选题 · mid

  • A.无需预设簇数就能看层级← 正确答案
  • B.能画出树状图展示过程← 正确答案
  • C.时间复杂度比 K-Means 更低
  • D.任意高度切割都可得到对应簇← 正确答案

答案:ABD。层次聚类的核心优势是输出一棵树,不必预设 k,可任意切割,并可用树状图可视化合并过程。它并不比 K-Means 快,时间复杂度反而更高,因此 C 错误。

Q6. Ward 法合并两个簇时,会选择哪一个?

单选题 · hard

  • A.使合并后总方差增加最小的两个簇← 正确答案
  • B.使合并后总方差增加最大的两个簇
  • C.使两个簇质心距离最小的两个簇
  • D.使两簇边界点距离最小的两个簇

答案:A。Ward 法把合并代价定义为簇内方差(离差平方和)的增量,算法总是选择让这个增量最小的两簇合并,类似于让新大家庭的内部生活方式最一致。C 是质心法的思路,D 是单连接的思路,B 方向完全相反。

Q7. 下列哪种合并策略对离群点最不敏感?

单选题 · easy

  • A.单连接
  • B.全连接
  • C.平均连接(相对折中)← 正确答案
  • D.链式连接

答案:C。平均连接取所有跨簇点对的距离均值,单个离群点的影响会被稀释;全连接取最大值,一个离群点可能拉大整个簇间距离;单连接取最小值,离群点易被当成“近亲”。链式连接并非标准策略,故排除。

Q8. 层次聚类的常见局限性有哪些?

多选题 · hard

  • A.需要预先给定聚类数 k
  • B.时间与空间复杂度随样本数显著上升← 正确答案
  • C.合并过程贪心且不可逆← 正确答案
  • D.对离群点比较敏感← 正确答案

答案:BCD。层次聚类不需要预设 k,这恰是它的优点,因此 A 错误。它需要维护 O(n²) 距离矩阵,时间开销大,贪心合并不可回退,离群点还会干扰树的形状,三者都是公认局限。

Q9. 在平均连接策略下,合并簇间的距离如何计算?

单选题 · mid

  • A.取两个簇质心之间的距离
  • B.取两个簇最近一对点的距离
  • C.取两簇所有跨簇点对距离的平均值← 正确答案
  • D.取两个簇最远一对点的距离

答案:C。平均连接遍历两个簇间所有点对,计算它们的平均距离,作为簇间相似度的折中指标。A 是质心连接,B 是单连接,D 是全连接。

Q10. 实际项目中,选择层次聚类的切割高度时可以考虑哪些依据?

多选题 · hard

  • A.树状图中合并距离的明显跳变← 正确答案
  • B.业务上需要多少个可解释的族群← 正确答案
  • C.轮廓系数是否在可接受范围← 正确答案
  • D.让所有簇的样本数量完全相等

答案:ABC。距离跳变、业务需求和轮廓系数都是常用的簇数选择依据。让样本数完全相等不是合理的切分目标,业务更需要簇的可解释性与差异性,因此 D 错误。