Data structures 质量阈值聚类算法的高效数据结构

Data structures 质量阈值聚类算法的高效数据结构,data-structures,language-agnostic,cluster-analysis,threshold,Data Structures,Language Agnostic,Cluster Analysis,Threshold,我正在尝试实现质量阈值聚类算法。其概要(摘自)如下所示: 初始化群集允许的阈值距离和最小群集大小 通过包括最近点、下一个最近点等,为每个数据点构建候选簇,直到簇的距离超过阈值 将具有最多点的候选簇保存为第一个真实簇,并删除簇中的所有点,以供进一步考虑 重复减少的点集,直到不再形成具有最小簇大小的簇 我一直在阅读一些最近邻搜索算法和空间分区数据结构,因为它们似乎是我需要的东西,但我无法确定使用哪一种,或者我是否应该看其他东西 出于教育目的,我想自己实现数据结构,我需要一个能够连续返回某个点的最近点

我正在尝试实现质量阈值聚类算法。其概要(摘自)如下所示:

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

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


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

    该算法听起来像的前身,众所周知,它可以很好地处理。当然,kd树也是一种选择。这两种树之间的主要区别在于R*-树是用于数据库的-它们非常支持在线插入和删除,并且是面向块的-而kd树更像是基于二进制拆分的内存中数据结构。R*-树执行再平衡,而kd树将慢慢变得不平衡,需要重建。 我发现R*树中的最近邻搜索比k-d树更容易理解,因为边界矩形非常直观

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


    有许多DBSCAN实现。Weka的那个特别糟糕,所以离它远点。fpc在R中的
    fpc
    实现是可以的,但是仍然可以快得多。似乎是唯一一个完全支持索引的,而且速度差异很大。通过使用此数据集上的索引,他们的群集速度提高了12倍,这使他们能够在50秒内群集,而不是603秒(无索引)。韦卡用了令人难以置信的37917秒,R fpc 4339。这与我的经验一致,Weka的速度非常慢,而R只在矢量化操作中表现出色,一旦R解释器必须工作,它就比任何本地语言都慢得多。但这是一个很好的例子,说明了当同一个算法由不同的人实现时,它的性能会有多大的不同。我本以为这是2x-5x,但很明显,实现相同算法的程序员之间的差异很容易达到50倍。

    虽然我得到的问题反馈非常有用,但他们都没有回答任何问题,所以我觉得最好不要接受任何东西。谢谢你的意见。我查看了您提供的wiki链接,经过一些修改,我想我可能可以使用它们。我以前也没有遇到过(虽然我看过R树),所以我会继续调查:)我特别担心k-d树的平衡问题,但是简单地将节点标记为已经访问过的节点是一个非常简单和好的主意。同样感谢您的实现,尽管我计划自己实现它,但在这样做的同时拥有一些可以依靠的东西总是很好的。