r - 并行化列成对矩阵比较
问题描述
对于名为的给定矩阵db.mtx.rnk
,我正在计算列成对的肯德尔和斯皮尔曼相关性,并将结果保存到方阵中。问题是输入矩阵非常大(~5000x5000)并且成对组合的数量太高,需要很长时间才能执行。将时间减少一半的一种选择是只计算上三角形,我还没有实现它,但仍然会很慢。我想并行化以获得结果。有什么提示吗?
当前代码:
# -- get pairwise column combinations
pairwise.permuts <- t(expand.grid(1:ncol(db.mtx.rnk), 1:ncol(db.mtx.rnk)))
# -- iterate over two stats of interest
for(stat in c("kendall", "spearman")){
# -- kendall tau and spearman
stats.vec <- apply(pairwise.permuts, 2, function(x) cor(db.mtx.rnk[,x[1]], db.mtx.rnk[,x[2]], method = stat))
stats.mtx <- matrix(stats.vec, ncol = ncol(db.mtx.rnk))
colnames(stats.mtx) <- colnames(db.mtx.rnk)
rownames(stats.mtx) <- colnames(db.mtx.rnk)
}
谢谢
解决方案
如何在 R 中进行并行化有很多不同的可能性。一些选项是parallel
,foreach
和future
。给定您的代码,您必须对future
基础包进行最少的更改,future.apply
因为它提供了 function future_apply
。您必须使用plan(multiprocess)
来告诉future
它应该并行计算。multiprocess
根据您的操作系统使用不同的 R 会话或分叉。这导致代码(并且已经在我的机器上加速了一个玩具示例):
library(future.apply)
plan(multiprocess)
for(stat in c("kendall", "spearman")){
# -- kendall tau and spearman
stats.vec <- future_apply(pairwise.permuts, 2, function(x) cor(db.mtx.rnk[,x[1]], db.mtx.rnk[,x[2]], method = stat))
stats.mtx <- matrix(stats.vec, ncol = ncol(db.mtx.rnk))
colnames(stats.mtx) <- colnames(db.mtx.rnk)
rownames(stats.mtx) <- colnames(db.mtx.rnk)
}
推荐阅读
- python - seaborn 将我所有的变量标签保持在 X 刻度上
- powershell - 如何按字母顺序对页面进行排序
- php - 使用 Mysql 的错误日志持续时间
- amazon-web-services - AWS IoT 规则:获取控制数据包类型
- tensorflow - 如何保存和恢复 Keras LSTM 模型?
- php - Laravel 关系问题
- python - 大文件中每个人的唯一值总数
- dynamics-crm - 如何从查找字段 oncreate 中删除预填充?
- node.js - 有多少种协议类型,例如 http、sockets?
- javascript - 让我们使用 0 和 1 创建一个 RandomFunction