三年前,我接手了一个零售项目的用户分群任务。当时我用了层次聚类,看着树状图那个漂亮的二叉树结构,凭直觉在高度0.4的位置横切一刀,得到了5个群组。结果业务方反馈说,其中两个群组的行为特征几乎完全重叠,另一个群组里混杂了高活跃用户和僵尸用户。我花了三周时间复盘才找到原因,不是算法错了,而是我对树状图的解读方式错了。从那以后,我意识到树状图不是一张可以随意下刀子的装饰图,它是一张需要系统方法论才能读懂的决策地图。
这篇文章就是基于那次踩坑以及后来数十次实战经验,梳理出来的层次聚类与树状图完整使用框架。
在展开细节之前,我先给出本文最核心的三个结论,它们是我在多次项目中反复验证后形成的判断。
很多教程把重心放在距离度量(欧氏距离、曼哈顿距离等)上,但我在实际项目中发现,链接方法(Linkage Method)对树状图结构的影响远大于距离度量。Ward方法倾向于生成紧凑的球形簇,Single Linkage容易产生链式效应,Complete Linkage则介于两者之间。选错链接方法,树状图看起来再漂亮,聚类结果也可能在业务上毫无意义。
标准教程教你用一条水平线切割树状图得到聚类数,但真实业务场景中,不同分支的聚合密度差异可能很大。我在一个SKU归类项目中就发现,某些分支在高度0.2时已经完全聚合,另一些分支直到高度0.6才合并。一刀切的横切必然导致某些群体被过度拆分或过度合并。更合理的做法是:先用横切确定大致粒度,再在不同分支上做差异化纵切。
这是我犯过的最大错误。树状图只展示了样本间的聚合关系,但它不展示原始数据的密度、离散度和异常值。一个看起来层次分明的树状图,底层数据可能严重偏斜或存在大量离群点。我在每个项目中,都会把树状图的结果映射到降维后的散点图上做交叉验证,二者一致时才能确认聚类方案有效。
以上三个结论贯穿了整篇文章,接下来的内容会逐一展开,并配合具体案例和数据说明。
层次聚类是一种通过构建层次结构来发现数据内在分组关系的无监督学习方法。它的输出是一棵树状图,展示从每个样本各自成簇到最终合并为一个簇的完整过程。与K-means这类划分式聚类不同,层次聚类不需要预先指定聚类数,而且能提供从细粒度到粗粒度的完整分组视图。
在实际业务中,层次聚类最适用的场景有三个:一是探索性数据分析阶段,你不知道数据天然分成几类,想先看看结构;二是业务要求可解释性强,需要展示“谁和谁更相似”的层次关系;三是样本量不大(通常几千以内),但对聚类质量要求较高。
2022年,我为一个零售连锁品牌做SKU优化项目。他们拥有超过3000个SKU,但品类管理混乱,不同门店的上架策略几乎靠店长个人经验。业务方希望用数据驱动的方式,把SKU按照销售模式、库存周转和利润贡献进行归类,然后针对不同类别制定差异化的补货和促销策略。
我选择了层次聚类,因为业务方明确要求“能解释为什么某个SKU被分到了某个类别”。树状图的可视化能力正好满足这个需求。但真正推进时,我遇到了三个典型问题:第一,3000个SKU的树状图密密麻麻,根本无法直接观察;第二,不同链接方法产生的树状图结构差异巨大;第三,业务方希望得到5-7个类别,但树状图在对应高度上的聚类结果并不稳定。这些问题最终促使我建立了一套系统化的树状图使用流程,也是本文的核心内容基础。
树状图在一个项目中的价值,我总结为三个层面:
沟通价值:树状图是非技术 stakeholders 最容易理解的可视化形式之一。它直观展示了“哪些东西更相似”以及“相似程度有多高”,这比解释聚类中心、轮廓系数等概念要省力得多。
诊断价值:通过观察树状图的分支结构,可以快速判断数据的聚类倾向。如果树状图呈现均匀的二叉树结构,说明数据可能没有天然的分组;如果存在明显的高分支和低分支,说明聚类结构存在。
决策价值:树状图提供了从细到粗的完整聚类路径,业务方可以根据实际需求选择不同粒度的分组方案,而不是被算法固定在一个K值上。

以下五个误区是我在实战中反复遇到的,每次都会导致聚类结果偏离业务预期。
树状图展示的是样本间的聚合关系,但它不展示原始数据的密度、偏态和异常值。我见过一个案例:同事用层次聚类对客户做分群,树状图显示两个主要分支非常清晰,于是直接用了2类方案。结果在业务验证时发现,其中一个分支包含大量低价值客户,但其中混入了几个超高价值客户,导致整体策略偏差。如果当时把树状图结果映射到T-SNE散点图上,就能发现那几个超高价值客户其实是孤立点,应该单独处理。
判断逻辑:树状图的清晰结构不一定代表数据有明确的聚类结构。必须结合降维可视化或密度估计来验证聚类是否真实存在。
在我的经验中,这是最容易被忽视的环节。很多人默认使用Ward方法,因为它在很多默认设置里是首选。但Ward方法基于方差最小化,它假设簇是球形的,如果数据分布不是球形,结果会很差。
举一个实际对比:在一个电商用户分群项目中,我分别用Ward和Complete Linkage做层次聚类,得到两个完全不同的树状图。Ward方法产生了三个大小均匀的簇,而Complete Linkage产生了一个大簇和两个小簇。业务验证后发现,Complete Linkage的结果更符合实际,用户行为本身就存在一个“主流群体”和两个“小众群体”。Ward方法强行把主流群体拆成了两块,导致策略无法差异化。
判断逻辑:链接方法的选择需要根据数据形状和业务目标来决定。如果数据分布未知,我通常建议至少跑三种方法(Ward、Complete、Average)并对比结果。
标准教程里最常见的做法是:看树状图,找一条水平线,在线的位置砍一刀,得到聚类数。这个做法的问题在于,它假设所有分支的聚合密度是一致的。但真实数据中,不同分支的聚合速度差异很大。
我在一个文本聚类项目中就遇到过这种情况:树状图显示在高度0.3处砍一刀得到8个簇,但其中两个簇内部非常松散,而另外两个簇又非常紧密。后来我改用“差异化纵切”,在紧密分支上砍得更深,在松散分支上保留更大的类,最终得到了12个簇,但业务一致性提升了40%。
判断逻辑:一刀切是起点,不是终点。需要根据业务需求对树状图的不同分支做差异化剪枝。
这个误区在理论上很多人都知道,但在实际操作中经常被忽略。层次聚类对特征的尺度非常敏感,因为距离计算受数值范围大的特征主导。
我做过一个测试:在一组包含“年龄”和“年收入”的数据上做层次聚类,未标准化时,年收入特征的权重几乎完全主导了距离计算,树状图的分支结构实际上只反映了收入差异。标准化之后,两个特征才发挥出均衡作用,树状图结构也发生了显著变化。
判断逻辑:标准化不是可选项,而是必选项。除非所有特征的单位和量级已经一致,否则必须做标准化。Z-score标准化和Min-Max标准化在大多数场景下效果类似,但Z-score对异常值更鲁棒。
层次聚类和树状图在处理数值型数据时表现良好,但在处理混合型数据(数值+类别)或高维稀疏数据时,效果会急剧下降。我在一个用户画像项目中,尝试用层次聚类处理包含50个数值特征和30个类别特征的数据,结果树状图几乎无法解读,分支结构非常混乱,且不同的距离度量方案结果差异极大。
判断逻辑:对于混合型数据,建议先做特征工程,把类别特征编码为数值特征,然后使用Gower距离或相似度矩阵。对于高维稀疏数据,层次聚类通常不是最佳选择,可以考虑先降维再聚类,或者直接使用密度聚类方法。

这一节我会给出在实际项目中做层次聚类时的系统化决策框架,包含五个关键决策点。
距离度量决定了“相似”的定义。在业务场景中,我建议按照以下逻辑选择:
欧氏距离:适用于连续数值特征,且特征之间相互独立的情况。这是最常用的距离度量,在大多数标准化后的数据上表现稳健。
曼哈顿距离:适用于特征具有不同重要性的场景,或者数据中存在较多异常值的情况。曼哈顿距离对异常值的敏感度低于欧氏距离。
余弦相似度:适用于文本数据或用户行为数据,关注的是方向而非绝对值。在用户分群项目中,如果关注的是用户的行为模式而非行为强度,余弦相似度通常比欧氏距离更合适。
Gower距离:适用于混合型数据,它同时处理数值特征和类别特征。但计算复杂度较高,样本量大时建议谨慎使用。
我的个人经验是:在不确定的情况下,优先选择欧氏距离+Z-score标准化,这个组合在大多数业务场景中表现最稳定。如果数据维度较高或特征稀疏,再考虑余弦相似度。
链接方法的选择对树状图结构的影响,怎么强调都不过分。我基于实际项目经验,给出以下判断框架:
Ward方法:适用于簇的形状近似球形、且簇的大小相对均匀的场景。在用户分群、市场细分等业务中,如果预期群体规模差异不大,Ward方法是不错的选择。但要注意:Ward方法对异常值非常敏感,数据清洗不彻底时效果会严重下降。
Complete Linkage:适用于簇的形状不规则、或者簇的大小差异较大的场景。它基于“最远距离”合并,倾向于生成紧凑的簇,但容易产生大小不均衡的聚类结果。在SKU归类项目中,我倾向于使用Complete Linkage,因为不同品类的SKU数量天然差异很大。
Average Linkage:介于Ward和Complete之间,是一种折中方案。当你不确定数据分布时,Average Linkage通常是风险最低的选择。但它的聚类边界不如Ward和Complete清晰。
Single Linkage:容易产生链式效应,即一个簇像链条一样不断延伸,导致聚类结果非常碎片化。我在实际项目中几乎不使用Single Linkage,除非业务上明确需要发现“连续延伸”的群体,比如某些具有连续渐变特征的地理数据。
判断逻辑:我建议在项目初期,至少跑Ward、Complete、Average三种方法,对比树状图结构和业务含义。如果三种方法的结果高度一致,那说明聚类结构非常稳健;如果差异很大,说明数据本身没有清晰的聚类结构,需要进一步分析。
聚类数的确定是层次聚类中最具挑战性的环节。我建议使用以下组合策略:
树状图观察法:观察树状图中不同分支的高度变化,找到“较长垂直分支”的位置。这些位置表示合并距离突然增大,通常是合理的聚类数候选。
轮廓系数法:对于候选的聚类数(比如2到10),分别计算轮廓系数,选择轮廓系数最高或出现拐点的K值。轮廓系数结合了簇内紧密度和簇间分离度,是一个相对客观的指标。
业务验证法:最终,聚类结果必须通过业务验证。如果业务方无法对聚类结果做出有意义的解释,或者聚类结果无法指导行动,那这个K值就是无效的。
我通常的做法是:先用树状图观察法缩小候选范围(比如2-5个),然后用轮廓系数法做定量筛选,最后用业务逻辑做最终裁定。三个步骤结合,比单一方法可靠得多。
聚类结果验证是确保业务价值的关键环节。我采用三层验证框架:
第一层:统计验证。计算轮廓系数、Davies-Bouldin指数、Calinski-Harabasz指数等聚类评估指标,确保聚类结果在统计上合理。
第二层:可视化验证。把树状图结果映射到降维空间(如T-SNE、PCA)中,观察聚类在原始空间中的分布情况。如果树状图的分支与降维空间中的聚集区域一致,说明聚类结果可靠。
第三层:业务验证。与业务方一起,对每个聚类群体的特征进行解读,看是否具有业务意义。如果某个群体无法被描述或命名,那这个聚类很可能没有实际价值。
层次聚类对异常值非常敏感,这一点在树状图上表现得尤为明显。一个异常值可能会作为一个单独分支,一直保持到很高的聚合层级,从而影响整个树状图的结构。
我的建议是:在聚类之前,先使用IQR或Z-score方法识别并处理异常值。如果异常值本身是业务关注的对象(比如超高价值客户),可以单独提取出来作为特殊群体,而不是让它们扭曲聚类结构。


这一节我会分享两个完整案例,并附上关键数据观察,让读者看到树状图在真实场景中的使用过程。
背景:某电商平台希望基于用户行为数据对用户进行分群,以便制定差异化的运营策略。数据包含5000个用户样本,每个用户有6个行为特征:月均订单数、客单价、浏览深度、停留时长、促销敏感度、投诉次数。
过程:我首先对数据做了Z-score标准化,然后使用Ward方法+欧氏距离做层次聚类。树状图显示,在高度2.5附近存在一个明显的长分支,对应3个聚类。但为了验证,我同时计算了2到8类的轮廓系数,结果显示3类方案的轮廓系数最高(0.61)。
结果:三个聚类群体的特征如下:
数据观察:这个案例中,Ward方法和Complete Linkage产生了不同的结果。Complete Linkage将群体A拆成了两个小群体,导致业务方无法对其中一个群体做出合理解释。最终我们选择了Ward方法的3类方案,因为它在业务上最具可解释性。
背景:某零售连锁品牌希望将3000个SKU按照销售模式归类,以便优化库存管理。数据包含每个SKU的月均销量、毛利、周转天数、季节性指数、补货提前期等特征。
过程:这个案例中,我遇到了典型的“一刀切”问题。树状图显示在高度0.35处切割得到6个簇,但其中两个簇的SKU数量差异巨大,一个簇包含1200个SKU,另一个簇只有80个SKU。业务方认为这种分布不均衡难以执行差异化策略。
解决方案:我采用了差异化纵切策略。首先,在树状图的主分支上,我在高度0.35处做第一次切割,得到6个主簇。然后,对其中最大的主簇(1200个SKU),我在其内部树状图的高度0.2处做第二次切割,将其拆分为5个子簇。最终得到了10个类别,类别规模在150-400个SKU之间,业务方认为这个粒度更便于管理。
数据观察:这个案例说明,树状图的使用不能僵化。同一棵树上的不同分支,可能需要根据业务需求做差异化的剪枝策略。这也是树状图相对于K-means的一个核心优势,它提供了灵活的层次结构,可以根据业务需求调整粒度。
我在多个项目中观察到,标准化和链接方法之间存在显著的交互效应。具体来说:
当数据经过Z-score标准化后,Ward方法和Complete Linkage的结果差异会缩小,因为标准化降低了极端值对距离计算的影响。此时,三种主要链接方法(Ward、Complete、Average)的结果一致性会提高。
当数据未标准化时,不同链接方法的结果差异会显著增大,而且Ward方法往往受到的影响最大,因为它对特征的尺度最敏感。
实际操作建议:在项目初期,如果时间有限,可以先做标准化,然后用Ward方法跑一次。如果树状图结构清晰,且业务验证通过,那就不需要再跑其他方法。如果树状图结构不清晰,或者业务验证不通过,再尝试其他链接方法。


基于不同场景,我给出了以下具体的行动建议。
这是层次聚类最能发挥优势的场景。建议的操作流程:
我的经验:在小样本场景下,层次聚类的结果通常非常稳定,而且树状图的可读性高。这是最容易做好的场景。
当样本量变大时,树状图的可读性会下降,但层次聚类仍然可以作为预聚类工具来使用。建议:
我的经验:大样本下,层次聚类的计算时间会显著增加,而且树状图会变得非常拥挤。采样+推广的策略可以在保持聚类质量的同时,大幅降低计算成本。
有些业务场景中,非技术 stakeholders 需要理解“为什么某个样本被分到了这个类别”。此时,树状图的沟通价值是最大的。建议:
我的经验:在可解释性要求高的场景中,树状图的价值远超K-means。但也要注意,树状图本身只是一张图,真正让业务方信服的是每个群体背后的业务含义和行动建议。
如果聚类流程需要自动化运行(比如定期更新用户分群),层次聚类不是最佳选择,因为它需要人工解读树状图。建议:
我的经验:自动化场景下,K-means的效率和可扩展性远优于层次聚类。但K-means需要预设K值,这个K值可以通过层次聚类来确定。所以,层次聚类和K-means不是替代关系,而是互补关系。
在做层次聚类时,每个决策点都涉及取舍。我把最关键的四个取舍场景整理如下。
取舍点:Ward方法通常产生更紧凑的簇,但计算复杂度为O(n²log n),在大样本下效率较低。Average Linkage的计算效率更高,但聚类紧凑度可能不如Ward。
我的判断:当样本量小于3000时,优先考虑准确率,使用Ward方法。当样本量在3000-10000时,考虑效率,使用Average Linkage。当样本量超过10000时,建议先采样再做层次聚类,或者直接使用其他聚类方法。
取舍点:更多的聚类数意味着更细的粒度,但每个群体的可解释性会下降。业务方通常无法对超过7个类别做出有意义的解释。
我的判断:在大多数业务场景中,3-6个类别是最优区间。如果业务需要更细的粒度,可以采用“层级策略”,先用少量类别做宏观策略,然后在每个类别内部进一步细分做微观策略。
取舍点:Complete Linkage对异常值不敏感,聚类结果更稳定,但可能无法发现数据中的细微结构。Ward方法对异常值敏感,结果可能不稳定,但能发现更精细的聚类结构。
我的判断:如果数据质量较高(异常值少、缺失值少),优先使用Ward方法,它的敏感性会转化为对真实结构的捕捉能力。如果数据质量不高,或者数据来源不稳定,优先使用Complete Linkage或Average Linkage,它们的稳定性更重要。
取舍点:层次聚类需要人工解读树状图,手动确定聚类数,这既是优势(可解释性强)也是劣势(无法完全自动化)。K-means和DBSCAN可以自动化,但需要预设参数或调整参数。
我的判断:在探索性分析阶段,手动是必要的,因为你需要理解数据。在生产和自动化阶段,应该把层次聚类作为“探路者”,把确定下来的方案转移到自动化模型上。

回到文章开头那个让我踩坑的树状图。现在我知道了,层次聚类不是一门可以凭直觉操作的技艺,它需要系统的方法论、严谨的验证流程和对业务需求的深刻理解。树状图不是一张用来“砍一刀”的静态图片,而是一张需要根据业务语境动态解读的决策地图。
我的核心观点可以浓缩为三句话:
第一,链接方法比距离度量更重要,选错链接方法,树状图再漂亮也是错的。
第二,树状图需要分层解读,先横切确定宏观轮廓,再纵切精细化调整。
第三,树状图必须与原始数据分布交叉验证,只看图说话是最大的风险。
如果你现在准备做一个层次聚类项目,我建议你按照以下顺序行动:
层次聚类不是万能的,但它在探索性分析和可解释性方面的优势,是其他聚类方法无法替代的。掌握好树状图的解读方法,你就能在数据分析项目中多一个有力的工具,少一个踩坑的环节。
我刚开始用层次聚类,每次生成树状图后,看着那些分支线不知道如何解读。有的树状图分支高度差异很大,有的却很平均,这反映了什么?我怎么从树状图中判断聚类的好坏?
树状图的核心是纵轴表示合并时的距离或相异度。分支高度差大,说明数据中存在明显的层级结构,长分支指示了可靠的聚类边界;高度均匀则表明数据可能没有天然聚类,或者你使用的链接方法(如单链)产生了链状效应。我在一次客户分群项目中,对比了Ward法和单链法:Ward树状图高度跳跃明显,分出3个清晰群组;
单链图则呈阶梯状,难以确定切点。所以解读时必须先确认链接方法,Ward和完整链接倾向于产生紧凑簇,树状图更有解释性;单链和平均链接则容易产生拖尾。建议:不要只看图,要结合业务标注。比如在电商用户分层中,长分支对应的簇通常对应不同消费层级。
如果树状图没有明显长分支,说明聚类稳定性差,此时应改用其他算法或降低对聚类数的预期。
我在做文本聚类,数据是TF-IDF向量,维度很高且稀疏。用层次聚类时,不知道应该用欧氏距离还是余弦相似度?我看到有人用欧氏距离,但结果不好。到底该怎么选?
对于高维稀疏文本向量,我强烈推荐余弦相似度(或转化为余弦距离)。原因在于:欧氏距离会同时受向量长度和方向影响,而文本向量的长度差异往往来自文档长度,不是语义差异。余弦相似度只关注方向,能更好捕捉内容相似性。
我曾在新闻分类项目中踩过坑:用欧氏距离+平均链接,结果大部分文档被归为几个超大簇,因为短文本向量长度小,距离上更接近。改用余弦相似度后,聚类才真正反映主题。注意:如果你对向量做了L2归一化,欧氏距离与余弦距离等价,此时用欧氏距离也可以。
另一个关键点是链接方法:高维稀疏数据下,Ward方法容易失效(因为Ward依赖欧氏空间),此时建议用平均链接或完整链接。我在项目中用余弦距离+平均链接得到了业务可解释的簇。
我看教程说根据树状图选择聚类数,在最高横线处切一刀。但我切完后得到的簇在业务上很难解释,有的簇太小,有的太大。是不是我切的位置不对?有没有更好的方法?
“切一刀”方法(即设定一个全局距离阈值)只适用于树状图有明显长分支的情况。如果数据层级模糊,一刀切必然导致簇大小不均或意义不明。我在市场调研中曾盲目切图,得到的一个簇包含了高消费和低消费用户,完全无法解释。正确做法:先观察树状图,确定哪些分支高度明显高于相邻分支,这些分支对应的子树才是候选簇。
然后结合轮廓系数、Calinski-Harabasz指数等内部指标验证。更实用的方法是采用动态树切(dynamicTreeCut),它能根据分支形状自适应切分,避免一刀切。独特视角:树状图的价值不在于直接给出聚类数,而在于展示数据的嵌套结构。有时我们需要的不是全局切分,而是从某个层级提取子簇。
比如在基因表达数据中,生物学家更关心特定分支下的子簇,而不是全局k。
我有10万条用户行为数据,想用层次聚类看群体结构,但算法跑了一晚上没出结果。是不是不能用层次聚类?有没有办法在保持树状图优势的同时加速?
层次聚类的时间复杂度为O(n²)到O(n³),10万样本确实不现实。但你可以用“两步法”保留树状图:先用K-means快速粗聚类(如k=100),然后对每个簇的质心做层次聚类,得到质心的树状图。最后将每个样本分配到对应质心的簇,从而间接获得全量数据的层级结构。
我在电商用户分层中实践过这个方法:从10万用户中抽样1万做层次聚类,发现树状图稳定后,用质心训练随机森林分类器,预测全量用户归属。这样既得到了树状图,又处理了全量数据。其他优化技巧:使用快速聚类算法如BIRCH(它内部用CF树,本质是层次聚类的近似),或者用OPTICS(可生成可达图,类似树状图)。
如果坚持用传统层次聚类,可以随机抽样(如5000),然后基于质心分配其余点。注意:抽样后要验证稳定性,重复多次看树状图结构是否一致。


读者评论
作为零售行业的数据分析师,这篇文章几乎就是我的血泪史。以前做用户分群,我也习惯在树状图上凭感觉横切一刀,结果业务方反馈两个群组行为重叠,那叫一个尴尬。后来才发现,链接方法的选择比距离度量更关键,Ward方法虽然默认常用,但数据分布不规则时完全跑偏。现在我做项目都会跑三种链接方法交叉验证,再结合降维散点图看真实分布,再也不贪图树状图漂亮了。
我是业务部门负责SKU运营的,平时最怕数据团队给一个看不懂的聚类结果。这篇文章让我终于理解了树状图的沟通价值,它确实能直观展示哪些SKU更相似,比一堆聚类中心参数好懂。但我也注意到,文章提到不同分支聚合密度差异大,需要差异化纵切,这点很实用。希望能跟数据团队合作时,把这种思想落地到我们的品类管理策略里。
刚学层次聚类时,教程里总说看树状图砍一刀就行,但自己实操发现结果总是不稳定。这篇文章点出了我踩过的坑:忽略标准化导致树状图被数值大的特征主导,还有过度依赖一刀切。特别是那个‘纵切’的思路,让我豁然开朗,原来不同分支可以按需调整粒度。另外,作者建议用Gower距离处理混合型数据,我准备在小样本上试试,希望别再被高维稀疏数据搞崩了。