为 DBSCAN (R) 选择 eps 和 minpts?

Posted

技术标签:

【中文标题】为 DBSCAN (R) 选择 eps 和 minpts?【英文标题】:Choosing eps and minpts for DBSCAN (R)? 【发布时间】:2012-10-05 07:13:37 【问题描述】:

我一直在寻找这个问题的答案很长一段时间,所以我希望有人可以帮助我。我正在使用 R 中 fpc 库中的 dbscan。例如,我正在查看 USArrests 数据集,并在其上使用 dbscan,如下所示:

library(fpc)
ds <- dbscan(USArrests,eps=20)

在这种情况下,选择 eps 只是通过反复试验。但是我想知道是否有可用的函数或代码来自动选择最佳 eps/minpts。我知道有些书建议制作到最近邻居的第 k 个排序距离的图。即,x 轴表示“根据与第 k 个最近邻的距离排序的点”,y 轴表示“第 k 个最近邻距离”。

这种类型的绘图有助于为 eps 和 minpts 选择合适的值。我希望我已经提供了足够的信息来帮助我。我想张贴我的意思的图片,但我还是个新手,所以还不能张贴图片。

【问题讨论】:

【参考方案1】:

没有选择 minPts 的通用方法。这取决于想要找到什么。较低的 minPts 意味着它会从噪声中构建更多的集群,所以不要选择太小。

对于 epsilon,有多个方面。它再次归结为选择任何适用于 this 数据集和 this minPts 和 this 距离函数和 this 规范化.您可以尝试做一个 knn 距离直方图并在那里选择一个“膝盖”,但可能没有可见的一个或多个。

OPTICS 是不需要 epsilon 参数的 DBSCAN 的继承者(除了索引支持的性能原因,请参阅 Wikipedia)。它要好得多,但我认为在 R 中实现它很痛苦,因为它需要高级数据结构(理想情况下,用于加速的数据索引树和用于优先级队列的 可更新 堆),以及 R都是关于矩阵运算的。

天真地,可以将 OPTICS 想象为同时处理 Epsilon 的所有值,并将结果放入集群层次结构中。

但是,您需要检查的第一件事 - 几乎与您要使用的任何聚类算法无关 - 是确保您有一个有用的距离函数和适当的数据规范化。如果您的距离退化,no 聚类算法将起作用。

【讨论】:

如果在 R 中实现它比在其他语言中实现它要困难得多,我会感到惊讶(“R 是关于矩阵运算的”真的是完全错误的——data.frame,可能是最常用的R中的数据结构不是矩阵而是列表。)。出于性能原因,当它被实现时,它可能会在 Rcpp 中。 抱歉。在 Matlab 中,这些东西显然是一个非常大的痛苦。对于 R,“rann”包中存在一些索引。但我相信 fpc 不使用它,并且由于 R 没有“数据库查询”API,它无法自动连接模块。 在我的实验中,fpc DBSCAN 比其他实现慢了 10 倍。只有 Weka 更糟(又慢了 8 倍)。 R 中的性能是sensitive to implementation。我不否认该算法可能更难,但在实践中,像这样的通用算法往往被编写为库,然后被访问(LINPACK、GEOS 等)——这避免了跨许多语言的重复优化工作。 R 被设计为对应用统计从业者来说是合理的,并且对程序员来说是可扩展的。这种可扩展性的一部分意味着在有用的地方使用其他库和语言。 这几乎适用于任何语言......然而,R 包似乎大多是独立的并且交互很少。有时这也很好,如果您想到许多 Apache 项目带来的 .jar 混乱......【参考方案2】:

管理 DBSCAN 的 epsilon 参数的一种常见且流行的方法是计算数据集的 k 距离图。基本上,您计算每个数据点的 k 最近邻 (k-NN),以了解不同 k 的数据的密度分布。 KNN 很方便,因为它是一种非参数方法。一旦您选择了一个 minPTS(很大程度上取决于您的数据),您将 k 固定为该值。然后,您使用与具有低斜率的 k 距离图(对于您的固定 k)区域相对应的 k 距离作为 epsilon。

【讨论】:

这实际上只是原始 DBCAN 论文中讨论的方法。并且是 OP 所说的他已经听说过但想要其他建议的内容。 我看不出他在哪里说他不想要它。实际上,看起来他说的是相反的。 R 包 dbscan 有一个名为 kNNdistplot 的函数,它可以生成这种类型的图形。【参考方案3】:

查看此网页,第 5 部分:http://www.sthda.com/english/wiki/dbscan-density-based-clustering-for-discovering-clusters-in-large-datasets-with-noise-unsupervised-machine-learning

它提供了有关如何查找 epsilon 的详细说明。 MinPts ...不是那么多。

【讨论】:

我尝试了这种方法来找到“膝盖”,但是当我在给定 k=5 的情况下绘制我的数据时,它看起来好像没有“膝盖”。我试图增加 k 的值(从 5 到甚至 1000),但情节看起来完全一样。此外,该文件没有说明为什么膝盖对应于最佳 epsilon。 抱歉,之前的评论是附上截图链接的。 Inline Link【参考方案4】:

最小点数

正如Anony-Mousse 解释的那样,'低 minPts 意味着它将从噪声中构建更多集群,所以不要选择太小。'

minPts 最好由熟悉数据的领域专家设置。不幸的是,很多情况下我们不知道领域知识,尤其是在数据标准化之后。一种启发式方法是使用 ln(n),其中 n 是要聚类的点的总数。

epsilon

有几种方法可以确定:

1) k-距离图

在minPts = k的聚类中,我们期望核心点和边界点的k-距离在一定范围内,而噪声点可以有更大的k-距离,因此我们可以观察到拐点 k 距离图中的点。但是,有时可能没有明显的膝盖,或者可能有多个膝盖,这很难决定

2) DBSCAN 扩展,例如OPTICS

OPTICS 产生层次集群,我们可以通过视觉检查从层次集群中提取重要的平面集群,OPTICS 实现在 Python 模块pyclustering 中可用。 DBSCAN 和 OPTICS 的原作者之一也提出了一种自动提取扁平簇的方法,无需人工干预,更多信息可以阅读this paper。

3) 敏感性分析

基本上,我们希望选择一个能够聚集更多真正规则点(与其他点相似的点)的半径,同时检测出更多的噪声(离群点)。我们可以画出常规点的百分比(点属于一个簇)VS。 epsilon分析,我们将不同的epsilon值设置为x轴,将它们对应的规则点百分比设置为y轴,希望我们能发现规则点值百分比更大的段对 epsilon 值敏感,我们选择上界 epsilon 值作为我们的最优参数。

【讨论】:

“一种启发式方法是使用 ln(n),其中 n 是要聚类的点的总数。”您对此有引用吗? @MarkWhite 在ST-DBSCAN: An algorithm for clustering spatial–temporal dataSection 4.1中使用 原始 DBSCAN 论文建议将 minpts 基于数据维度 2*dim 而不是数据集大小 n。 first OPTICS 论文中自动提取聚类。 @NAGA 我不认为这样说有什么不对,即使领域知识也不是必须使用 DBSCAN,根据领域知识设置 minPts 几乎总是有益的。在没有领域知识的情况下,我们可以依赖其他一些启发式方法,如原始论文中所述。【参考方案5】:

有关选择参数的详细信息,请参阅下面第 4 页的论文。 11:

Schubert, E.、Sander, J.、Ester, M.、Kriegel, H. P. 和 Xu, X.(2017 年)。 DBSCAN 重新审视,重新审视:为什么以及如何(仍然)使用 DBSCAN。 ACM 数据库系统事务 (TODS), 42(3), 19.

对于二维数据:使用默认值 minPts=4(Ester 等人,1996 年) 对于超过 2 个维度:minPts=2*dim(Sander 等人,1998 年)

一旦您知道要选择哪个 MinPts,您就可以确定 Epsilon:

用 k=minPts 绘制 k 距离(Ester 等人,1996 年) 在图中找到“肘部”--> k 距离值就是您的 Epsilon 值。

【讨论】:

【参考方案6】:

如果你有资源,你还可以测试一堆epsilonminPts 值,看看有什么用。我使用expand.gridmapply 来做到这一点。

# Establish search parameters.
k <- c(25, 50, 100, 200, 500, 1000)
eps <- c(0.001, 0.01, 0.02, 0.05, 0.1, 0.2)

# Perform grid search.
grid <- expand.grid(k = k, eps = eps)

results <- mapply(grid$k, grid$eps, FUN = function(k, eps) 
  cluster <- dbscan(data, minPts = k, eps = eps)$cluster
  sum <- table(cluster)
  cat(c("k =", k, "; eps =", eps, ";", sum, "\n"))
)

【讨论】:

以上是关于为 DBSCAN (R) 选择 eps 和 minpts?的主要内容,如果未能解决你的问题,请参考以下文章

DBSCAN、python的参数eps

使用 python 和 DBSCAN 对高维数据进行聚类

ML: 聚类算法R包 - 密度聚类

如何在sklearn dbscan中使用多个内核?

使用 DBSCAN 无法正确分割图像

R中DBSCAN的聚类中心平均值?