algorithm - 快速 (< n^2) 聚类算法

标签 algorithm machine-learning cluster-analysis data-mining k-means

我有 100 万个 5 维点,我需要将它们分组为 k 个簇,其中 k << 100 万。在每个集群中,任何两个点都不应相距太远(例如,它们可以是具有指定半径的边界球体)。这意味着可能必须有许多大小为 1 的簇。

但是!我需要运行时间远低于 n^2。 n log n 左右应该没问题。我进行此聚类的原因是为了避免计算所有 n 个点的距离矩阵(这需要 n^2 时间或许多小时),而我只想计算聚类之间的距离。

我尝试了 pycluster k-means 算法,但很快意识到它太慢了。我还尝试了以下贪心方法:

  1. 在每个维度上将空间分成 20 block 。 (所以总共有 20^5 件)。我将根据它们的质心将簇存储在这些网格框中。

  2. 对于每个点,检索在 r(最大包围球半径)内的网格框。如果有一个足够接近的集群,则将其添加到该集群,否则创建一个新集群。

但是,这似乎给我提供了比我想要的更多的集群。我也实现了两次类似的方法,但他们给出了截然不同的答案。

有没有比 n^2 时间更快的聚类标准方法?概率算法还可以。

最佳答案

考虑近似最近邻 (ANN) 算法或局部敏感散列 (LSH)。它们不会直接解决聚类问题,但它们能够告诉您哪些点彼此“接近”。通过更改参数,您可以将 close 定义为尽可能接近。而且速度很快。

更准确地说,LSH 可以提供一个散列函数,h ,这样,对于两个点 xy和距离度量 d ,

d(x,y) <= R1  =>  P(h(x) = h(y)) >= P1
d(x,y) >= R2  =>  P(h(x) = h(y)) <= P2

哪里R1 < R2P1 > P2 .所以是的,这是概率性的。您可以对检索到的数据进行后处理以获得真正的聚类。

这里是关于 LSH 的信息包括 E2LSH manual . ANN 在精神上是相似的;大卫芒特有资料here ,或尝试 FLANN (具有 Matlab 和 Python 绑定(bind))。

关于algorithm - 快速 (< n^2) 聚类算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404081/

相关文章:

c++ - 调车场算法,有什么变化吗?

algorithm - 这两种 nloglog(n) 排序算法有什么区别? (Andersson et al., 1995 vs. Han, 2004)

algorithm - 3D随机生成行星

java - 大规模机器学习——Python 还是 Java?

machine-learning - 如何在天蓝色数据 block 中导出我的预测(数组)?

algorithm - k表示聚类算法

Java-ml 聚类距质心的距离

algorithm - 您如何找到最佳的堆栈移动集,以对*已知*列表进行排序?

machine-learning - 了解 scikit-learn GridSearchCV - 参数调整和平均性能指标

javascript - 客户端集群 : Could someone explain what this line does?