在大型数据集上进行聚类

时间:2011-03-29 11:44:34

标签: matlab cluster-analysis large-data

我正在尝试群集一个大型(Gigabyte)数据集。为了进行聚类,您需要每个点到每个其他点的距离,因此最终得到一个N ^ 2大小的距离矩阵,在我的数据集的情况下,它将是exabytes的数量级。 Matlab中的Pdist当然会立即爆炸;)

有没有办法首先对大数据的子集进行聚类,然后可能会对类似的聚类进行一些合并?

我不知道这是否有帮助,但数据是固定长度的二进制字符串,所以我使用汉明距离计算距离(距离= string1 XOR string2)。

3 个答案:

答案 0 :(得分:1)

来自的漂亮方法的简化版本 Tabei等人,Single versus Multiple Sorting in All Pairs Similarity Search, 对于与Hammingdist 1的配对说:

  • 对前32位的所有位串进行排序
  • 查看前32位完全相同的字符串块; 这些块会相对较小
  • 为Hammingdist(左32)0 + Hammingdist(其余)< = 1。
  • 中的每一个块。

这错过了例如附近有32/128对 汉明(左三)1 +汉明(其余)0。 如果你真的想要这些,重复上面的“第一个32” - > “最后32”。

该方法可以扩展。 以汉密斯顿< = 2对4个32位字为例;不匹配必须像其中一个一样分裂 2000 0200 0020 0002 1100 1010 1001 0110 0101 0011, 所以其中2个单词必须为0,排序相同。

(顺便说一句,sketchsort-0.0.7.ta​​r是99%src / boost /,build /,.svn /。)

答案 1 :(得分:0)

如何先排序?也许类似于修改后的合并排序?您可以从数据集的块开始,这些数据集将适合内存以执行正常排序。

一旦获得了排序数据,就可以迭代完成聚类。也许保持N-1点的滚动质心并与正在读入的第N个点进行比较。然后根据您的群集距离阈值,您可以将其汇集到当前群集中或开始新群集。

答案 2 :(得分:0)

LMW-tree项目中的EM-tree和K-tree算法可以聚集这个大而大的问题。我们最近的结果是将7.33亿个网页集中到600,000个集群中。还有EM-tree的流式变体,其中数据集在每次迭代时从磁盘流式传输。

此外,这些算法可以直接对位串进行聚类,其中所有簇代表和数据点都是位串,并且使用的相似性度量是汉明距离。这最小化了找到的每个簇内的汉明距离。