【问题标题】:Efficient data structure for quality threshold clustering algorithm质量阈值聚类算法的高效数据结构
【发布时间】:2012-12-04 02:07:24
【问题描述】:

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

  1. 初始化集群允许的阈值距离和最小集群大小
  2. 为每个数据点构建一个候选聚类,包括最近的点、下一个最近的点等,直到聚类的距离超过阈值
  3. 将点数最多的候选集群保存为第一个真正的集群,并删除集群中的所有点,不再考虑
  4. 重复使用减少的点集,直到不能再形成具有最小聚类大小的聚类

我一直在阅读一些最近邻搜索算法和空间分区数据结构,因为它们似乎是我需要的那种东西,但我无法确定使用哪一种,或者我是否应该寻找在别的事情上。

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

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

【问题讨论】:

  • 虽然到目前为止我收到的对问题的反馈非常有用,但他们都没有真正回答这些问题,所以我认为最好不要接受任何问题。

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


【解决方案1】:

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

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

周围有许多 DBSCAN 实现。 Weka中的那个特别糟糕,所以远离它。 R 中的fpc 实现还可以,但仍然可以更快。 ELKI 好像是唯一一个全索引支持的,速度差异很大。他们的Benchmark 通过在该数据集上使用索引显示了 12 倍的速度增益,允许他们在 50 秒内而不是 603 秒(没有索引)内进行聚类。 Weka 花了令人难以置信的 37917 秒,R fpc 4339 在那里。这与我的经验一致,Weka 以非常慢着称,而 R 只在矢量化操作方面表现出色,一旦 R 解释器必须工作,它比任何原生的都要慢得多。但这是一个很好的例子,说明当不同的人实现相同的算法时,它的表现会有多么不同。我原以为这是 2 到 5 倍,但显然,实现相同算法的一个程序员与另一个程序员之间的差异很容易达到 50 倍。

【讨论】:

  • 感谢您的意见。我查看了您提供的 wiki 链接,经过一些修改,我想我可以使用它们。我以前也没有遇到过(尽管我确实看过 R-trees),所以我会继续调查 :) 我特别担心 kd 树的平衡问题,但简单地将节点标记为已经访问过的是非常简单和好主意。也感谢您的实现,虽然我计划自己实现它,但这样做的时候有一些可以依靠的东西总是很好的。
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 2012-08-02
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2016-09-12
  • 2012-05-02
  • 2019-10-14
相关资源
最近更新 更多