在大型数据集上进行聚类
Posted
技术标签:
【中文标题】在大型数据集上进行聚类【英文标题】:Clustering on a large dataset 【发布时间】:2011-07-25 05:23:24 【问题描述】:我正在尝试对大型(千兆字节)数据集进行聚类。为了进行聚类,您需要每个点到每个其他点的距离,因此您最终会得到一个 N^2 大小的距离矩阵,在我的数据集的情况下,它的数量级为艾字节。当然,Matlab 中的 Pdist 会立即爆炸 ;)
有没有办法先对大数据的子集进行聚类,然后再对相似的聚类进行一些合并?
我不知道这是否有帮助,但数据是固定长度的二进制字符串,所以我使用汉明距离 (Distance=string1 XOR string2) 计算它们的距离。
【问题讨论】:
你的位串有多长? 128 位、160 位、256 位……它们是加密哈希。我试图将它设置得足够通用,以便我可以为不同的人做。是否有任何依赖于长度的技巧? 几个月前我也有类似的问题。 ***.com/questions/4153981/…不知道这个解决方案对你有用吗? @Jie,我的实验方向完全不同,但我会试一试,谢谢你的想法。 并非所有聚类算法都需要计算所有 n^2 距离。例如,谱聚类方法建立在相似关系的传递特性之上,以允许使用非常稀疏的距离/亲和矩阵进行聚类(实际上只计算了所有 n^2 距离的一小部分)。如果这种方法听起来也适用于您的情况,我很乐意提供更多详细信息。 【参考方案1】:LMW-tree 项目中的 EM-tree 和 K-tree 算法可以对越来越大的问题进行聚类。我们最近的结果是将 7.33 亿个网页聚集成 600,000 个集群。还有一个 EM 树的流式变体,其中数据集在每次迭代时从磁盘流式传输。
此外,这些算法可以直接对位串进行聚类,其中所有聚类代表和数据点都是位串,并且使用的相似性度量是汉明距离。这最小化了找到的每个集群内的汉明距离。
【讨论】:
【参考方案2】:nice 方法的简化版本 塔贝等人,Single versus Multiple Sorting in All Pairs Similarity Search, 说与 Hammingdist 1 配对:
对前 32 位的所有位串进行排序 查看前 32 位都相同的字符串块; 这些块将相对较小 为 Hammingdist(left 32) 0 + Hammingdist(rest )这错过了例如附近有 32/128 对 Hammingdist(左 32)1 + Hammingdist(其余)0。 如果您真的想要这些,请使用“前 32”->“后 32”重复上述操作。
该方法可以扩展。 以 4 个 32 位字的 Hammingdist
(顺便说一句,sketchsort-0.0.7.tar 是 99 % src/boost/, build/, .svn/ 。)
【讨论】:
这听起来很有潜力,我会尝试并反馈,谢谢。 马尔辛,让我知道。为了赏金,我可以拼凑 C++,它在给定的 wordnos 上执行快速 std::sort,但不知道如何将其连接到 Matlab。【参考方案3】:先对它们进行排序怎么样?也许类似于修改后的合并排序?您可以从适合内存以执行正常排序的数据集块开始。
一旦您有了排序的数据,就可以迭代地进行聚类。也许保留 N-1 个点的滚动质心并与正在读入的第 N 个点进行比较。然后根据您的集群距离阈值,您可以将其汇集到当前集群中或开始一个新的集群。
【讨论】:
我试过排序,效果很好,但它只适用于从第一位开始的模式。如果您的模式从中间某处开始并且前面有随机位,那么排序根本没有帮助。这就是为什么我宁愿使用汉明距离。我正在考虑将字符串分成 4 个不同的块,并对它们进行排序,但是你会遇到一个问题,即模式不是完全在块边界上开始的,所以你没有捕捉到所有可能的模式。 问题中的那一点信息会有所帮助:)。你不能根据汉明距离而不是词法对它们进行排序吗? 我可以,但要做到这一点,我首先必须创建一个巨大的汉明距离矩阵,这正是我一直试图避免的事情。 如何根据与任意点的距离进行 bin 排序?以上是关于在大型数据集上进行聚类的主要内容,如果未能解决你的问题,请参考以下文章