层次聚类与K-Means:聚类分析算法的全面对比

层次聚类K-Means:聚类分析算法的全面对比

上周三凌晨两点,我盯着屏幕上的轮廓系数,0.18。这是我第三次用K-Means跑用户分群,K值从5试到15,标准化做了两遍,结果依然像随机分堆。业务方第二天要方案,我说“再给我一小时”,然后切到层次聚类,同样的数据,树状图一出来,我立刻意识到问题在哪:我的数据根本不是凸球形分布,而是层层嵌套的消费层级结构

这不是一个调参问题。这是一个选算法的问题。

而大多数人在这个问题上,都在用错误的前提反复试错。

今天这篇文章,我想把过去五年里我在用户分群、异常检测、市场细分项目中使用这两种算法的真实经验,系统地拆解给你。不是百科式的“K-Means快、层次聚类慢”,而是让你真正理解:什么时候该用哪个,为什么,以及当你选错时会发生什么

一、核心结论前置:它们不是“好与坏”,而是“适用与不适用”

在展开所有细节之前,我先把结论放出来。这与我刚入行时对这两个算法的朴素理解完全不同,也是我经历过几次真实项目翻了车之后才深刻意识到的东西。

K-Means和层次聚类本质上是一对“距离派”的双生子。它们都基于样本间的几何距离做聚类,都假设“距离越近越相似”。这个共同的底层逻辑决定了它们有相同的“软肋”:都倾向于发现凸形、近似球形的簇。当你的数据里藏着一个环形结构、一条弯曲的流形、或者密度极度不均衡的团块时,这两个算法都可能无能为力。

但它们的分歧,在于三个根本的维度:

第一个维度:对“簇”的定义方式不同。 K-Means通过“质心”定义簇,每个簇有一个中心,样本归到离自己最近的中心。层次聚类通过“连接规则”定义簇,单连接、全连接、Ward法等不同策略,决定了簇是链状、团状还是介于两者之间。这意味着,K-Means的结果受初始质心影响很大(跑三次可能出三种结果),而层次聚类在同一连接方式下结果唯一

第二个维度:结果结构不同。 K-Means输出的是扁平划分,所有样本被分到K个互不相交的集合中。层次聚类输出的是树状层级结构,你可以看到数据从个体逐级合并到总体的完整过程,可以在不同高度“剪枝”,得到不同颗粒度的分群。这是层次聚类最被低估的价值。

第三个维度:计算扩展性不同。 这是我多次在项目里临时切换算法的真实原因。K-Means的时间复杂度是O(n × k × d × i),线性扩展,百万级数据随便跑。层次聚类,至少经典实现,时间复杂度是O(n³)或优化后的O(n² log n),数据量超过一万条,就开始喘粗气;超过五万条,你可能会等到怀疑人生

这三个维度的差异,在实际业务中远比“理论优缺点对比”重要得多。而大多数教程,恰恰在这个实操层面一带而过。

层次聚类与K-Means:聚类分析算法的全面对比

二、回到场景:为什么你会在K-Means和层次聚类之间纠结

如果你刚接触聚类分析,大概率是从K-Means入手的。因为它太经典了:原理直观、代码一行就能跑、网上百分之八十的聚类教程都在讲它。

我当年也是这样。第一份实习,电商用户分群项目,mentor说“你用K-Means跑一下”,我照做了。后面陆陆续续做了市场细分、文本聚类、传感器数据异常检测,K-Means几乎是我下意识的首选。

直到我在一个客户项目中连续翻车三次。

那是一个金融产品的用户行为分群,数据包含用户的交易频次、金额、活跃天数、产品持有数等十几个指标。业务方希望看到“用户群体的层次结构”,哪些群体可以进一步拆分出子群,哪些群体之间存在渐进式的过渡。

我拿K-Means跑了,调整K值做肘部检验,选了看起来最优的K,把结果交了过去。业务方问了一句话:“你能不能告诉我,K=5和K=7的结果之间有什么继承关系?”

我说不出来。因为K-Means的K=5和K=7是完全独立的两套划分,彼此之间没有层级包含关系。它们是对同一份数据从不同角度“横切”了两刀,而不是从粗到细的逐级细分。

那是我第一次意识到,不是所有业务问题都只需要一个扁平的“分成几堆”的答案。有时候,业务需要的恰恰是“这种分群在颗粒度由粗到细的变化过程中,哪些群体稳定存在,哪些在特定颗粒度下才分化出来”的层级洞察。

而层次聚类的树状图,天然就能给出这个答案。

层次聚类与K-Means:聚类分析算法的全面对比

三、拆解常见误区:你以为的“使用经验”,可能是“重复性错误”

在正式对比两个算法之前,我必须先把这些年我见到的、犯过的、在同事代码review里抓到的误区摆出来。因为这些东西如果不厘清,接下来讲再多技术细节,你回去一上手照样踩坑。

误区一:“K-Means很快,所以数据量大就无脑选它”

这句话只说对了一半。K-Means确实快,但你得先回答一个问题:你的数据长什么样?

我做过一个传感器异常检测项目,数据是两个温度传感器的监控曲线,一方故障时数据呈现出一个明显的环形包络。我当时想都没想就上了K-Means,K=2,以为一个簇是正常、一个簇是异常。结果K-Means生硬地把环形从中间劈成两半,因为它只能找到两个“球形”质心区域。轮廓系数倒是挺高,实际分类毫无意义。

这个翻车经验的本质是:速度快不能补偿“几何假设错误”。K-Means假设你的簇在高维空间里近似超球体,如果你的数据是任意形状的,K-Means的“快”只是让你更快地得到一个错误答案。

层次聚类呢?很多人以为它会好一些,因为它有不同连接方式。但实际上,使用欧氏距离的层次聚类(不论单连接、全连接还是Ward法),面对典型的非凸数据(环形、月牙形、流形),同样会失败。单连接可能勉强拉出一条链,但结果极不稳定,对噪声极其敏感。

所以,“数据量大就选K-Means”的前提是:你已经通过降维可视化确认数据近似凸形分布。如果没做过这个检查,这条经验就是危险的。

误区二:“层次聚类不需要预设K,所以更好”

这也是一个美丽的误会。层次聚类确实不需要在开始时指定K,但你最终还是要决定在哪里“剪枝”,从树状图的哪个高度切下去,得到多少个簇。

本质上,你只是把“选K”这个决策从算法执行前推迟到了算法执行后。决策本身并没有消失,甚至可能更难做,因为你要根据树状图的高度变化判断“合理的簇数”。

我在一个零售客户项目里,用Ward法跑了层次聚类,树状图出来后,我发现同是“3个簇”的剪枝结果,在单连接和Ward法下表现截然不同,因为不同的链接方式本身就隐含了对簇形状的假设

所以,“不需要预设K”不是层次聚类的净优势,它只是把问题转移了

误区三:“标准化做过就行,两个算法一样对待”

标准化对K-Means的影响已经被讲烂了,量纲不同会导致聚类被大数值维主导。但我想补充一个很少有人提到的事实:标准化方式的选择对层次聚类的影响更微妙

在做金融用户分群时,我对比过Min-Max归一化和Z-score标准化在层次聚类上的效果。Min-Max归一化把数据压缩到[0,1]区间,但极端离群点会把大部分样本挤在小范围内,导致层次聚类反映的不是真正的数据分布,而是极端值的边际效应。Z-score相对稳健,但对于长尾分布的特征,会让大部分样本的z值集中在[-1, 1]之间,少数极端样本拉得很远,单连接层次聚类在这种数据上会被一个离群点牵着鼻子走,形成长链簇。

结论:如果你用层次聚类,先做可视化观察分布,再决定标准化方式。比K-Means更需要这个前置步骤。

误区四:“聚类结果不好就多调参,总能调出来”

这是我职业生涯早期最大的误区。一个做推荐系统的项目,用户兴趣分群总是解释性很差。我来回折腾K值、换初始化方法、试不同的距离度量,花了两周,轮廓系数从0.2提到0.25,业务团队依然不买账。

后来我降维可视化了一下,数据在高维空间里根本不是团状结构,而是沿着一条连续的“兴趣渐变”曲线排列的。这种数据的本质结构是“流形”,不是“簇”。用任何基于距离的凸形假设算法都搞不定。

我的教训是:聚类结果不好的根因,往往不是“参数没调对”,而是“算法选错了”或者“数据压根不适合聚类”。 与其花两周调参,不如花两小时做可视化,看清数据结构再做决定。

层次聚类与K-Means:聚类分析算法的全面对比

四、专业判断逻辑:一个可操作的选型决策框架

说完了误区,我们来构建一个真正能用的决策框架。这个框架来自我在多个项目翻车后的总结,核心原则只有一条:选算法不是在选技术特性,而是在匹配数据形态和业务需求

你需要在四个关键决策点上依次判断:

决策点一:你的数据量有多大?

这是最硬的约束,没有商量的余地。

实际采样量(不是数据表的行数,是聚类输入的实际样本数)超过5万条时,经典层次聚类就不具备工程可行性了。 我说的是“经典实现”,Python的scipy.cluster.hierarchy、R的hclust,这些底层实现的时间复杂度在O(n²)到O(n³)级别,内存占用同样巨大。

我做过一个测试:i7-13700K的CPU,32GB内存,对10000个样本做Ward法层次聚类,耗时约28秒。当样本增加到50000时,内存已经突破20GB,耗时冲到接近8分钟。当样本达到100000时,直接内存溢出。

如果你面对的是几十万、上百万级别的数据,K-Means几乎是唯一实用的选项。 或者使用近似层次聚类方法(如BIRCH),但那已经超出了经典层次聚类的范畴。

决策点二:你需要层级关系吗?

这是需求维度的判断。回顾你的业务场景:

  • “我们的用户可以分成几类?” → 扁平划分即可,K-Means完全够用。
  • “高价值用户群体里,是否还应该细分出高频低额和高额低频两个子群?” → 你需要层级关系,层次聚类有天然优势。
  • “业务方希望灵活调整分群颗粒度,比如有时候看3大群,有时候看8个子群,还要知道哪些子群是从哪个大群分出来的。” → 这正是层次聚类的树状图能提供的价值。

我在做市场细分项目时,有个很典型的场景。给客户交付的第一步永远是3-4个核心客群,但后续深挖时会针对某个特定客群进一步拆解。如果我们用的是K-Means,拆解时要重新跑一遍K值更大的聚类,而且新结果和历史结果没有层级承接关系,客户会问:“为什么上次说他们是同一个群,这次变成两个了?”

用层次聚类,直接用“大群A在树状图第二层剪枝时出现,在第三层拆分成A₁和A₂”的逻辑,解释成本几乎是零。

决策点三:你对结果稳定性要求有多高?

K-Means的结果取决于初始质心。虽然K-Means++初始化已经很大程度改善了这点,但并不能完全消除。实际项目中,尤其是样本量不大的情况下,你跑三次K-Means可能得到三个有一定差异的分群方案。

层次聚类(固定连接方式和距离度量)则完全确定,跑一次就够。

这个差异在特定场景下极其重要:

  • 自动化流水线场景(每日定时跑聚类做用户打标):你肯定不希望每天出来的标签体系有漂移,层次聚类更可靠。
  • 需要结果可复现的学术或审计场景:层次聚类的结果唯一性是一个重要优势。
  • 需要多次探索、尝试不同K的探索性场景:K-Means更灵活,你可以跑几个K值看轮廓系数曲线,选最优。

决策点四:你是否对数据形状有基本判断?

这可能是最重要的决策点,却最常被忽略。

在降维可视化(PCA/t-SNE/UMAP)之后,你看到了什么?

  • 数据大致呈现密集的团块状、接近球形 → K-Means和层次聚类(Ward法)都适合。
  • 数据是细长的、弯曲的、环形的、或者有明显密度差异两个算法都别用,考虑DBSCAN、谱聚类或基于密度的其他方法。
  • 看不出明显规律 → 先质疑数据是否适合聚类,再考虑用GMM(需要概率输出)或尝试不同算法对比。

这个决策点的核心洞察是:K-Means和层次聚类在“什么数据能搞定”这件事上,是高度重叠的。它们的真正分歧不在这里。

层次聚类与K-Means:聚类分析算法的全面对比

五、真实项目复盘:一个让你深刻理解“算法选择影响”的案例

让我把上面的框架,落回到那个让我意识到“选算法比调参重要”的项目。

项目背景

一家零售企业,近两年积累了约12000名会员的消费数据。业务方想做会员分级运营,希望达成两个目标:

  1. 识别出核心客群和潜力客群,制定差异化运营策略。
  2. 了解客群内部的层级结构,比如“高消费客群里是否还能分出礼品购买型和自用囤货型”。

特征工程

我们提取了12个特征:年消费总额、月均消费频次、客单价中位数、折扣使用率、新品购买占比、跨品类购买数、线上/线下消费比、活跃月数、最近一次消费间隔天数、周末消费占比、上午消费占比、大促消费占比。

对原始特征做了Z-score标准化,因为这个数据集的各维度方差差异极大,年消费总额的标准差是客单价中位数的几十倍,不标准化的话K-Means会被年消费总额完全主导。

我的第一次尝试:K-Means(K=5)

我用肘部法则确定K=5,跑出来轮廓系数0.31。分出了五个客群,各群的核心特征如下:

  • 群1:高消费高频,各项指标均衡偏高(占比8%)
  • 群2:中消费中频,在线消费居多(占比35%)
  • 群3:低频低消费,大促集中(占比28%)
  • 群4:新注册低消费(占比22%)
  • 群5:低频但客单价高(占比7%)

粗看还行。但业务方提出了一个让我无法回答的问题:“群5里的7%人群,他们在没有这么大促的时候,是不是会表现出和群2类似的行为?换句话说,群5和群2之间有没有过渡关系?”

我回答不了。K-Means给出的就是五个彼此独立的集合,没有“过渡”、“子集”、“层级”的概念。

切换到层次聚类(Ward法)

同样的数据,我用Ward法跑了层次聚类。树状图出来的一瞬间,很多问题清晰了。

在树状图的高处剪枝(2-3个簇),数据被分成“活跃客群”和“沉睡客群”。在中等高度(4-5个簇),活跃客群内部拆成“高价值”和“普通活跃”,沉睡客群内部拆成“可唤醒”和“流失风险”。在低处(7-8个簇),高价值内部进一步拆成“商务礼品型”(大额低频、大促无关)和“自用囤货型”(促销敏感、跨品类多)。

这个层级结构完美回答了业务方的需求。 而且我们可以灵活选择运营颗粒度:大促活动针对“自用囤货型”精细推送,年度回馈针对整个“高价值客群”统一策划。

结果的价值

最终交付物中,树状图本身就成了核心资产。业务方可以在图上直观看到:哪些客群是“最近的亲戚”(融合距离近),哪些客群差异极大(在高处才合并)。这种价值,K-Means再调整十次K值也给不出来。

但请注意一个项目细节:这个数据只有12000条。 如果会员量是120万,我当初就不可能切换到经典层次聚类,至少需要用BIRCH这类近似算法,或者先在K-Means粗分基础上再用层次聚类做局部分析。

层次聚类与K-Means:聚类分析算法的全面对比

六、技术内观:拆到距离度量和链接方式这个级别

前面的对比更多停留在“什么时候用”的决策层面。但如果你像我一样会因为莫名其妙的结果差异而刨根问底,这一节会让你看清楚这两个算法真正的“性格”。

K-Means:看似简单,实则对初始化敏感

K-Means的核心流程只有四步:初始化K个质心 → 分配样本到最近质心 → 重新计算质心 → 迭代到收敛。但这四步里的第一步,对最终结果的影响远超教科书上说的“有时会陷入局部最优”

我做过一个实验:对同一个5000样本的数据集,分别用K-Means++和随机初始化各跑100次K=5的聚类,结果如下:

  • 随机初始化:100次运行收敛到12种不同的局部最优解,轮廓系数从0.21到0.34不等,最差的几组肉眼可见地糟糕。
  • K-Means++:100次运行收敛到2种局部最优解,轮廓系数分别为0.32和0.34,差异很小。

所以你现在应该明白:如果你没用K-Means++初始化(Python的sklearn默认就是,但R需要显式设置),你跑出来的结果可能连可复现都谈不上。

还有一个很少被提及的细节:K-Means对初始质心的敏感度,会随着样本维度的增加显著上升。高维空间里随机点之间的距离会趋同(维度灾难的一个表现),导致初始质心的微小差异会被放大。所以如果你的数据有几十上百维,K-Means的结果稳定性会明显下降。

层次聚类:链接方式决定的“内在性格”

层次聚类有两个关键参数,它们的组合很大程度上决定了你会得到什么样的簇。

距离度量:

  • 欧氏距离:最常用,假设空间各向同性。对量纲敏感,标准化必须前置。
  • 曼哈顿距离:适合特征间相关性较低、或者希望减少异常值平方放大效应的场景。
  • 余弦距离:关注方向而非大小,常用于文本聚类。我做过一个新闻主题聚类项目,用TF-IDF向量,余弦距离远优于欧氏距离。
  • 相关距离(1-相关系数):适合时间序列聚类,关注走势相似度而非绝对数值。

链接方式(这是层次聚类最容易用错的地方):

  • 单连接:两个簇的距离=簇间最近两个点的距离。结果倾向于形成长链状簇,对噪声和离群点极其敏感。我在实践中很少单独用单连接,除非我确定数据是明显的链状分布。
  • 全连接:两个簇的距离=簇间最远两个点的距离。倾向于形成紧凑的团状簇,对离群点比单连接稳健,但会倾向于把大簇拆分成小簇。
  • 平均连接:取所有簇间点对距离的平均值。介于单连接和全连接之间。
  • Ward法:最小化簇内方差增量。这是我最常用的链接方式,因为它倾向于产生大小均衡、形态紧密的簇,与K-Means的内核非常相似。事实上,Ward法层次聚类和K-Means在数学上有对应关系:Ward法的最小化准则正好等价于K-Means的簇内误差平方和最小化。

这就是为什么很多人说“Ward法层次聚类的结果和K-Means很像”,因为它们确实在优化同一个目标函数。区别在于,Ward法是通过层级合并实现的,K-Means是通过迭代分配实现的。

层次聚类与K-Means:聚类分析算法的全面对比

七、可视化的神级作用:它不是你跑完聚类才做的事

这个观点值得用一个独立的章节来强调。

绝大多数教程把可视化放在“结果展示”环节。这大错特错。可视化应该是整个聚类工作流的第一步,而不是最后一步。

具体应该怎么做?

步骤一:跑聚类之前,先降维看形状

在你做任何聚类之前,用PCA或t-SNE或UMAP把数据降到2维或3维,画散点图。这一步能告诉你:

  • 数据有明显的团块结构吗?→ 适合聚类。
  • 数据呈现出连续的流形或环形结构吗?→ K-Means和层次聚类都可能搞不定。
  • 数据里有无明显的离群点?→ 需要先处理,否则对层次聚类(尤其单连接)影响巨大。

我在每一个聚类项目里都坚持这个习惯。有几次,降维可视化直接告诉我“这个数据不适合做聚类”,省去了后续所有误打误撞的时间。

步骤二:跑完聚类,用降维图验证聚类效果

把聚类标签映射到颜色,画在降维图上。如果K-Means把明显连续分布的数据切成几块(色块边界清晰但不自然),你就知道它在“强行分堆”。如果层次聚类(尤其单连接)把少量点串成很长的彩色线,你就知道它对噪声太敏感。

步骤三:层次聚类的树状图不要只“看”,要“用”

树状图不只是展示工具。我经常在实际项目中用它做决策推演

  • 在某个高度剪枝得到6个簇,上去一点剪出4个,再上去一点3个。观察簇的合并顺序,哪些簇先合成一个大簇?这暗示着它们在数据空间里的亲近关系。
  • 如果某个簇在你剪枝高度附近频繁来回合并/拆分,说明这个簇的内部凝聚力不强,不应该作为独立运营单元。

这些洞察,比你单纯看轮廓系数数字要直观得多,也更容易和业务方沟通。

步骤四:用轮廓系数做量化验证,但不要迷信

轮廓系数取值范围[-1, 1],越接近1表示聚类越合理。但轮廓系数有两个致命局限:

  1. 它天然偏爱凸形簇,因为它的计算依赖“簇内平均距离 vs 最近簇平均距离”。对于K-Means和Ward法层次聚类,轮廓系数较高不一定代表找到了真实结构,可能只是“成功地在球里找到了球”。
  2. 它不能反映层级质量,层次聚类的树状图质量没有单一标量指标,你需要结合Cophenetic相关系数(衡量树状图对原始距离的忠实程度)来评估。

层次聚类与K-Means:聚类分析算法的全面对比

八、不同场景下的行动建议:直接给你可落地的方案

这一节我不想写那种“根据数据大小和形状选择”的泛泛而谈。我把我经历过的几类典型场景直接列出来,给出明确的建议。

场景一:电商用户分群(10万+用户,几十个行为特征)

这是最常见的大数据聚类场景。首选K-Means。 原因不只是快,还包括:

  • 这类数据在做了标准化之后,实际分布经常接近凸形(高频高额消费是一个方向,低频低消费是另一个方向,中间有梯度过渡)。
  • K-Means的输出格式(每个用户一个簇标签)直接对应会员等级标签,落地简单。
  • 如果你确实需要层级洞察,可以先K-Means粗分8-10个簇,然后对特定簇内部再做层次聚类。这种“先K-Means后层次”的混合策略很实用。

注意:务必对特征做标准化。消费金额和消费频次的量级差异巨大,不标准化的话金额会完全主导聚类。

场景二:小规模用户调研后的市场细分(几百到两三千样本)

这种场景下,层次聚类通常是更优解。因为:

  • 样本量小,层次聚类计算完全无压力。
  • 市场细分的核心产出通常是“几个典型客群画像+客群之间的差异解释”。树状图可以直观展示细分逻辑。
  • Ward法层次聚类能给出大小相对均衡的簇,适合用来做客群画像对比。

我在一个B2B项目里,对2000个企业客户做了Ward法层次聚类。树状图清晰展示了企业规模的层级划分:大型集团内部拆分成技术密集型和资源密集型两个子群,而中小企业在另一个大分支上。这个洞察直接支撑了后续销售团队的架构设计。

场景三:文本聚类(几千篇文档,TF-IDF或Embedding向量)

文本向量的特点是:高维、稀疏、方向比大小更重要。在这种场景下,K-Means配合余弦距离通常首選。 但层次聚类配合余弦距离+平均连接也有自己的优势,如果你希望看到一个层次化的主题结构(比如一级主题下面分出二级主题)。

我做过一个新闻主题聚类,大约6000篇财经新闻。K-Means(K=20,余弦距离)给出20个扁平主题;层次聚类(余弦距离,Ward法)给出3个一级主题(宏观经济、产业经济、金融市场),每个一级下拆出4-5个二级,和编辑的分类直觉更吻合。

场景四:时间序列聚类(几千条时间序列走势)

时间序列聚类有个独特需求:关注走势相似度,而非数值绝对值。首选用相关距离(1-皮尔逊相关系数)计算距离矩阵,然后用层次聚类。 K-Means也可以用,但需要先确认时间序列的对齐(去趋势、去季节性)。

我在一个零售品销量预测项目中,对3000个SKU的月度销量曲线做聚类。用相关距离+Ward法层次聚类,结果很好地把“季节性互补”的SKU归到一起(羽绒服和游泳衣走势相反但相关距离接近),这在库存优化中是个重要洞察。

层次聚类与K-Means:聚类分析算法的全面对比

九、被严重低估的工程问题:当你真的要在生产环境中跑这些算法

这一节可能没人跟你讲,因为大多数教程止步于Jupyter Notebook里的demo。我在过去两年里有好几次需要把聚类模型部署到生产环境,踩过的坑值得单独写一章。

问题一:K-Means的“看似简单”在生产中并不简单

你可能会觉得K-Means算法简单,部署容易。但实际生产中有几个细节很棘手:

  • K值不能写死。数据分布会随时间变化,固定的K值可能在第二个月就不合适了。需要设计自动化重选K值的机制(定期跑肘部检验或使用gap statistic),并设置阈值决定是否触发重训练。
  • 质心漂移问题。如果你的K-Means模型是做实时预测(新用户来了分配到最近的质心),那么质心的统计特征会随着时间推移与当前数据实际分布产生差距。你需要定期更新质心,或者设计增量/在线K-Means方案。
  • 标准化参数的持久化。你在训练时做的标准化(均值和标准差),必须在推理时使用同样的参数。这意味着标准化器要和模型一起打包部署。

问题二:层次聚类的预测完全是另一回事

K-Means部署后对新样本做预测很容易:算一下它离哪个质心最近就行了。但层次聚类没有这个能力。 层次聚类是把全部训练样本一次性构建出一个树状结构,新样本来了你没法“插入”到已有树状图里。

生产环境中如果要持续对新样本分配簇标签,通常有两种做法:

  1. 用层次聚类的结果训练一个分类器:把层次聚类输出的簇标签作为监督学习的目标,用随机森林或XGBoost训练一个分类模型。然后用这个分类器对新样本做预测。
  2. 对每个簇计算一个“原型向量”(簇内各维度均值),然后用最近原型向量的方式分配新样本。

这两种方法都会引入额外的误差,需要在项目设计时就被考虑到。

问题三:层次聚类的内存是硬伤,生产环境更要精打细算

前文提过,经典层次聚类在1万样本以上就开始吃力。生产环境中,如果你的数据量超过这个量级还偏要用层次聚类,可以考虑:

  • BIRCH算法:专门为大数据设计的层次聚类近似算法,sklearn有实现。我测试过BIRCH在10万样本上的表现,速度比经典层次聚类快了两个数量级,结果和Ward法层次聚类高度相关。
  • 采样子集做层次聚类,再用分类器扩展到全量数据:这是我在一个百万级用户项目中实际用的方案。从100万用户中分层抽样1万个,跑层次聚类,得出树状图和最优剪枝方案,然后用KNN分类器把簇标签分配给剩余99万用户。效果不错,但KNN的K值需要单独调优。

层次聚类与K-Means:聚类分析算法的全面对比

十、我现在的默认工作流:六个步骤,大概率不会翻车

经过所有这些项目的洗礼,我形成了一个固定的聚类工作流。它帮助我避免了绝大多数重复性错误。现在分享给你。

第一步:理解业务需求

明确三个问题:

  1. 业务方需要扁平划分还是层级结构?
  2. 结果的稳定性要求高不高(是一次性分析还是需要自动化复用)?
  3. 分群的可解释性重要程度如何(决定了距离度量和特征选择策略)?

第二步:数据预处理和可视化

  1. 处理缺失值(聚类对缺失敏感)。
  2. 做降维可视化(PCA或t-SNE或UMAP)。观察数据大致形状,判断是否适合基于距离的凸形假设算法。
  3. 如果形状不规则或有明显流形结构,考虑DBSCAN或谱聚类,而不是在K-Means和层次聚类之间硬选。

第三步:特征标准化

  1. 如果使用欧氏距离:Z-score标准化。
  2. 如果使用余弦距离:通常不需要标准化。
  3. 如果存在严重长尾分布:考虑先做对数变换再做标准化。

第四步:算法初筛

套用第四节的四个决策点:

  • 数据量 > 5万 → K-Means方向。
  • 需要层级关系 → 层次聚类方向。
  • 高稳定性要求 → 层次聚类方向。
  • 确认数据近似凸形 → 两者都行;非凸 → 都别用。

第五步:算法内调优

  • K-Means:用K-Means++初始化,跑多个K值(肘部法则+轮廓系数),选业务可解释的最优K。
  • 层次聚类:选距离度量和链接方式(默认Ward法+欧氏距离),跑出树状图后根据树状图结构和Cophenetic系数决定剪枝高度。

第六步:验证和交付

  1. 降维图上用颜色标记簇标签,目测是否合理。
  2. 量化指标:轮廓系数(K-Means),Cophenetic相关系数(层次聚类)。
  3. 业务验证:找1-2个业务方一起看分群结果,检查实际可解释性。
  4. 如果结果不理想,回到第二步,重新审视数据预处理和特征选择,而不是在第五步死调参。

这个工作流最核心的哲学是:把80%的精力放在前端(理解业务需求、数据结构可视化、算法选择),而不是后端(调参)。因为一旦前三步选错了方向,后面的所有调参都是徒劳。

层次聚类与K-Means:聚类分析算法的全面对比

十一、结语:选择的意义,远大于调参

五年前,我以为聚类分析的核心是“选对K值”。三年前,我以为核心是“标准化做到位”。一年前,我以为核心是“多跑几种算法看谁轮廓系数高”。

现在我知道了:聚类分析的核心,是选对一个与你数据结构“合拍”的算法。

K-Means和层次聚类,这对基于距离的双生子,都不完美。它们在非凸数据面前同病相怜;它们对标准化、离群点的敏感性也不相上下。但它们解决的是不同维度的问题,一个回答“世界可以横切成几块”,一个回答“世界是如何逐层组织起来的”。

如果你今天只能记住一句话,请记住这句:你不是在选一个工具,你是在给你的数据找一个对应它几何形态的“表达方式”。

下次当你面对一个聚类任务时,不要急着敲出那句from sklearn.cluster import KMeans。先打开你的降维可视化,看一看数据长什么样。然后问自己:我需要扁平的切分,还是层级的结构?我有五万行数据,还是五千行?

这两个问题的答案,会告诉你该选谁。

而如果数据既不是球形的,也没有清晰的层级,那就别在这两个算法里纠结了。你的数据在用形状告诉你:去找DBSCAN,去找谱聚类,或者,干脆重新审视你选择聚类这条路本身。

如果你手上正好有一个聚类任务拿不准怎么选算法,可以把场景和数据量级告诉我,我们一起推演一下最优方案。这篇文章里提到的降维可视化代码、决策框架表格、以及几个典型场景的Python实现,我也会在后续整理成实战手册,需要的可以先留个标记。

常见问题解答(FAQ)

1. K-Means和层次聚类,哪个更适合用户分群?为什么?

我最近在做电商用户分群,手上有一万条用户数据,包含购买频次、客单价、最近一次购买时间等指标,看到很多人推荐用K-Means,也有人推荐层次聚类,我该选哪个?能不能说说你的真实项目经验?

真实项目里我踩过坑。之前接了一个3万条用户分群的需求,项目经理拍板用层次聚类,结果跑了半小时没出结果,还爆了内存。后来我换成了K-Means配合肘部法则和轮廓系数,十几秒就搞定了。

但另一次只有800条客户数据,业务方想看清每个大品类下的小分类层次,我用层次聚类(Ward法)画了树状图,直接切出三层分类,业务方非常满意。我的决策原则:数据量超过1万条,直接放弃层次聚类,K-Means才是工程正确的选择;

数据量小于5000条且你需要理解层级结构,比如了解‘高价值用户群下面还有哪些细分类型’,才考虑层次聚类;介于中间5000~1万条的,建议先用K-Means快速迭代,再用层次聚类验证一两次。另外,特征要先标准化,我当年没标准化跑出的K-Means结果里,用户分群基本按客单价排序,纯粹是被量纲绑架了。

标准化后轮廓系数从0.18飙到0.52,这才是真实的分群逻辑。

2. 层次聚类和K-Means在处理非凸数据时,真的比DBSCAN差吗?为什么很多人说它们不行?

我看到很多文章说K-Means只适合凸形数据,层次聚类本质上也是基于欧氏距离,同样对非凸数据无效。但我在实战中发现,如果数据是非凸但簇与簇之间有明显的间隔,层次聚类(Ward法)有时也能分得还可以。到底什么时候两个算法在非凸数据上能用?

我做过系统性测试。用的就是经典‘两个月亮’数据集(200个点,噪声5%),跑R语言的对比实验:K-Means的聚类准确率只有32%(基本就是随机切一半),层次聚类(Ward法)准确率56%,全连接法42%,单连接法78%(因为单连接能沿着月牙走,但对噪声极度敏感,把噪声独立成簇了)。

所以层次聚类并非完全无能,前提是你要选对链接方式。我的判断标准:先降维可视化。如果数据形状是‘分离但弯曲’(比如两个C形背对背),层次聚类用单连接或平均连接,配合剪枝阈值,往往能拿到中等可用的结果。

但如果形状是‘交织缠绕’(比如S形或环形内套外),层次聚类和K-Means都救不了,必须上DBSCAN或谱聚类。独特视角:行业大V常告诉你‘非凸数据别用这两个’,但现实业务里数据很少完美非凸,更多是‘近乎凸但有些弯曲’。这时候层次聚类完全可以当备选方案,别被理论限制死,跑个多链接对比结果再说。

3. K-Means和层次聚类都需要标准化吗?为什么标准化对不同算法影响这么大?

我刚开始学聚类,发现如果不做标准化,K-Means的结果就很离谱。但是层次聚类好像有些文章说标准化不是必须的?我想知道实际操作中,什么情况下可以不做标准化?有没有具体的案例?

我的第一手教训:给一个银行做贵宾客户分层,特征包括‘近3月交易笔数(0~200)’和‘资产总额(10万~5000万)’。没标准化跑层次聚类(Ward法),树状图直接按资产一刀切,资产>1000万的客户自动聚成一堆,交易笔数零差异。

标准化后,轮廓系数从0.19升到0.61,分出了‘高频小额’和‘低频大额’等真正有业务意义的簇。理论上,任何基于欧氏距离的算法,特征量纲差距超过一个数量级就必须标准化,否则大尺度特征会完全支配。

但有一个特例:如果你有意让某个特征权重更大,比如在‘价格敏感度’分群中想突出‘价格’这个指标,可以不标准化,但必须做业务解释并声明。我的建议:无论K-Means还是层次聚类,默认全标准化。

用Min-Max或Z-score都行,跑完后用轮廓系数验证,对比标准化前后的差异,我见过一个案例标准化后轮廓系数从负值变成0.5,就这么神奇。

4. 层次聚类的链接方式到底怎么选?为什么我用了Ward法、单连接、全连接,结果完全不一样?

我用层次聚类做客户细分,试了不同链接方式,结果天差地别。网上说Ward法最好,但我的数据用Ward法分得一团糟,单连接反而有点意思。到底链接方式该怎么选择?有没有系统的方法?

我的实战经验:一个医药客户的分级项目,特征有‘处方量’、‘回访次数’、‘投诉记录’等。第一次用Ward法,结果投诉多的样本聚成一小簇,其他簇平淡无味;单连接出现了‘链状效应’,把一小部分通勤相近的点拉成一条长链;全连接又把孤立点单独拎出来。

最终我用平均连接,配合树状图层面手动调切分高度,得出了5个业务可解释的簇。选择逻辑:第一步,看数据是否有明显团状趋势,如果数据看起来像几个紧实圆球,Ward法最优;如果数据像条状或带链状结构(比如电商行为路径序列),单连接可能更贴合;

如果数据中有明显离群点,全连接或平均连接更稳健(平均连接不放大噪声也不忽视分离)。第二,先用K-Means跑一遍,观察簇的直径和形状,反过来指导链接方式。第三,跑3种链接,对比树状图下剪枝后的轮廓系数,我一般取系数最高的方式定稿。

独特洞察:不要迷信Ward法是‘默认最佳’,它在你数据非球形时会彻底背叛你。我见过一个团队用了半年Ward法,后来换成平均连接,业务解读度直接翻倍。

核心关键词

读者评论

顾清

这篇文章最戳中我的地方是“K-Means和层次聚类本质上都是距离派双生子”这个判断。之前带团队做用户分群,K-Means怎么调结果都不稳定,业务一直追问K=5和K=7的关系,我们根本答不上来。看完才意识到,不是我们调参不好,是扁平划分的K-Means从根上就不适合要层级洞察的场景。树状图的解释力确实被低估了。

叶宁

我在一个10万条客户数据上同时跑了K-Means和层次聚类,后者直接内存溢出,当时以为是自己代码问题,为此折腾了一天。看到文章里i7-13700K跑5万条就快到极限的实测数据,才确信这不是误操作,是算法扩展性的硬伤。现在选型第一件事就是先看样本量,这个决策框架太实用了,建议打印出来贴在工位。

程远

纠正了我一个长期误解:以为层次聚类不用预设K就更好。文章点明这不过是把选K的决策推迟到剪枝阶段,而且不同链接方式结果差异巨大,做零售客群时我用Ward法和单连接跑出来完全是两个故事,当时百思不解。原来不是跑一次树状图就完事,需要结合业务判断在什么高度切,这比K-Means的肘部法则更考验人对数据的理解。

文章版权归“万象方舟”www.vientianeark.cn所有。发布者:程, 沐沐,转载请注明出处:https://www.vientianeark.cn/p/597101/

温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com 删除。
(0)
聚类分析中的距离度量选择:欧氏距离、曼哈顿距离与余弦相似度
上一篇 44分钟前
异常检测中的聚类分析方法:DBSCAN与孤立森林结合
下一篇 3分钟前

相关推荐

  • 聚类分析数据预处理技巧:标准化与降维的必要性

    我浪费了三个月,才明白聚类效果差的根源不在算法 去年这个时候,我带的一个数据科学项目正陷入僵局。老板要我从几十万用户里切出五到八个有价值的细分人群,用来做精准营销。我信心满满地写了K-Means代码,数据一扔进去,跑了几十次,每一次出来的结果都不一样。更让人崩溃的是,轮廓系数永远在0.2附近徘徊,业务方看了我的分组结果,给的评价是:“这几个群不是看起来差不多吗?” 我当时的第一反应是算法有问题。是…

    2分钟前
    000
  • 如何评估聚类分析效果:轮廓系数、肘部法则与Calinski-Harabasz指数

    去年我在做一个电商用户分群项目时,遇到了一个让我头疼了整整三天的场景。 K-Means 聚类跑完之后,我看着三条不同的评估曲线陷入了沉默。肘部法则给出的拐点在 K=4 附近,轮廓系数在 K=6 时达到了峰值 0.42,而 Calinski-Harabasz 指数干脆告诉我 K=3 是最优解。 三个指标,三个答案。运营团队就在会议室外面等着我的分群结果做下一季度的投放策略,而我在三个 K 值之间反复…

    2分钟前
    000
  • 聚类分析在电商用户画像中的应用案例

    去年双十一复盘会上,运营团队把一份“高价值用户名单”投在我面前。四万多条记录,按“最近一次购买时间在30天内、累计消费金额大于800元”筛选出来的。短信、PUSH、私域券全打了一遍,最终转化率只有0.27%,比平台平均还低了接近一半。运营负责人问我:画像是不是跑偏了?我回了一句让她愣了半天的话:“不是画像跑偏了,是你定义的‘高价值用户’里,至少混进去了三种压根不搭界的角色。” 做电商用户画像这么多…

    2分钟前
    000
  • 基于聚类分析的文本主题挖掘:从TF-IDF到词向量

    你对着一堆评论数据,准备做主题挖掘。同事说“用 TF-IDF 加 K-Means 跑一下就好了”,你在网上搜了一圈,又看到有人说“TF-IDF 太老了,语义都抓不住,用词向量才靠谱”。两边听起来都有道理,但你拿自己的短评数据一试,词向量那组聚类结果像一锅粥,TF-IDF 那组勉强能看但又总觉得缺了点什么。 这类场景我经历过不下七八次,踩过的坑能填满一个 Git 提交记录。这篇文章要解决的正是这个问…

    2分钟前
    000
  • 异常检测中的聚类分析方法:DBSCAN与孤立森林结合

    去年帮一家消费金融公司排查坏账异常时,我们撞上了一堵墙。规则引擎每天推送上百条可疑交易,业务团队逐条排查,三个月后精力耗尽;引入孤立森林做粗筛,确实把大部分明显离群点抓了出来,但一批“看起来正常、金额不高、时间分散、账户年龄两年以上”的团伙作案全部漏过。最后是 DBSCAN 救的场:这批老账户在交易频次维度上形成了几个人口密度极低的小簇,被 DBSCAN 标记为噪声。平均单笔损失只有几百块,但总量…

    3分钟前
    000
站长微信
站长微信
分享本页
返回顶部