使用函数 DIST 时 R 中止110 GB 向量

问题描述

我需要在 R 中对具有 173000 行和 17 列的数据集运行分层聚类算法。 在数据集上运行函数 dist() 时,R 中止。我也用 Windows pc 试过,得到的错误消息是“无法分配大小为 110.5 Gb 的向量”。

我的 Mac 和我的 Windows 电脑有 4 GB 的内存。

有没有办法在 R 中仍然这样做?我知道分层算法对于大型数据集不是最好的,但它是大学作业所必需的。

谢谢

解决方法

该问题可以通过编写一个函数来计算数据集列之间的成对欧几里得距离来解决,下面假设为表格形式。对于其他距离,可以写出类似的函数。

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)
,

首先,您最好提供一个 reprex(可重现的示例)。确保你以后再做。

说到这个问题,你可以使用sample_frac函数(如果我没记错的话,这是一个来自tidyverse包的函数)。例如,sample_frac(your_data,.5) 将采样 50% 的数据帧。它将减少要聚类的数据大小,并且对您的笔记本电脑来说更容易。

另一种方法是扩展 memory.limit(size = n),其中 n 是一个以兆字节为单位的数字。