R中大量观测和维度的距离矩阵计算和层次聚类

时间:2013-08-28 08:41:23

标签: r performance cluster-analysis hierarchical-clustering

我正在尝试对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)

4 个答案:

答案 0 :(得分:2)

如果您使用fastcluster,则可以使用hclust.vector功能,该功能的内存密集程度远远低于hclust(有关详情,请参阅fastcluster paper )。

答案 1 :(得分:1)

答案 2 :(得分:1)

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

很容易看出基于距离矩阵的任何内容至少需要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倍。

答案 3 :(得分:0)

30000个元素的相异矩阵为30000×30000,双精度浮点占用8个字节,大约8个演出。您不能像这样使用4 GB的RAM来使用这些库。