【问题标题】:DBSCAN: How to Cluster Large Dataset with One Huge ClusterDBSCAN:如何用一个巨大的集群对大型数据集进行集群
【发布时间】:2020-06-27 23:36:49
【问题描述】:

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

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

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

当您知道大多数数据都在一个以 (0.0,0.0) 为中心的集群中时,任何人都可以提供任何提示,无论我做得对还是有更好的方法来降低 DBSCAN 的复杂性?

【问题讨论】:

  • 你尝试过其他聚类方法吗?
  • 是的,我希望在同一数据集上比较 K-means、DBSCAN 和另一种算法。 DBSCAN 对我来说是一个高优先级,因为它已被证明对异常检测非常有效。

标签: machine-learning bigdata dbscan elki


【解决方案1】:
  1. 您是否在 ELKI 中添加了 index,并尝试了 parallel 版本?除了git版本,ELKI不会自动添加索引;即使这样微调问题的索引也会有所帮助。

  2. DBSCAN 不是异常检测的好方法 - 噪声与异常不同。我宁愿使用基于密度的异常检测。如果您知道自己只对前 10% 感兴趣,那么有些变体会更有效地跳过“清除内点”。

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

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

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

即使您拥有“大”数据,并且以从事“大数据”为荣,也始终从子样本开始。除非你能证明结果质量随着数据集大小而提高,否则不要费心扩展到大数据,除非你能证明价值,否则开销太高。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2016-06-28
    • 2020-02-22
    • 2019-08-06
    • 2011-11-19
    • 2014-06-03
    • 1970-01-01
    • 2015-11-21
    • 2023-03-23
    相关资源
    最近更新 更多