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-learn
s DBSCAN
是 O(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 可以很好地随对象的数量缩放(通常也不是很好,除非您的数据非常干净和规则)。我认为DBSCAN
和OPTICS
相当不错,只要您对参数有所了解。如果您的数据集是低维的,则可以使用适当的索引结构很好地加速它们。如果您的索引具有O(log n)
查询时间,那么它们应该在O(n log n)
中运行。这可以对大型数据集产生巨大的影响。我个人在 110k 图像数据集上使用 OPTICS
没有问题,所以我可以想象它在您的系统上扩展到 100 万。
【讨论】:
以上是关于100万个对象的层次聚类的主要内容,如果未能解决你的问题,请参考以下文章
聚类 - 4 - 层次聚类密度聚类(DBSCAN算法密度最大值聚类)