【问题标题】:distance matrix calculation and hierarchical clustering for large number of observations and dimensions in RR中大量观察和维度的距离矩阵计算和层次聚类
【发布时间】:2013-08-31 05:56:25
【问题描述】:

我正在尝试对R 中的大型数据集进行层次聚类,例如> 30,000 行(观察)和 > 30 列(变量)。使用fastcluster 包,集群本身可以很快进行。但是,由于差异计算,我遇到了内存和速度问题。这只适用于最多 10,000-15,000 个观测值。对于更高的数字,R 通常会崩溃。即使计算了相异矩阵,我在之后尝试聚类时也会收到memory overflow 错误。有没有办法克服这些问题?

我在具有 4 GB RAM 的 64 位计算机上使用 Windows 7 Professional。

MWE:

library('fastcluster')
df <- as.data.frame(matrix(rnorm(900000), nrow = 30000))
dissim <- dist(df)
hr <- hclust(dissim)

【问题讨论】:

  • 我系统上的最大 RAM 使用量为 10 GB,但尝试绘制结果终止了 R 会话。

标签: r performance cluster-analysis hierarchical-clustering


【解决方案1】:

30000 个元素的相异矩阵将是 30000×30000,双精度浮点占用 8 个字节,大约 8 gigs。在这种规模的情况下,您不能在 4 GB 的 RAM 中使用这些库。

【讨论】:

  • 见 mcastillion 的帖子,fastcluster 无需一次性使用整个 N^2 矩阵即可工作。如果更多的集群包允许一个选项来调用向量的 dist(x,y) 函数而不是要求它被存储,那就太好了。
【解决方案2】:

如果您使用的是fastcluster,则可以使用hclust.vector 函数,它比hclust 占用的内存要少得多(有关详细信息,请参阅fastcluster paper)。

【讨论】:

    【解决方案3】:

    您应该考虑近似解决方案和更好的聚类算法。

    很容易看出任何基于距离矩阵的东西至少需要O(n^2) 内存和运行时间。事实上,有些链接准则只能在O(n^3)时间计算。

    100.000 个双精度实例需要约 80 GB RAM,通过利用对称性,您可以将其减半;但可能算法需要复制并添加一些暂存空间......

    有了 4 GB,其中可能至少有 1 个已经用完,看到这个限制下降到大约 20000 个实体,我并不感到惊讶。 8 字节 * 20.000 * 20.000 * 2 个副本为 6.4 GB

    要对大型数据集进行聚类,请寻找不需要距离矩阵的算法。为了获得良好的性能,请使用具有线性运行时的东西(例如,k-means,而您也可以只使用数据样本,线性缩放)或使用索引结构来加速它。例如,DBSCAN 将在一个好的实现中(我知道的 R fpc 实现不是好)能够利用索引结构,然后在 O(n log n) 时间运行。如果实施得当,在这种大小的数据上,这将很容易快 100 倍。

    【讨论】:

    • 我尝试了不同的k-means 实现,但结果并不令人满意。我正在寻找一种无监督的算法,所以我不想提前设置集群的数量。在BioconductorflowMeans 中有一个快速实现,但我对结果不满意。你能推荐另一个吗?此外,我看不出如何使用非分层算法绘制出像样的热图。顺便说一句,对数据进行采样也会导致不同的热图。 DBSCAN 是一个很好的观点,谢谢。但是,我在 R 而不是 fpc 中没有找到任何其他 DBSCAN 实现。
    • R 的可扩展性或速度不是很好,就此而言。如果您确实需要大数据,请尝试查看其他应用程序。我在 ELKI 中使用了 100k 个元素,总运行时间不到一分钟。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2016-08-21
      • 2014-10-24
      • 2015-09-14
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多