我正在尝试对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)
答案 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来使用这些库。