这是 DBSCAN 算法的预期行为吗(两个相同的数据样本不适合同一个集群)?

Is this the expected behavior of the DBSCAN algorithm (two identical data samples not fitting in the same cluster)?

请原谅缺少正式条款,我最近才接触 ML。

出于学习目的,我决定尝试 Ruby 实施 DBSCAN 算法 (https://github.com/matiasinsaurralde/dbscan)。

基于 https://github.com/matiasinsaurralde/dbscan/blob/master/examples/simple.rb 中的简单示例,我创建了一个包含 1000 个数组的数组,每个数组包含两个随机值,"x" 和 "y"(一个二维点)并且我已经然后将这些数据提供给 DBSCAN 算法(根据需要调整 "epsilon" 和 "minimum distance")。

data_sample = Array.new(1000) { Array.new(2) { rand(100).round } }

dbscan = DBSCAN( data_sample, :epsilon => 3, :min_points => 2, :distance => :euclidean_distance )

然后我将生成的数据(集群和非集群数据)导出到 Excel,以绘制集群和非集群数据的图表。

这是我想出的:

黑点是非聚类数据。

现在有一件事我不确定:对于一些彼此非常接近的点,或者共享相同精确 x 和 y 的点,我看到的是这两个点之一,而不是将其变成另一个点的正常集群被归类为非集群。

看看点 47、74:属于簇的点是 "above" 另一个未簇的点。这也发生在 14、87、77,64、20,61 和许多其他地方(对于某些点,它们具有相同的 x 和 y)。

正如我所说,我仍在处理这个问题,所以有人可以告诉我是否可以解释我所看到的情况吗?它与 DBSCAN 算法的内部工作原理有关吗?或者更可能是算法的实现出现了一些错误?还是我做出了一些错误的假设?

我希望这就是您需要知道的全部内容,但如果您需要更多信息,请尽管询问。

所以里面其实有两个问题:

  1. 有没有可能两个非常接近的点有不同的标记?特别是 "unclustered"?

是的,这是可能的并且直接来自 dbscan 方法,该方法特别需要一个点具有给定数量的近邻,以便被分类为 "unclustered"[=10 以外的任何东西=]

  1. 有没有可能完全相同位置的两个点最终在两个不同的集群中?

不,这是不可能的。因此,要么这些点不相同(也许您正在比较它们的舍入表示,而不是真实的?),要么实现有错误。

DBSCAN 标记点的一些相当明显的特性:

  1. 核心 点的邻居必须与核心点具有相同的标签(先前已分配给不同集群的边界点除外)
  2. 非核心点的相邻点可以有不同的标签,但至少有一个必须是同一标签的核心点
  3. 噪声点的邻居不能是核心点

数字2表示非核心点可以任意接近,并且有不同的标签。

从技术上讲,同一坐标的两个点甚至有可能具有不同的标签,如果这些点都是边界点。但这可能只会发生在并行变体中,我不知道这实际上会发生在哪里。通常的 DBSCAN 算法会给它们分配相同的标签(在第一次发现时)。

边界点会导致奇怪的异常,这就是作者在 HDBSCAN* 中删除它们的原因。