【问题标题】:Speeding up clustering/heatmap creation加速集群/热图创建
【发布时间】:2013-09-04 06:56:37
【问题描述】:

我正在对一个相当小的矩阵(5000 行 x 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

【问题讨论】:

  • 如果您分析aheatmap,您会发现大部分时间都花在grid.Call.graphicsdist。我会考虑在绘图之前聚合数据的方法。输出看起来不需要热图中的这种高分辨率。
  • @Roland:我认为 dist 需要计算 200 选择 2 次来计算所有对...不知道如何避免这种情况,但我不明白为什么 R 中计算相关性如此缓慢

标签: r optimization plot statistics cluster-analysis


【解决方案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 甚至不会计算树状图。

【讨论】:

  • 既然我只想对列进行聚类,我怎样才能让它至少只做 200 个选择 2 个计算?没有必要做 5000 选择 2,因为我没有对行进行聚类
  • 您有 5000 列。如果要对列进行聚类,则需要 5000 次选择 2 比较。但是,请参阅我的更新以关闭行或列树状图。
【解决方案2】:

您可以做的一件简单的事情是(至少在随机数据方面)是切换列和行:

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

似乎有一致的收益。

该函数似乎没有在文档中提供任何关于使其更快的内容,而且我自己也没有使用该函数/包的经验。

【讨论】:

  • 我不确定如果你只对列进行聚类并告诉热图忽略行是否有好处;那么订单总是〜200而不是5000。而且这种收益是微不足道的......我不明白为什么这需要超过一两分钟,但这里需要15-20分钟(!)。
  • @user248237dfsf 我认为两者之间的差异最小。在某些情况下,它是一半的时间。也许是代码写得不好,我不知道。出于某种原因,它似乎为我绘制了两次,这可能是减速的一部分。另外,我忽略了它来告诉一个维度,就像你建议的那样?
猜你喜欢
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多