100万个对象的层次聚类

Posted

技术标签:

【中文标题】100万个对象的层次聚类【英文标题】:Hierarchical clustering of 1 million objects 【发布时间】:2012-02-27 17:48:29 【问题描述】:

谁能给我指出一个可以聚类约 100 万个对象的层次聚类工具(最好在 python 中)?我试过hcluster 和Orange。

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

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

【问题讨论】:

你在 2d, 3d, 10d, 128d 中的分数是多少? @Denis 我不明白你的意思。因此,限制似乎源于这样一个事实,即 1M 对象的 nxn 距离矩阵无法放入内存中,并且我上面提到的每个聚类库(橙色和 scipy)都将内存中的距离矩阵作为输入(这不是可以作为 1M 对象的输入...) 点/对象是简单的文本文件,我试图根据它们包含的文本进行聚类......如果这是 2d 还是什么,你能解释一下吗?谢谢。 @user940154 2d 或 nd 的概念是您在哪个特征维度上操作?因此,如果您附加到每个单词“长度”和“起始字母”特征,那将是 2d 特征空间。高维和稀疏数据需要特殊的数据结构来进行高效的聚类。 【参考方案1】:

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

从 15k 点构建一个层次树,然后将其余的逐一添加: 时间 ~ 1M * 树深度

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

这两种方法的效果如何取决于关键 关于目标树的大小和形状—— 多少级,多少片叶子? 你用的是什么软件, 您需要多少小时/天进行聚类?

对于扁平集群方法, K-d_trees 对于 2d、3d、20d 甚至 128d 的点都可以正常工作——不是你的情况。 我对聚类文本几乎一无所知。 Locality-sensitive_hashing?

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

添加:另见google-all-pairs-similarity-search “在稀疏向量数据中查找所有相似向量对的算法”,Beyardo 等人。 2007SO hierarchical-clusterization-heuristics

【讨论】:

我认为在层次聚类方面没有通用的方法可以击败O(n^2)。您可以针对单链接的特定情况做一些事情(请参阅我的回复),当然您也可以使用 other 算法(例如DBSCAN)。无论如何,对于这种大数据而言,这比层次聚类要明智得多。请注意,scikit-learns DBSCANO(n^2),因为 AFAIK 不使用索引。 On O(n^2):如果你接受更高的错误率,你可以采样(我的第一个小建议),或者 LSH。有很多 papers on fast clustering 其中一些是只写的。关于层次聚类,我同意,但如果 OP 能说出他或她想要多大的树,以及为什么,那就太好了。【参考方案2】:

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

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

如果你真的想继续层次聚类,我相信ELKI(虽然是Java)有一个O(n^2) 实现SLINK。 100 万个对象的速度应该大约是 100 万倍。我不知道他们是否也有CLINK。而且我不确定是否真的有任何 sub-O(n^3) 算法用于除单链接和完整链接之外的其他变体。

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

【讨论】:

以上是关于100万个对象的层次聚类的主要内容,如果未能解决你的问题,请参考以下文章

Python scipy/numpy中相关性的层次聚类?

聚类 - 4 - 层次聚类密度聚类(DBSCAN算法密度最大值聚类)

机器学习——层次聚类算法

Python机器学习——Agglomerative层次聚类

看完这篇文章,包你懂得如何用Python实现聚类算法的层次算法!

具有自定义距离的层次聚类