我正在聚集并使用相当小的矩阵(5000行乘200列)制作热图,但我发现使用R中的标准heatmap
类函数,它需要永远。例如:
data <- replicate(5000, rnorm(200))
aheatmap(data, dist="correlation")
(这是使用NMF包中的aheatmap
:http://cran.r-project.org/web/packages/NMF/index.html)
如果使用euclidean
而不是correlation
距离,结果会更快一些。有没有办法加快速度?
澄清我只对聚类列而不是行感兴趣所以我经常将aheatmap
参数传递给Rowv=FALSE
答案 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
似乎有一致的收益。
该功能似乎没有提供文档中的任何内容,使其更快,我自己没有使用功能/包的经验。