R中的dist()函数:向量大小限制

时间:2013-10-17 20:06:35

标签: r cluster-analysis

我试图在一些特征(基因)上绘制一些样本(其中40个)的层次聚类,我有一个500k行和41列的大表(第一个是名称),当我尝试

d<-dist(as.matrix(file),method="euclidean")

我收到了这个错误

Error: cannot allocate vector of size 1101.1 Gb

我如何解决这个限制?我用谷歌搜索了它并且看到了R中的ff包但我不太明白这是否可以解决我的问题。

谢谢!

3 个答案:

答案 0 :(得分:4)

一般来说,层次聚类不是处理非常大的数据集的最佳方法。

然而,在你的情况下,存在不同的问题。如果要集群样本结构,那么您的数据是错误的。观察结果应表示为行和基因表达(或您拥有的任何类型的数据)作为列。

让我们假设你有这样的数据:

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)

注意

您应该记住,当您处理高维数据时,欧几里德距离可能会产生误导。

答案 1 :(得分:3)

处理大型数据集时,R不是最佳选择。

R中的大多数方法似乎都是通过计算全距离矩阵来实现的,该矩阵本身需要O(n^2)内存和运行时。 基于矩阵的实现不能很好地扩展到大数据,除非矩阵稀疏(每个定义的距离矩阵不是)。

我不知道你是否意识到1101.1 Gb是1太字节。我认为你没有那么多内存,你可能没有时间等待来计算这个矩阵。

例如ELKI对于群集来说功能更强大,因为您可以启用索引结构来加速许多算法。这样可以节省内存(通常用于线性内存使用;用于存储集群分配)和运行时(通常低至O(n log n),每个对象只有O(log n)个操作。)

但当然,它也因算法而异。例如,K-means只需要点到平均距离,不需要(也不能使用)O(n^2)距离矩阵。

所以最后:我不认为R的内存限制是你的实际问题。您要使用的方法无法缩放。

答案 2 :(得分:0)

我只是遇到一个相关问题,但是行数较少(16列大约10万行)。
RAM大小是限制因素。
为了限制对内存空间的需求,我使用了来自2个不同软件包的2个不同函数。 通过parallelDist函数parDist(),您可以非常快速地获取距离。它当然会在此过程中使用RAM,但似乎产生的dist对象占用的内存更少(不知道为什么)。
然后,我使用了 hclust()函数,但来自包fastcluster 。 fastcluster在处理如此大量的数据时实际上并不是那么快,但是看起来它使用的内存少于默认的hclust()。
希望这对发现此主题的任何人有用。