通过降低数据准确性来聚类大数据?

数据挖掘 r 聚类 大数据
2022-03-09 07:10:23

我有 100 万行有 20 个属性来进行层次聚类。当我想dist()在 R 中建立这个数据的距离矩阵时,它说它需要 5 TB 内存。我有这些方法:

  1. 通过抽样减少行数
  2. 改变聚类方法
  3. ?

现在,您建议另一种方法吗?而且我有一个想法,我想如果我降低值的准确性然后进行“分组”,那么我可以删除重复的行并有一个新列,其中包含每行的重复数。是否有任何 R 包可以对这些数据进行层次聚类?

“分组依据”:计算重复行数并添加一列,说明该行在源中重复了多少次。

3个回答

您有 n=20000000 个数据点和 d=20 个属性。

方法一

层次凝聚聚类具有时间复杂度O(n^3) 和需要O(n^2)内存。因此对于大数据集(更不用说大数据)是不可行的

您可以做的是首先使用一些近线性时间聚类算法将您的数据聚类到 2000 个集群。例如,该算法可以是 K-Means。有关其时间复杂度,请参阅此 stackoverflow 答案这实际上是您讨论“降低准确性和组”的替代方案。然后将层次聚类应用于找到的 2000 个聚类。

方法2 使用专为大数据设计的算法。例如,Birch 算法

请参阅 Steve Mosher 解决此问题的博客文章:“Nick Stokes Distance code, now with Big Memory”

您在这里要求更多的想法,而不是具体的解决方案,对吧?

好吧,也许可以试试RWekakmeans 的实现,SimpleKMeans()它具有超参数,允许您在运行 KMeans 之前使用Canopy 算法隐式预处理数据。Canopy(与 Python 无关)可以以批处理或增量模式运行。

Weka 还内置了 Canopy Clusterer 的独立实现,您可以通过 Explorer GUI 使用它。但是,对于 RWeka,您必须使用RWeka::make_Weka_clusterer()调用实现 Canopy 的适当 Java 类的机制。因此,在 R 中,您不必将其包装在 SimpleKMeans() 中,然后使用RWeka::make_Weka_clusterer().

Canopy“旨在加速大型数据集上的集群操作”。据我了解 Wikipedia 文章,Canopy 还删除了数据集中的一些冗余,但以不同的方式,而不是按照您的建议构建权重。另请参阅stats.SE 的这个答案

如果您所有的属性都具有低基数(= 很少有唯一值),我会说只是采样(您的选项#1)。