用于质量阈值聚类算法的高效数据结构

时间:2012-12-16 23:06:25

标签: data-structures language-agnostic cluster-analysis threshold

我正在尝试实施质量阈值聚类算法。它的轮廓(取自here)如下:

  1. 初始化群集允许的阈值距离和最小群集大小
  2. 通过包括最近点,下一个最近点等来为每个数据点构建候选群集,直到群集距离超过阈值
  3. 将点数最多的候选群集保存为第一个真正的群集,并从进一步的考虑中删除群集中的所有点
  4. 使用减少的点集重复,直到不再能够形成具有最小簇大小的簇
  5. 我一直在阅读一些最近邻搜索算法和空间分区数据结构,因为它们似乎是我需要的东西,但我无法确定使用哪一个或我是不是本来应该看别的东西。

    我想自己实现数据结构用于教育目的,我需要一个可以连续返回最近点的某个点。但是,由于我不知道我需要查询的次数(即直到超过阈值),我不能使用k近邻算法。我一直在寻找四叉树和k-d树。

    此外,由于算法不断构建新的候选群集,因此使用修改后的数据结构会很有趣,该数据结构使用缓存的信息来加速后续查询(但也考虑了点删除)。

1 个答案:

答案 0 :(得分:2)

这个算法听起来像是DBSCAN (Wikipedia)的前身,已知它与R*-Tree indexes (Wikipedia)非常吻合。但当然,kd树也是一种选择。这两者之间的主要区别在于R * -trees用于数据库使用 - 它们非常支持在线插入和删除,并且是面向块的 - 而kd-tree更多是基于二进制分割的内存数据结构。 R * - 树执行重新平衡,而kd树将慢慢变得不平衡,需要重建。 我发现R * -trees中的最近邻搜索比k-d-tree更容易理解,因为你有非常直观的边界矩形。

DBSCAN还会从进一步的考虑中“删除”点,但只需将它们标记为已分配。这样你就不需要更新索引;并且在开始时批量加载它就足够了。您也应该可以为QT执行此操作。因此,除非我弄错了,否则您可以通过运行DBSCAN来有效地获得QT群集,epsilon设置为QT群集和minPts=2(尽管人们更喜欢在正确的DBSCAN中使用更高的值)。

有很多DBSCAN实现。 Weka中的那个非常蹩脚,所以远离它。 R中的fpc实现没问题,但仍然可以快得多。 ELKI似乎是唯一一个拥有完整索引支持的人,速度差异很大。他们的Benchmark通过使用此数据集上的索引显示12倍的速度增益,允许它们在50秒内集群而不是603(没有索引)。 Weka花了不可思议的37917秒,R fpc 4339在那里。这符合我的经验,Weka的声誉非常缓慢,R只会在矢量化操作中蠢蠢欲动,一旦R解释器必须工作,它比任何原生的都慢得多。但它是一个很好的例子,说明同一算法在由不同的人实现时可以执行的差异。我原本预计这将是2x-5x,但显然差异可以很容易地从一个实现相同算法的程序员到另一个程序员的差异。

相关问题