有人能指出我可以聚类约1百万个对象的层次聚类工具(最好是在python中)吗?我尝试了hcluster
和Orange。
hcluster
遇到了18k对象的问题。 Orange能够在几秒钟内聚集18k个对象,但失败了100k对象(饱和内存并最终崩溃)。
我在Ubuntu 11.10上使用64位Xeon CPU(2.53GHz)和8GB RAM + 3GB交换。
答案 0 :(得分:15)
问题可能是他们会尝试计算完整的2D距离矩阵(大约8 GB,双精度),然后他们的算法将在O(n^3)
时间运行。
您应该认真考虑使用不同的群集算法。分层聚类很慢,结果通常都不令人信服。特别是对于数以百万计的物体,您不能只看树状图来选择合适的切割。
如果你真的想继续进行层次聚类,我相信ELKI(虽然Java)O(n^2)
实现了SLINK
。其中100万个物体应该快约100万倍。我不知道他们是否已经CLINK
。而且我不确定是否实际上有其他变体的子O(n^3)
算法,而不是单链接和完整链接。
考虑使用其他算法。例如,k-means与对象的数量非常吻合(通常它们也不是很好,除非你的数据非常干净和规则)。一旦您对参数有所了解,我认为DBSCAN
和OPTICS
相当不错。如果您的数据集是低维的,那么使用适当的索引结构可以很好地加速它们。如果您的查询时间为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