我正在尝试实施质量阈值聚类算法。它的轮廓(取自here)如下:
我一直在阅读一些最近邻搜索算法和空间分区数据结构,因为它们似乎是我需要的东西,但我无法确定使用哪一个或我是不是本来应该看别的东西。
我想自己实现数据结构用于教育目的,我需要一个可以连续返回最近点的某个点。但是,由于我不知道我需要查询的次数(即直到超过阈值),我不能使用k近邻算法。我一直在寻找四叉树和k-d树。
此外,由于算法不断构建新的候选群集,因此使用修改后的数据结构会很有趣,该数据结构使用缓存的信息来加速后续查询(但也考虑了点删除)。
答案 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,但显然差异可以很容易地从一个实现相同算法的程序员到另一个程序员的差异。