加快集群/热图创建速度

时间:2013-08-31 18:47:20

标签: r optimization plot statistics cluster-analysis

我正在聚集并使用相当小的矩阵(5000行乘200列)制作热图,但我发现使用R中的标准heatmap类函数,它需要永远。例如:

data <- replicate(5000, rnorm(200)) 
aheatmap(data, dist="correlation")

(这是使用NMF包中的aheatmaphttp://cran.r-project.org/web/packages/NMF/index.html

如果使用euclidean而不是correlation距离,结果会更快一些。有没有办法加快速度?

澄清我只对聚类列而不是行感兴趣所以我经常将aheatmap参数传递给Rowv=FALSE

2 个答案:

答案 0 :(得分:1)

你的问题是,你在dist进行的比较远比你可能怀疑的要多得多。您正在计算 5000 选择2,而不是 200 选择2个比较。也许这不是你想要的,但它在代码中这样做。

正如@Roland所指出的那样,大部分时间花费在dist上,这进一步说明了这就是问题所在。这是我机器上的一个示例:

data <- replicate(1500, rnorm(200)) 
system.time(aheatmap(data, dist="correlation"))
   user  system elapsed 
  27.69    0.64   28.33 
system.time(dist(1 - cor(data))) # A line that is in aheatmap
   user  system elapsed 
  21.26    0.02   21.28 

dist函数在R中使用C函数实现,因此您可以期望它快速。

运行cor(data)时,它将为您提供5000x5000矩阵(或在我较小的测试用例中为1500x1500),然后由dist使用。这意味着我的计算机正在计算

choose(1500,2) / 21
[1] 53535.71
我认为,每秒大约有53535.71次比较,这是非常快的。除非减少比较次数,否则你不会有太大的差别。


如果您想停止计算5000列的群集,可以将NA传递给Colv参数,如?aheatmap中所述。

aheatmap(data,distfun="correlation",Rowv=NA) # No clustering on rows.
aheatmap(data,distfun="correlation",Colv=NA) # No clustering on columns.

值得注意的是,传递FALSE仍然会计算树形图(慢速部分),但它不会显示它,而NA甚至不会计算树形图。

答案 1 :(得分:0)

你可以做的一件简单的事情(至少就随机数据而言)是切换列和行:

data <- replicate(200, rnorm(2000)) 
system.time(aheatmap(data, dist="euclidean",Colv=F))
user 15.048 sys  0.028 elapsed 15.370 

data <- replicate(2000, rnorm(200)) 
system.time(aheatmap(data, dist="euclidean",Rowv=F))
user 19.508 sys  0.164 elapsed 22.043

似乎有一致的收益。

该功能似乎没有提供文档中的任何内容,使其更快,我自己没有使用功能/包的经验。