我需要在一个有173000行和17列的数据集上运行R中的分层聚类算法。在数据集上运行dist()函数时,R将中止。我也在Windows pc上尝试过,得到的错误信息是“无法分配大小为110.5 Gb的向量”。
我的Mac和Windows pc有4 GB的RAM。
在R中有没有办法做到这一点?我知道分层算法对于大型数据集并不是最好的,但它是大学作业所必需的。
谢谢
发布于 2021-04-19 16:38:40
这个问题可以通过编写一个函数来计算数据集的列之间的成对欧几里得距离来解决,下面假设是表格形式的。对于其他距离,可以编写类似的函数。
dist2 <- function(X){
cmb <- combn(seq_len(ncol(X)), 2)
d <- matrix(NA_real_, nrow = ncol(X), ncol = ncol(X))
if(!is.null(colnames(X)))
dimnames(d) <- list(colnames(X), colnames(X))
for(i in seq_len(ncol(cmb))){
ix <- cmb[1, i]
iy <- cmb[2, i]
res <- sqrt(sum((X[, ix] - X[, iy])^2))
d[ix, iy] <- d[iy, ix] <- res
diag(d) <- 0
}
d
}现在使用问题中维度的data.frame测试函数。
set.seed(2021)
m <- replicate(17, rnorm(173000))
m <- as.data.frame(m)
dist2(m)发布于 2021-04-19 16:00:00
首先也是最重要的,如果你能提供一个reprex (可重现的例子),那就太好了。请确保您稍后会这样做。
说到这个问题,你可以使用sample_frac函数(如果我没记错的话,这是一个来自tidyverse包的函数)。例如,sample_frac(your_data, .5)将对50%的数据帧进行采样。它将减少要群集的数据的大小,并使您的笔记本电脑更容易。
另一种方法是扩展memory.limit(size = n),其中n是以in为单位的数字。
https://stackoverflow.com/questions/67157945
复制相似问题