我试图在某些特征(基因)上绘制一些样本(其中 40 个)的层次聚类,我有一个有 500k 行和 41 列(第一个是名称)的大表,当我尝试
d<-dist(as.matrix(file),method="euclidean")
我收到了这个错误
Error: cannot allocate vector of size 1101.1 Gb
我怎样才能绕过这个限制?我用谷歌搜索并找到了 R 中的 ff 包,但我不太明白这是否可以解决我的问题。
谢谢!
我试图在某些特征(基因)上绘制一些样本(其中 40 个)的层次聚类,我有一个有 500k 行和 41 列(第一个是名称)的大表,当我尝试
d<-dist(as.matrix(file),method="euclidean")
我收到了这个错误
Error: cannot allocate vector of size 1101.1 Gb
我怎样才能绕过这个限制?我用谷歌搜索并找到了 R 中的 ff 包,但我不太明白这是否可以解决我的问题。
谢谢!
一般来说,层次聚类并不是处理非常大的数据集的最佳方法。
但是,在您的情况下,存在不同的问题。如果你想对样本数据进行聚类,那么你的数据结构是错误的。观察应该表示为行,基因表达(或您拥有的任何类型的数据)表示为列。
假设您有这样的数据:
data <- as.data.frame(matrix(rnorm(n=500000*40), ncol=40))
你想做的是:
# Create transposed data matrix
data.matrix.t <- t(as.matrix(data))
# Create distance matrix
dists <- dist(data.matrix.t)
# Clustering
hcl <- hclust(dists)
# Plot
plot(hcl)
笔记
您应该记住,在处理高维数据时,欧几里得距离可能会产生误导。
在处理大型数据集时,R 不是最佳选择。
R 中的大多数方法似乎是通过计算全距离矩阵来实现的,这本质上需要O(n^2)
内存和运行时间。基于矩阵的实现不能很好地扩展到大数据,除非矩阵是稀疏的(每个定义的距离矩阵不是)。
我不知道您是否意识到这1101.1 Gb
是 1 TB。我认为您没有那么多 RAM,而且您可能也没有时间等待计算这个矩阵。
例如, ELKI的集群功能要强大得多,因为您可以启用索引结构来加速许多算法。这节省了内存(通常降低到线性内存使用;用于存储集群分配)和运行时(通常降低到每个对象O(n log n)
一个操作)。O(log n)
但当然,它也因算法而异。例如,K-means 只需要点到均值的距离,不需要(也不能使用)O(n^2)
距离矩阵。
所以最后:我不认为 R 的内存限制是你的实际问题。您要使用的方法无法扩展。
我只是遇到了一个相关的问题,但行数较少(16 列大约 10 万行)。
RAM 大小是限制因素。
为了限制对内存空间的需求,我使用了来自 2 个不同包的 2 个不同功能。
从parallelDist 函数parDist()可以让您非常快速地获得距离。它当然在此过程中使用 RAM,但似乎生成的 dist 对象占用的内存更少(不知道为什么)。
然后我使用了 hclust() 函数,但来自包 fastcluster。fastcluster 在如此大量的数据上实际上并没有那么快,但似乎它使用的内存比默认的 hclust() 少。
希望这对找到此主题的任何人都有用。