GMM与DBSCAN聚类实战对比:突破KMeans瓶颈的概率与密度方法
2026/9/23 3:54:12 网站建设 项目流程

聚类这个问题,平时写代码遇到最多的就是 KMeans,但真正业务里数据一复杂,KMeans 那种"按距离画圆"的思路往往就不够用了。要么簇的形状不规则,要么数据里有明显的离群点,要么样本本身存在重叠,这时候就该把 GMM 和 DBSCAN 拿出来用。

这篇内容来自我之前整理的一份讲义,主题就是第五讲的高斯混合模型(GMM)和基于密度的聚类方法(DBSCAN)。两者代表了聚类算法里两个很重要的方向:一个是基于概率分布的软聚类,一个是基于密度的硬聚类。这一讲我不仅会讲清楚它们各自的原理和适用场景,还会用真实数据和代码把两者的差异跑出来,看完你就能知道"什么时候该用谁"。

GMM 适合处理有重叠、存在软归属的数据,DBSCAN 则擅长发现任意形状的簇,并且能天然识别噪声点。这篇文章适合正在学机器学习基础的人,也适合那些 KMeans 用得溜但在实际项目里总感觉差口气的工程师。我会尽量不走教科书路线,而是用我自己的理解把这两个算法讲透。

1. 聚类任务的两个方向:画形状还是画密度

先说一个我自己的体会:选聚类算法之前,先想清楚数据里到底藏着什么结构。KMeans 之所以在很多人手里显得"不够用",是因为它本质上只假设簇是凸的、大小差不多的球形结构。这个假设在用户分群、简单样本划分这类场景下还能凑合,但如果数据里出现月牙形、环形簇,或者各簇密度差异很大,KMeans 基本就废了。

聚类算法大体上可以分为几个流派:基于划分的(KMeans、KMeans++)、基于层次的(AGNES、BIRCH)、基于密度的(DBSCAN、OPTICS)和基于概率模型的(GMM,也就是高斯混合模型)。其中 GMM 和 DBSCAN 分别代表了两种完全不同的思路,也可以说是聚类任务里两个极端方向。

GMM 的逻辑是"先假设后验证",它假设所有数据由若干个高斯分布叠加混合生成,然后去反推每个分布的参数以及每个样本来自哪个分布的概率。这是一种软聚类思路,因为每个样本并不是"硬性"地属于某个簇,而是带有概率地分配到多个簇。举个例子,一个人群画像数据里,一个用户可能 70% 像上班族、30% 像自由职业者,GMM 能把这个概率分布表达出来,而 KMeans 只能硬生生地把他丢进其中一个类别。

DBSCAN 的逻辑则完全不同,它不关心数据的分布形状,只看密度。它的核心思想是:如果某个区域的样本密度超过一个阈值,就把它当作一个簇;密度稀疏的区域就当作噪声。所以 DBSCAN 能发现任意形状的簇,比如环形的、月牙形的,甚至嵌套的,同时它还能自动把离群点挑出来。

这两个算法在实际项目里解决的问题其实是有互补的:如果你的数据簇形状复杂、噪声多,用 DBSCAN;如果你的数据簇之间有重叠,你想得到样本归属的概率而不是唯一标签,用 GMM。这一讲把两者放在一起讲,目的就是帮大家建立一个算法选型的坐标系。

1.1 什么时候 KMeans 不够用

在用 GMM 和 DBSCAN 之前,先得弄明白 KMeans 的局限性到底在哪。KMeans 的目标函数是让簇内样本到质心的欧氏距离平方和最小,这在数学上等价于假设每个簇的分布在各个方向上的方差是相同的。也就是说,KMeans 隐含地假设每个簇都是圆形或者球形,而且大小差不多。

举个真实业务里的例子:假设你在做电商用户的购买行为聚类,老用户中有一批"高价值用户",他们的消费金额集中在 1000 到 5000 元之间,消费频率集中在每月 5 到 20 次;另有一批"潜力用户",消费金额从 50 到 2000 元不等,但频率跨度很大。这两拨用户的数据分布如果画出来,大概率是一个椭圆形和另一个更扁的椭圆形交叉在一起,KMeans 在边界位置就会切错。而 GMM 因为要给每个簇单独学习协方差矩阵,能适应这种椭球形的簇,边界自然会切得更准。

DBSCAN 的思路则是为了应对另一类问题:当数据聚类形状不是凸的。最经典的是两个环嵌套的数据集,或者类似月牙形交叉的数据,这种结构下 KMeans 的簇边界会把本来不属于一起的样本硬拉进同一个簇。DBSCAN 不依赖球状假设,只看密度连通性,所以面对这种数据反而很轻松。

我自己在做项目时的经验是:如果只是维度低、簇数量明确、数据接近球形分布的快速聚类,直接用 KMeans 准没错,因为它快且可解释。但如果你心里对簇的形状、是否有噪声、是否有重叠都还没有底,就别急着上 KMeans,先画图或者用 GMM、DBSCAN 做探索性分析,往往能获得更多信息。

1.2 GMM 和 DBSCAN 的互补关系

GMM 和 DBSCAN 看着差异很大,但它们解决的其实是聚类的两个不同痛点:重叠与噪声。

GMM 适合处理"某个样本可能同时属于多个簇"的场景。比如在图像分割里,一个像素可能既有天空又有云彩的特征,GMM 输出的是像素属于每个类别(如天空、树木、建筑)的后验概率,这样后续处理时就可以结合概率做更精细的判断。这种能力在语音识别里的声学建模、金融风控里的用户风险分层中也用得很多。

DBSCAN 则是在"簇形状未知、噪声明显"的场景里更可靠。比如地理位置的 POI 聚类,城市里商圈、住宅区、公园各自分布形状完全不同,DBSCAN 能根据密度自然地找出这些热点区域,并把稀疏区域的点直接归为噪声。这类任务如果用 GMM 或 KMeans,你往往要不断地去调簇数量 K,但那些稀疏的噪声点始终会干扰参数估计。

更实际的一点是,GMM 需要提前指定分量数量(也就是簇数量 K),而 DBSCAN 不需要。很多人在拿到一批没有标签的数据时,其实连"应该分成几类"这个基本问题都回答不了。这种情况下 DBSCAN 可以先帮你探一下底,看看到底能聚出几块比较密集的区域。之后如果你想进一步做概率建模,再把 GMM 套上去,两者可以形成一条工作流。

2. GMM 的核心原理:多个高斯分布叠加

高斯混合模型这个名字听起来唬人,但它背后的直觉很简单:你手上有一堆数据点,它们看起来混在一起,但实际上是由多个"团块"混合产生的。每个团块就是一个高斯分布,有自己独立的均值向量和协方差矩阵。GMM 要做的就是把这些团块的参数反推出来,并且告诉每个样本它落在各个团块里的概率分别是多少。

从数学上看,一个 K 分量的 GMM 的概率密度函数是:

p(x) = Σ(k=1..K) π_k · N(x | μ_k, Σ_k)

这里面 π_k 是第 k 个高斯分布的混合系数,相当于这个"团块"在总体中的占比,满足所有 π_k 之和等于 1;N(x | μ_k, Σ_k) 是第 k 个高斯分布的概率密度,μ_k 是均值向量,Σ_k 是协方差矩阵。也就是说,整个数据集的分布被看成是 K 个高斯分布的加权和。

对于每个样本 x_i,它在第 k 个簇中的后验概率也就是"责任度"(responsibility),用贝叶斯公式计算:

γ(z_ik) = π_k · N(x_i | μ_k, Σ_k) / Σ(j=1..K) π_j · N(x_i | μ_j, Σ_j)

这个 γ 的值就是 GMM 输出的软标签。实际落地时,如果我们需要硬标签,直接取 γ 最大的那个簇即可。这个软标签在很多场景下特别有用,比如在客户流失预警里,某个用户属于"高流失风险簇"的概率为 0.6,属于"中风险"的概率为 0.3,你就能根据这个概率分布去定制差异化的运营策略,而不是简单粗暴地把他归为一类。

2.1 从极大似然到 EM 算法

GMM 的参数学习不是像 KMeans 那样直接几步算完的,它得靠 EM 算法迭代求解。原因是直接对 p(x) 求极大似然估计时,对数里带了个求和号(因为每个样本都可能是来自任意一个高斯分量),导致没有解析解。EM 算法的思路是:既然直接求参数求不出来,那就先把每个样本"偷偷地分配到"某个簇(E 步),然后基于这些分配结果重新估计参数(M 步),反复迭代直到收敛。

具体来说,EM 算法在 GMM 里的步骤是这样的:

E 步(Expectation):用当前参数计算每个样本属于每个簇的后验概率 γ(z_ik),这一步相当于在做软分配。M 步(Maximization):根据 γ(z_ik) 更新每个簇的混合系数、均值向量和协方差矩阵。新的均值就是每个簇内所有样本的加权平均,权重就是刚才算出的后验概率。

循环执行 E 步和 M 步,直到参数变化量小于某个阈值(比如 1e-6)或达到预设的最大迭代次数(比如 100 次),模型就训练完成了。

我想特别提醒一点:EM 算法对初始值敏感,不同的初始化可能会收敛到不同的局部最优解。实际工程里,推荐的做法是用 KMeans 的结果作为 GMM 的初始聚类中心,这样既能让均值初始值更合理,也能减少 EM 的迭代次数。sklearn 里的 GaussianMixture 默认就是这种 init_params='kmeans' 的做法,这也是一种非常务实的工程折中。

协方差矩阵的类型(covariance_type)也是一个需要花心思去选的参数。它有几个选项:

  • full:每个簇有自己的完整协方差矩阵,能学习到任意椭球形状,但参数多,容易过拟合。
  • tied:所有簇共享同一个协方差矩阵,模型简单,但形状表达能力有限。
  • diag:每个簇的对角协方差矩阵,各特征独立,计算量小,适合特征相关性不强的场景。
  • spherical:每个簇用一个标量方差,相当于 KMeans 的概率版本,最快。

我在实际应用里的经验是:如果特征维度不是很高(比如小于 20),优先试 full;如果数据量不大或者明显感觉某些特征之间存在冗余,可以考虑 diag 来降低方差;只有在特征已经做过 PCA 降维或者数据本身近似球形时,才考虑用 spherical 来提速。

2.2 GMM 聚类实操示例

光说不练没有意义,这里我们直接用 Python 生成一份二维数据,看看 GMM 跟 KMeans 在实际效果上的差异。我用的是 sklearn 自带的 make_blobs 和 make_moons 来生成数据,然后对比两种算法的聚类结果。

拿 make_blobs 生成的三个高斯斑点数据,KMeans 和 GMM 的效果都很不错,边界几乎一致。但如果把其中一个簇的方差拉大,形成椭圆形状,KMeans 就会在两个簇交错的地方产生误切,而 GMM 因为学了协方差矩阵,能适应这种椭圆分布,分类边界更贴合真实聚簇。

再拿 make_moons 生成的月牙形数据来测,KMeans 基本无能为力,因为它只能画一条直线或者一个圆的边界,无法将两个纠缠的月牙分开。这时候 DBSCAN 就派上用场了,后面我会专门演示。

用代码生成聚类数据的核心逻辑如下:

from sklearn.datasets import make_blobs, make_moons from sklearn.mixture import GaussianMixture import matplotlib.pyplot as plt # 生成两个簇,其中一个方差较大,形成椭圆 X, y_true = make_blobs(n_samples=1000, centers=2, cluster_std=[1.0, 3.0], random_state=42) # 训练 GMM gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=42) gmm.fit(X) labels = gmm.predict(X) proba = gmm.predict_proba(X) # 可视化可以用 plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')

有一点要注意,GMM 训练完如果有软标签需求,可以调用predict_proba,这在客户分群、异常检测等场景里非常实用,比如某样本属于正常簇的概率只有 0.2,那它就有可能是异常点。DBSCAN 则做不到这一点,它给出的要么是某个簇标签,要么是 -1 噪声标签,没有概率输出。

3. DBSCAN 的核心原理:密度相连就是一家人

DBSCAN 的全称是 Density-Based Spatial Clustering of Applications with Noise,名字虽然长,但核心思想就一句话:把密度足够大的相邻区域连成一片。它对簇形状没有预设,也不需要你指定 K 值,唯一需要设定的是两个参数:邻域半径 eps 和最小样本数 min_samples。

算法先挑一个样本点,以它为圆心、eps 为半径画一个圈,统计圈内的样本数。如果圈里的样本数大于等于 min_samples,这个点就是核心点,它圈住的样本都会划入同一个簇,然后继续以这些样本为圆心重复画圈扩展,直到一圈圈扩散到再也找不到满足条件的核心点。那些在簇内但不满足核心点条件的点叫边界点,最终剩下的、没有被任何簇纳入的点就是噪声点。

用一句话概括:DBSCAN 把样本分为核心点、边界点和噪声点三类。核心点负责往四周扩散,边界点负责"挂"在簇边缘,噪声点就静静地待在密度稀疏的地方,不归属任何簇。

3.1 两个关键参数:eps 和 min_samples

eps 是邻域半径,决定了"多远算邻居"。eps 太小,很多点周围根本凑不齐 min_samples 个邻居,结果所有点都被判成噪声;eps 太大,又容易把好几个簇连成一片,丢失细节结构。

min_samples 是最小样本数,决定了"多密才算密"。这个值通常取大于等于数据维度加一,即 min_samples >= D + 1,因为在高维空间里,至少要有足够多的点才能支撑起一个簇的判定。但更推荐的做法是取 2 倍的维度,也就是 min_samples = 2 * D,这样抗噪能力更强。

关于 eps 的选择,业内有一个比较经典的方法:对每个样本点,计算它到第 k 个最近邻的距离(k 取 min_samples),然后画出这些距离排序后的曲线(k-distance 图)。曲线中急剧上升的位置对应的距离,就是一个比较合适的 eps。

我提供一个快速生成 k-distance 图的代码:

from sklearn.neighbors import NearestNeighbors import numpy as np # X 是数据矩阵 neigh = NearestNeighbors(n_neighbors=20) neigh.fit(X) distances, _ = neigh.kneighbors(X) # 取每个点到第 20 个最近邻的距离,并排序 k_dist = np.sort(distances[:, -1]) plt.plot(k_dist) plt.ylabel('k-distance') plt.xlabel('Points sorted by distance') plt.show()

曲线拐点的横坐标对应的纵坐标值,就是 eps 的一个推荐值。在我的项目里,这个做法虽然不是百分之百准确,但至少能帮你在最开始划定一个合理范围,再结合业务意义微调。

3.2 DBSCAN 聚类实操示例

DBSCAN 在 sklearn 里用起来也相当简单:

from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons X, y_true = make_moons(n_samples=500, noise=0.05, random_state=42) db = DBSCAN(eps=0.2, min_samples=10) labels = db.fit_predict(X)

用 make_moons 数据试一下就能看到,DBSCAN 能完美地把两个月牙形簇分开,噪声点(如果有的话)会标成 -1。而如果你用 KMeans 去分这个数据,画出来的边界线会像一条把两片拼图硬生生割开的线,效果非常惨烈。

不过 DBSCAN 也有一个明显的短板:它对参数 eps 的取值非常敏感。同样的数据,eps 从 0.2 改成 0.5,结果可能从"两个簇"变成"一个簇",或者从"一个簇"变成"全是噪声"。所以实际跑 DBSCAN 时,务必先做特征缩放,让各特征尺度一致,否则距离计算会被某些量纲大的特征主导。

3.3 数据标准化对 DBSCAN 的影响

这一点我在实际项目里踩过坑,务必要单独拿出来说。DBSCAN 是基于距离的算法,而距离对特征的量纲非常敏感。假设你在做用户行为聚类,特征里有"月消费金额"(单位是元,可能横跨几百到几万)和"登录次数"(单位是个位数到几十),如果不做标准化,那么 eps 的取值几乎只受到消费金额这一个特征的支配。

所以跑 DBSCAN 之前,先用 StandardScaler 或者 MinMaxScaler 把特征缩放到一个统一的范围,这是必须做的一步。GMM 虽然没有 DBSCAN 对距离那么敏感,但如果特征量纲差异过大的话,协方差矩阵的数值稳定性也会变差。

对于标准化,我个人的默认选择是 StandardScaler(减去均值除以标准差),因为它对异常值相对更鲁棒,也能让数据分布更接近高斯。如果你发现特征里有很多异常大值,可以先用 RobustScaler,基于中位数和四分位距做缩放,效果更好。

4. 在同一个数据集上对比 GMM 与 DBSCAN

为了更直观地比较这两种算法,我构造了一个"混合场景"数据集:既有椭圆形的簇,又有噪声点,还有一个非常规形状的簇。这个数据集合了前面讲到的各种困难特征,用来检验算法的适应能力。

我用的数据由三部分组成:第一部分是两个高斯分布的椭圆簇,第二部分是一个环形簇,第三部分是随机撒的噪声点。用代码生成的话大概是这样:

import numpy as np from sklearn.datasets import make_classification # 生成一组带有噪声的环形数据 theta = np.linspace(0, 2*np.pi, 300) circle_x = 4 * np.cos(theta) + np.random.normal(0, 0.1, 300) circle_y = 4 * np.sin(theta) + np.random.normal(0, 0.1, 300) circle = np.column_stack((circle_x, circle_y)) # 叠加两个高斯簇 blob_centers = [[-4, 3], [4, -3]] blob_data = make_blobs(n_samples=300, centers=blob_centers, cluster_std=[0.8, 1.5], random_state=42)[0] # 加入噪声点 noise = np.random.uniform(low=-6, high=6, size=(80, 2)) X = np.vstack([circle, blob_data, noise])

在这个数据集上,GMM 和 DBSCAN 的表现差异很明显。GMM 因为是概率模型,面对环状簇时会试图用几个椭球叠加去近似环的形状,结果可能出现一个簇被拆成好几片,或者环形区域被误判成另一个高斯簇的一部分。DBSCAN 则能把环形簇完整地识别出来,同时把远离主体密度的噪声点标为 -1。

但这不代表 GMM 在该数据集上毫无价值。如果此时我只关心数据的主体结构,不关心精细的环状边界,GMM 给出的概率输出能帮助我做更稳健的后续分类建模。所以我通常的做法是:先用 DBSCAN 跑一遍,剔除明显噪声点,再对干净的样本使用 GMM 做软聚类,这样既保留了噪声识别能力,又获得了概率化表达。

4.1 用轮廓系数评估聚类效果

聚类没有标准答案,但可以借助一些指标来评估。轮廓系数(Silhouette Score)是其中用得较多的一种,它综合衡量了簇内凝聚度和簇间分离度,取值范围在 -1 到 1 之间,越大代表聚类效果越好。

from sklearn.metrics import silhouette_score sil = silhouette_score(X, labels)

要注意的是,轮廓系数在簇的形状比较奇怪(比如环形)时,往往会低估聚类质量,因为环形内部的距离结构跟球状簇差别很大。所以我更建议把轮廓系数当作一个参考而不是绝对标准,实际选型还是要结合业务理解去判断。

4.2 聚类稳定性:跑多次看结果波动

另外一个容易被忽略的问题就是聚类结果的稳定性。KMeans 和 GMM 会因为随机初始化不同,得到略有差异的结果,所以我在项目里会用不同的 random_state 跑多次,看标签的一致性。DBSCAN 则完全确定,只要你数据不动、参数不动,结果就完全一样,这在某些对可重复性要求高的场景里是个优点。

不过 GMM 的 EM 算法在初始化合理(比如用 KMeans 初始化)的情况下,多次运行结果通常波动很小。如果发现结果波动很大,大概率是你的数据里簇的数量设置得不对,或者协方差类型选得不合适,这时候应该回去调整参数,而不是硬解。

5. 常见问题与实操避坑

聚类这块踩坑踩久了,我总结出几个经常遇到的问题,这里直接列成一张速查表,方便大家在实际使用的时候对照。

问题表现很可能是原因解决办法
GMM 聚类结果重叠严重分量数量 K 设置过多使用 BIC 或 AIC 选择 K,顺便观察聚类稳定性
GMM 训练不收敛或结果怪异特征未标准化 / 初始化不当先 StandardScaler,再用 KMeans 初始化
DBSCAN 噪声点过多eps 太小或者 min_samples 太大画 k-distance 图重新选 eps
DBSCAN 把多个簇连成一片eps 太大缩小 eps 范围,重新观察 k-distance 拐点
数据量太大时 GMM 算得很慢协方差矩阵用的是 full换成 diag 类型或先降维
簇形状是长条形、环形用 KMeans 或 GMM 都不理想改用 DBSCAN 或 OPTICS

在这些坑里,我个人觉得最值得提醒的两点是:第一,跑聚类前务必先做数据探索。先画图,看看分布形状,心里有数再选算法,这是最省时间的做法;第二,聚类永远别忘了业务解释。算法给出的标签如果没有业务含义,那再高的轮廓系数也没有意义。

5.1 高维数据的距离陷阱

在高维空间里,基于距离的算法(包括 DBSCAN)会遇到一个麻烦:随着维度增加,所有样本之间的距离趋向于相等,这就是所谓的"维度灾难"。这会直接导致 k-distance 图失去明显拐点,eps 变得很难选。

针对这个问题,常见的做法是先做 PCA 或 UMAP 降维,把数据压到 2 到 5 维之后再跑 DBSCAN,这样既能保留主要结构,也方便可视化验证。GMM 在高维下相对好一些,但如果维度太高,full 协方差矩阵的参数规模会爆炸式增长,这时候我一般会建议用 diag 或者先降维。

5.2 预测新样本的问题

还有一个很多人容易忽略的细节:训练完的 GMM 可以直接对新样本调用predict来分簇,因为它的本质是概率密度估计。但 sklearn 里的 DBSCAN 不支持对未见过的样本做预测(因为它的簇的身份来自训练数据中样本间的密度连通性)。如果你想对在线来的新样本打标签,一种办法是把训练好的 DBSCAN 拿来提取核心点的信息,或者干脆换用 HDBSCAN 这种自带预测能力的扩展版本。

这个差异在我曾经做实时用户分群时非常关键。当时数据每天都在更新,如果用 DBSCAN 就得每天全量重算,而在 GMM 里只需要每天更新一次模型,新样本过来直接算后验概率,效率高得多。

5.3 要不要考虑 HDBSCAN 和 OPTICS

既然提到了 DBSCAN 的扩展,这里顺便提一下 HDBSCAN 和 OPTICS。HDBSCAN 是 DBSCAN 的层次化版本,它不需要你指定一个固定的 eps,而是自动寻找密度不同的簇结构,适配那种簇与簇之间密度差异大的数据集。OPTICS 则是在 DBSCAN 基础上生成一个可达距离图,用来辅助选择 eps。

如果数据里不同簇的密度差异特别大,比如一个簇非常密,另一个簇非常稀疏,DBSCAN 用同一个 eps 会难以兼顾。这时候 HDBSCAN 往往表现更好,因为它能自适应局部密度。不过在项目里,HDBSCAN 的计算开销更大,数据量大的时候要谨慎使用。

6. 选型实践建议:从业务出发

讲到这儿,我知道很多人还是想知道一个直接的答案:一个项目来了,到底该用哪个?我只能说,没有绝对正确的答案,但有相对合理的选型路径。

如果数据量大(比如几十万行以上)、特征维度低、数据分布接近高斯,而且每个簇之间没有太多重叠,GMM 是一个不错的选择,因为它除了聚类之外还能给出概率。如果你的数据里有明显的噪声点、簇形状不规则,而且你不确定到底该分几类,DBSCAN 应该排在更前面。

遇到实在拿不准的情况,我的习惯是"双轨探索":先用 DBSCAN 的粗结果评估噪声比例和簇的大致形状,再聚焦到干净的样本上用 GMM 进行精细化聚类,最后用业务指标去校核两个结果里到底哪一个更能指导行动。

在聚类项目的落地上,我始终坚持一个原则:聚类只是手段,不是目的。算法的输出如果不能为后面的人工运营、产品决策或规则制定提供明确信息,那么无论算法多漂亮都是在自嗨。

这让我想起一次做城市交通热点识别的经历。当时车辆 GPS 轨迹数据量非常大,而且城市里不同区域的密度差异极大,市中心密集、郊区分散。一开始我直接套 GMM,结果市中心被分得乱七八糟,郊区又被合并在一起。后来改用 DBSCAN,配上经过调优的 eps 和 min_samples,效果立刻好了很多,城市热点区块的形状和真实商圈分布几乎吻合。这个项目让我对"密度聚类优先处理形状/噪声,概率聚类优先处理重叠/软归属"这句话有了更深的体验。

7. 我的工程经验总结

如果要把这一讲浓缩成几句话,我想说:GMM 和 DBSCAN 不是相互替代的关系,而是互补的工具。GMM 的强项在于它能输出概率、能适应椭圆形的簇,它的软聚类特性非常适合做后续的概率建模;DBSCAN 的强项在于它不受簇形状限制,不需要指定簇数量,而且能自动处理噪声点。两者结合使用,基本可以覆盖绝大多数聚类场景。

最后分享一个我自己的小习惯:无论用哪个聚类算法,我都会固定随机种子并且多次运行,确保结果稳定性后再把标签接入下游流程。因为在实际的广告投放、用户运营或者风控链路里,如果每周聚类结果都在抖动,那下游分析师和运营同事会非常痛苦。稳定性和可解释性,很多时候比模型的精度更重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询