我试图在某些特征(基因)上绘制一些样本(其中40个)的层次聚类,并且我有一个500k行和41列的大表(第一个是名称),当我试图R中的dist()函数:矢量大小限制
d<-dist(as.matrix(file),method="euclidean")
我得到这个错误
Error: cannot allocate vector of size 1101.1 Gb
我怎样才能解决这个限制?我搜索了它并发现了R中的ff包,但我不太明白这是否能解决我的问题。
谢谢!
我试图在某些特征(基因)上绘制一些样本(其中40个)的层次聚类,并且我有一个500k行和41列的大表(第一个是名称),当我试图R中的dist()函数:矢量大小限制
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中的大多数方法似乎都是通过计算全距离矩阵来实现的,该矩阵固有地需要内存和运行时。 基于矩阵的实现不能很好地扩展到大数据,除非矩阵是稀疏(每个定义的距离矩阵不是)。
我不知道你是否意识到1101.1 Gb
是1太字节。我认为你没有那么多的RAM,并且你可能没有时间去等待来计算这个矩阵。
例如ELKI对群集功能更强大,因为您可以启用索引结构来加速许多算法。这样既可以节省内存(通常降低到线性内存使用率;用于存储集群分配)和运行时间(通常降至O(n log n)
,每个对象一个O(log n)
操作)。
但当然,它也因算法而异。例如,只需要点到平均距离的K均值不需要(也不能使用)距离矩阵。
所以最后:我不认为R的内存限制是你的实际的问题。您要使用的方法不会缩放。
您将需要探索其他方法。也许删除这个问题并在CrossValidated上提出一个问题。com –
也许有人会在这里纠正我的算法,但我相信你会谈论PB级内存,以便在内存中保存一个距离矩阵的副本。 – joran
您正在创建一个大小为500k x 500k的对角矩阵。你知道你在做什么吗?为什么不使用其他聚类技术(例如,来自包流?) – jwijffels