DBSCAN:如何用一个巨大的集群对大型数据集进行集群

DBSCAN: How to Cluster Large Dataset with One Huge Cluster

我正在尝试对 1800 万个数据点执行 DBSCAN,到目前为止只有 2D,但希望能达到 6D。在那么多点上,我一直无法找到 运行 DBSCAN 的方法。我得到的最接近的是 ELKI 的 100 万,这花了一个小时。我以前用过 Spark,但不幸的是它没有可用的 DBSCAN。

因此,我的第一个问题是是否有人可以推荐一种 运行宁 DBSCAN 对这么多数据的方法,可能是以分布式方式?

接下来,我的数据的性质是 ~85% 位于一个巨大的集群中(异常检测)。我能够想出的允许我处理更多数据的唯一技术是用一个数据点替换那个巨大集群的一大块,这样它仍然可以到达它的所有邻居(删除的块小于epsilon).

当您知道大多数数据位于以 (0.0,0.0) 为中心的一个集群中时,任何人都可以提供任何提示,无论我这样做是否正确,或者是否有更好的方法来降低 DBSCAN 的复杂性?

  1. 你有没有给ELKI加一个index,试过parallel版本?除了 git 版本,ELKI 不会自动添加索引;即使这样,针对问题微调索引也会有所帮助。

  2. DBSCAN 不是异常检测的好方法 - 噪声与异常不同。我宁愿使用基于密度的异常检测。如果您知道自己只对前 10% 感兴趣,则有些变体会尝试更有效地跳过 "clear inliers"。

  3. 如果你已经知道大部分数据都在一个巨大的集群中,为什么不直接对那个大集群建模,然后将其删除/将其替换为更小的近似值。

  4. 子样本。使用整个数据通常几乎没有任何好处。即使(或特别是)如果您对 "noise" 对象感兴趣,也有一种简单的策略,可以将数据随机拆分为例如 32 个子集,然后对这些子集中的每一个进行聚类,然后将结果连接回来。这 32 个部分可以普通 在单独的内核或计算机上并行处理;但是因为潜在的问题本质上是二次的,所以加速将在 32 到 32*32=1024 之间的任何地方。 这尤其适用于 DBSCAN:更大的数据通常意味着您还想使用更大的 minPts。但是结果与具有较小 minPts 的子样本相差不大。

但无论如何:在扩展到更大的数据之前,确保你的方法解决了你的问题,并且是解决这个问题的最聪明的方法。异常检测的聚类就像试图用锤子将螺丝钉砸入墙壁。它有效,但也许使用钉子而不是螺丝是更好的方法。

即使您有 "big" 数据,并且以做 "big data" 为荣,也始终从子样本开始。除非你能证明结果质量随着数据集大小的增加而增加,否则不要费心扩展到大数据,除非你能证明 value.

否则开销太高