WEBKT

聚类算法怎么选?K-Means、层次聚类、DBSCAN大比拼

7 0 0 0

K-Means:简单粗暴,效率至上

层次聚类:远近亲疏,一目了然

DBSCAN:基于密度,无惧“异形”

三大算法横向对比:一图胜千言

如何选择?给你的决策指南

结语

搞数据分析和机器学习的朋友们,肯定没少跟“聚类”打交道。简单说,聚类就是把相似的东西归到一起,不相似的分开。听起来简单,但选哪个算法往往让人头疼。市面上聚类算法五花八门,K-Means、层次聚类、DBSCAN 这三位算是最常见的“老熟人”了。它们各有各的脾气,各有各的擅长。今天,咱们就来把这三位请上台,好好“比划比划”,看看它们到底强在哪,弱在哪,什么时候该请谁出马。

这篇文章的目标很明确:帮你梳理清楚这三种主流聚类算法的特点和适用场景,让你在面对具体问题时,能更有底气地做出选择。别再凭感觉瞎蒙了,是时候深入了解一下你的“工具箱”了!

K-Means:简单粗暴,效率至上

K-Means 算法可以说是聚类界的“入门款”,也是知名度最高的选手之一。它的核心思想简单直接:

  1. 初始化: 先随机指定 K 个点作为初始的“簇中心”(Centroids)。这个 K 是你要预先告诉它的,也就是你期望最终得到多少个簇。
  2. 分配: 计算每个数据点到这 K 个簇中心的距离(通常是欧氏距离),然后把每个点分配给离它最近的那个簇中心,形成 K 个簇。
  3. 更新: 对于每个簇,重新计算其所有数据点的平均值,将这个平均值作为新的簇中心。
  4. 迭代: 重复步骤 2 和 3,直到簇中心不再发生明显变化(或者达到预设的迭代次数)为止。

听起来是不是很直观?就像你想把一堆袜子按颜色分成 K 堆,先随便拿出 K 只不同颜色的袜子做代表(初始中心),然后把剩下的袜子扔到颜色最接近的那一堆里,接着重新计算每一堆的“平均颜色”(更新中心),再重复这个过程,直到袜子堆基本稳定下来。

优点:

  • 简单快速: 算法原理简单,容易理解和实现。计算复杂度相对较低(大致是 O(nkt),n是样本数,k是簇数,t是迭代次数),对于大规模数据集,它的效率通常很高。
  • 效果尚可: 对于符合某些假设(比如簇是凸形的、大小差不多、密度均匀)的数据,K-Means 的效果相当不错。
  • 易于并行化: 算法的某些步骤(如计算距离和更新中心)可以方便地进行并行处理,进一步提升效率。

缺点:

  • K 值需要预先指定: 这是 K-Means 最让人头疼的一点。选多少个簇(K)合适?这往往需要基于经验、业务理解或者尝试不同的 K 值(比如用“肘部法则”或轮廓系数来辅助判断),但没有绝对完美的方法。
  • 对初始中心敏感: 随机选择的初始簇中心对最终结果影响很大。运气不好,可能会陷入局部最优解,得到的结果并不理想。常用的改进方法是多次运行 K-Means(用不同的随机初始中心),然后选择效果最好的一次结果(例如,根据簇内平方和 WCSS)。K-Means++ 是一种更智能的初始化策略,可以缓解这个问题。
  • 对异常值敏感: 因为簇中心是基于平均值计算的,个别离群点(outliers)会把簇中心“拉”偏,影响聚类效果。
  • 假设球状簇: K-Means 基于距离度量,它倾向于发现大小相似、密度均匀、球状(或凸形)的簇。对于非球状(如月牙形、环形)或者密度差异很大的簇,它就有点力不从心了。

适用场景:

  • 大数据集: 当你需要处理海量数据,并且对计算效率有较高要求时,K-Means 通常是首选。
  • 簇形状已知或预期为凸形/球状: 如果你对数据的分布有一定了解,知道簇大致是圆滚滚的,那 K-Means 效果一般不会太差。
  • 初步探索: 作为一种简单快速的方法,K-Means 很适合用于数据的初步探索性分析,快速了解数据的大致结构。
  • 作为其他算法的预处理: 有时 K-Means 也被用作其他复杂算法(如谱聚类)的预处理步骤。

思考一下: 用 K-Means 时,最纠结的是不是定 K 值?你通常怎么确定 K?有没有试过 K-Means++?效果提升明显吗?

层次聚类:远近亲疏,一目了然

层次聚类(Hierarchical Clustering)则完全是另一种思路。它不像 K-Means 那样一开始就定死 K 个簇,而是试图构建一个嵌套的簇的层级结构。它主要有两种玩法:

  1. 凝聚式(Agglomerative): 这是更常用的方式。一开始,每个数据点自己就是一个独立的簇。然后,在每一步中,找到最“近”的两个簇,把它们合并成一个新的簇。重复这个过程,直到所有点都合并到同一个簇中,或者达到了某个停止条件。这个过程就像是“连连看”,不断把相似的组合在一起。
  2. 分裂式(Divisive): 这个比较少见。一开始,所有数据点都在一个大簇里。然后,在每一步中,选择一个簇,把它分裂成两个最“不相似”的子簇。重复这个过程,直到每个点都自成一簇,或者满足某个停止条件。这个过程则像是“庖丁解牛”。

层次聚类的关键在于如何定义簇与簇之间的“距离”(或相似度),这被称为链接标准(Linkage Criteria),常见的有:

  • Ward Linkage: 最小化合并后簇内方差的增量。对噪声敏感,倾向于发现大小相似的球状簇。
  • Average Linkage: 使用两簇之间所有点对距离的平均值。对噪声相对不敏感。
  • Complete Linkage (Maximum Linkage): 使用两簇之间所有点对距离的最大值。可以处理非球状数据,但对异常值敏感。
  • Single Linkage (Minimum Linkage): 使用两簇之间所有点对距离的最小值。可以处理非球状数据,容易受到“链式效应”(chaining effect)的影响,即几个簇可能因为个别点的接近而被错误地连接起来。

层次聚类的结果通常用一个叫做树状图(Dendrogram) 的东西来可视化。树状图展示了簇是如何一步步合并(或分裂)的。你可以通过在某个“高度”水平切割树状图,来得到指定数量的簇。比如,你想得到 3 个簇,就在能把树分成 3 大枝干的高度切一刀。

优点:

  • 无需预先指定 K 值: 这是它相对于 K-Means 的一大优势。你可以先生成完整的树状图,然后根据图的样子或者业务需求,再决定到底分成几个簇比较合适。
  • 提供层次结构: 树状图本身就蕴含了丰富的结构信息,可以看到数据点之间的亲疏远近关系,以及簇的嵌套关系。这在某些领域(如生物学的物种分类)非常有用。
  • 可以处理任意形状的簇(取决于链接标准): 比如 Single Linkage 和 Complete Linkage 就能发现非球状的簇。
  • 结果确定性: 对于给定的数据集和链接标准,层次聚类的结果是确定的,不像 K-Means 那样受初始化的影响。

缺点:

  • 计算复杂度高: 凝聚式层次聚类的典型时间复杂度是 O(n^3) 或 O(n^2 log n)(如果使用优化的数据结构),空间复杂度也较高(至少 O(n^2) 来存储距离矩阵)。这使得它难以应用于非常大的数据集。
  • 合并/分裂决策不可撤销: 一旦两个簇被合并(或一个簇被分裂),这个决定就无法更改了。早期的错误决策可能会影响后续结果。
  • 对噪声和异常值敏感(某些链接标准下): 比如 Ward 和 Complete Linkage 对异常值比较敏感。
  • 选择链接标准和距离度量困难: 不同的链接标准和距离度量(欧氏距离、曼哈顿距离、余弦相似度等)会产生不同的聚类结果,选择哪个最优并不容易。

适用场景:

  • 小到中等规模数据集: 由于计算复杂度的限制,层次聚类更适合处理样本量不太大的情况(比如几千个样本)。
  • 需要了解数据层次结构: 当你不仅想分组,还想知道组与组之间的关系时(例如构建分类体系、基因序列分析)。
  • 不确定 K 值: 当你对数据应该分成几类没有先验知识时,层次聚类提供了一种探索性的方式。
  • 可视化需求: 树状图是一种强大的可视化工具,便于理解聚类过程和结果。

思考一下: 你觉得树状图最大的用处是什么?切割树状图决定 K 值时,有没有什么好的依据?不同的链接标准对结果影响真的很大吗?

DBSCAN:基于密度,无惧“异形”

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种完全不同的思路,它基于密度来寻找簇。它的核心思想是:一个簇就是空间中一个足够稠密的区域,簇与簇之间被稀疏的区域隔开。

DBSCAN 有两个关键参数:

  1. ε (epsilon, eps): 定义了一个点的“邻域”半径。一个点的 ε-邻域指的是与该点距离不超过 ε 的所有点的集合。
  2. MinPts: 定义了判断一个点是否为“核心点”所需的最小邻域内点数(包括点自身)。

基于这两个参数,DBSCAN 将数据点分为三类:

  • 核心点(Core Point): 如果一个点的 ε-邻域内至少包含 MinPts 个点,那么它就是一个核心点。核心点位于簇的内部。
  • 边界点(Border Point): 一个点不是核心点,但它落在某个核心点的 ε-邻域内。边界点位于簇的边缘。
  • 噪声点(Noise Point)/异常点(Outlier): 既不是核心点也不是边界点的点。DBSCAN 能自动识别并排除这些点。

DBSCAN 的聚类过程大致如下:

  1. 随机选择一个未被访问的点 P。
  2. 检查点 P 是否为核心点:
    • 如果是核心点,就以 P 为起点创建一个新的簇,并将 P 的 ε-邻域内的所有点(包括核心点和边界点)都加入这个簇。然后,递归地检查这些新加入的核心点,不断扩张簇,直到无法再扩张为止。
    • 如果不是核心点,暂时将其标记为噪声点(后续可能被其他核心点收编为边界点)。
  3. 重复步骤 1 和 2,直到所有点都被访问过。

最终,互相“密度可达”(density-reachable)的核心点及其关联的边界点构成一个簇。

优点:

  • 无需指定 K 值: 和层次聚类一样,DBSCAN 不需要预先知道簇的数量。簇的数量是算法根据数据分布和参数自动确定的。
  • 能发现任意形状的簇: 这是 DBSCAN 的招牌优势!因为它基于密度,不关心簇是不是球状,所以可以很好地处理月牙形、环形等各种奇怪形状的簇。
  • 对噪声不敏感: DBSCAN 能明确地识别出噪声点,不会强行把它们归入某个簇,这使得聚类结果更鲁棒。
  • 只需要两个参数: 相对于 K-Means 的 K 和层次聚类的链接/距离选择,DBSCAN 的参数(ε 和 MinPts)虽然也需要调整,但概念上更直观(密度)。

缺点:

  • 对参数 ε 和 MinPts 敏感: 这两个参数的选择对结果影响巨大。选得不好,可能所有点都成了噪声,或者所有点都在一个簇里。通常需要反复试验或者借助一些启发式方法(如 K-距离图)来选择合适的参数。
  • 对密度不均的数据集表现不佳: DBSCAN 假设所有簇的密度大致相同(由 ε 和 MinPts 定义)。如果数据集中包含密度差异很大的簇,用一组全局的 ε 和 MinPts 可能无法同时很好地识别所有簇。有些点可能在某个簇看来是核心点,但在另一个更稀疏的簇看来却是噪声。
  • 高维数据下的“维度灾难”: 在高维空间中,点之间的距离概念变得模糊(所有点似乎都离得很远),密度定义也变得困难。这使得 DBSCAN 在高维数据上的效果可能打折扣,参数选择也更难。
  • 计算复杂度: 基本的 DBSCAN 复杂度约为 O(n^2),但在使用空间索引(如 KD-tree 或 Ball-tree)优化后,平均复杂度可以降到 O(n log n)。但最坏情况下仍可能退化。

适用场景:

  • 需要发现任意形状的簇: 当你预期数据中的簇不是简单的球状时,DBSCAN 是强力候选。
  • 数据中包含噪声/异常值: 如果你想自动识别并过滤掉噪声点,DBSCAN 很合适。
  • 不确定簇的数量: 当 K 值未知时,可以尝试 DBSCAN。
  • 空间数据分析: DBSCAN 最初就是为空间数据库设计的,在地理信息系统(GIS)等领域应用广泛,用于发现空间聚集区域。

思考一下: DBSCAN 的参数 ε 和 MinPts,你觉得哪个更难调?有没有遇到过密度不均导致 DBSCAN 效果不好的情况?怎么解决的?

三大算法横向对比:一图胜千言

为了更清晰地看到它们的差异,我们来个总结:

特性 K-Means 层次聚类 (凝聚式) DBSCAN
簇数量 K 需要预先指定 无需预先指定 (可从树状图选择) 无需预先指定 (由算法和参数决定)
簇形状假设 凸形/球状 可处理任意形状 (取决于链接标准) 可处理任意形状
异常值处理 敏感,异常值会影响中心 敏感 (某些链接标准下) 鲁棒,能识别为噪声点
主要参数 K 链接标准, 距离度量, (切割高度/簇数) ε (邻域半径), MinPts (最小邻域点数)
计算复杂度 较低, O(nkt), 适合大数据 较高, O(n^2 log n) 或 O(n^3), 适合中小数据 中等, O(n log n) (平均), O(n^2) (最坏)
结果确定性 不确定 (受初始中心影响) 确定 确定 (对于核心点和噪声点,边界点归属可能微调)
主要优点 简单, 快速, 可扩展性好 提供层次结构, 无需定 K, 形状灵活 (部分) 无需定 K, 可发现任意形状, 抗噪声
主要缺点 需定 K, 对初始/异常值敏感, 球状假设 计算昂贵, 决策不可撤销, 对链接/距离敏感 对参数敏感, 难处理密度不均/高维数据

如何选择?给你的决策指南

看了这么多对比,你可能还是有点晕:到底该用哪个?别急,这没有标准答案,但有一些实用的建议:

  1. 从数据本身出发:

    • 数据量有多大? 如果是几十万、上百万甚至更多的数据,K-Means 因其高效率通常是首选。层次聚类基本就不用考虑了。DBSCAN 在优化后也能处理较大数据,但可能不如 K-Means 快。
    • 数据的维度高不高? 高维数据对 DBSCAN 是个挑战(维度灾难)。K-Means 和层次聚类虽然也受影响,但相对好一些(不过距离度量在高维也可能失效)。可能需要先进行降维处理。
    • 你对簇的形状有什么预期? 如果你知道或猜测簇是大致球状的,K-Means 是个不错的起点。如果簇的形状可能很奇怪(比如地理位置数据、图像分割),DBSCAN 或许更合适。层次聚类的 Single/Complete Linkage 也能处理非球状,但效果和 DBSCAN 可能不同。
    • 数据中有没有很多噪声或异常值? 如果有,并且你希望算法能自动处理它们,DBSCAN 是个好选择。K-Means 对异常值很敏感,可能需要预先清洗数据。层次聚类也可能受影响。
    • 簇之间的密度是否均匀? 如果簇的密度差异很大,标准 DBSCAN 可能会遇到麻烦。你可能需要考虑其变种(如 OPTICS)或者尝试其他方法。K-Means 和层次聚类对密度变化相对不那么敏感(但 K-Means 倾向于找大小相似的簇)。
  2. 从你的目标出发:

    • 你是否需要知道簇的数量 K? 如果 K 是必须预先确定的(比如业务规定必须分成 5 类),K-Means 是直接的选择。如果你不知道 K 应该是多少,或者想探索不同的 K 值,层次聚类(通过树状图)和 DBSCAN 提供了更大的灵活性。
    • 你是否关心簇之间的层次关系? 如果需要构建一个分类体系或者理解数据的层级结构,层次聚类是唯一的选择。
    • 你对计算时间的要求有多高? 如果要求快速出结果,K-Means 通常最快。
  3. 实践出真知:

    • 没有银弹! 没有任何一个聚类算法能在所有情况下都表现最好。最好的方法是尝试多种算法
    • 可视化! 对低维数据(2D 或 3D,或者降维后),将聚类结果可视化出来,直观地看看效果如何。
    • 评估指标! 使用一些内部评估指标(如轮廓系数 Silhouette Score、戴维斯-布尔丁指数 Davies-Bouldin Index)或外部评估指标(如果你的数据有真实标签,如调整兰德指数 Adjusted Rand Index)来量化比较不同算法或不同参数设置下的结果。但请记住,指标得分高不一定代表结果在业务上就有意义。
    • 参数调优! 对于 K-Means 的 K,DBSCAN 的 ε 和 MinPts,都需要仔细选择和调整。可以结合肘部法则、K-距离图、轮廓系数等方法,以及你的领域知识来进行。

一个可能的决策流程:

  • 数据量巨大? -> 优先考虑 K-Means。如果 K 未知或形状复杂,可以尝试 Mini Batch K-Means 或考虑抽样后用 DBSCAN。
  • 数据量适中,需要层次结构或不确定 K? -> 考虑层次聚类。
  • 数据量适中/较大,预期形状任意或有噪声? -> 优先考虑 DBSCAN。注意参数选择和密度问题。
  • 不确定? -> 先用 K-Means 做个快速基线,然后根据结果和数据特点,考虑是否尝试 DBSCAN 或层次聚类(如果数据量允许)。

结语

K-Means、层次聚类、DBSCAN 是聚类工具箱里的三把利器,各有千秋。K-Means 胜在简单高效,适合大规模、球状簇场景;层次聚类能揭示数据层级,无需预设 K,但计算量大;DBSCAN 则擅长发现任意形状的簇并对抗噪声,但对参数和密度敏感。

理解它们的原理、优缺点和适用场景,是做出明智选择的基础。但最终,选择哪个算法、如何设置参数,往往需要在实践中不断尝试、评估和调整。记住,算法是工具,真正重要的是理解你的数据和你的目标。

希望这次“大比拼”能让你在未来的聚类任务中更加得心应手!

算法选择困难症患者 聚类算法K-MeansDBSCAN层次聚类机器学习

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8855