1

我正在用一个相当小的矩阵(5000 行 x 200 列)进行聚类并制作热图,但我发现使用heatmapR 中的标准函数,它需要很长时间。例子:

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

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

如果使用euclidean而不是correlation距离,结果似乎要快一些。有没有办法加快这个速度?

为了澄清我只对聚集列而不是行感兴趣,所以我经常传递aheatmap参数Rowv=FALSE

4

2 回答 2

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 列的聚类,可以传递NAColv参数,如?aheatmap.

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

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

于 2013-09-01T02:38:21.997 回答
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

似乎有一个一致的收益。

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

于 2013-08-31T19:14:38.307 回答