100万个对象的分层聚类

时间:2012-02-06 07:40:25

标签: python machine-learning cluster-analysis data-mining hierarchical-clustering

有人能指出我可以聚类约1百万个对象的层次聚类工具(最好是在python中)吗?我尝试了hclusterOrange

hcluster遇到了18k对象的问题。 Orange能够在几秒钟内聚集18k个对象,但失败了100k对象(饱和内存并最终崩溃)。

我在Ubuntu 11.10上使用64位Xeon CPU(2.53GHz)和8GB RAM + 3GB交换。

2 个答案:

答案 0 :(得分:15)

问题可能是他们会尝试计算完整的2D距离矩阵(大约8 GB,双精度),然后他们的算法将在O(n^3)时间运行。

您应该认真考虑使用不同的群集算法。分层聚类很慢,结果通常都不令人信服。特别是对于数以百万计的物体,您不能只看树状图来选择合适的切割。

如果你真的想继续进行层次聚类,我相信ELKI(虽然Java)O(n^2)实现了SLINK。其中100万个物体应该快约100万倍。我不知道他们是否已经CLINK。而且我不确定是否实际上有其他变体的子O(n^3)算法,而不是单链接和完整链接。

考虑使用其他算法。例如,k-means与对象的数量非常吻合(通常它们也不是很好,除非你的数据非常干净和规则)。一旦您对参数有所了解,我认为DBSCANOPTICS相当不错。如果您的数据集是低维的,那么使用适当的索引结构可以很好地加速它们。如果您的查询时间为O(n log n),那么它们应该在O(log n)中运行。这可以为大型数据集带来巨大变化。我亲自在没有问题的110k图像数据集上使用OPTICS,所以我可以想象它在你的系统上可以很好地扩展到100万。

答案 1 :(得分:10)

要击败O(n ^ 2),你必须首先减少你的1M分(文件) 例如每堆1000个,每个1000个,或者100个,每个10个,或者...... 两种可能的方法:

  • 从15k点构建一个分层树,然后逐个添加其余的树: 时间〜1M * treedepth

  • 首先构建100或1000个扁平簇, 然后构建100或1000个集群中心的分层树。

这些中的任何一个如何运作取决于批判性 关于目标树的大小和形状 - 多少层,有多少叶? 你在用什么软件, 你需要多少小时/天来进行聚类?

对于扁平集群方法, K-d_tree 在2d,3d,20d甚至128d的点上工作正常 - 不是你的情况。 我几乎不知道聚类文本; Locality-sensitive_hashing

看看scikit-learn clustering - 它有几种方法,包括DBSCAN。

补充:另见
google-all-pairs-similarity-search “用于在稀疏矢量数据中找到所有类似矢量对的算法”,Beyardo等。 2007年
SO hierarchical-clusterization-heuristics