hem*_*ema 3 parallel-processing foreach r na random-forest
以下是我使用foreach包尝试做的事情.我有600行和58000列的数据集,有很多缺失值.
我们需要使用名为"missForest"的包来计算缺失值,其中它不是并行的,需要花费很多时间来立即运行这些数据.所以,我想把数据分成7个数据集(我有7个核心),行数(行数)和col(标记)数不同.然后使用%dopar%
将数据集并行传递给missForest?
我不知道如何将数据划分为更小的数据集,并将这些数据集传递给missForest,然后重新组合输出!
如果你能告诉我怎么样,我会非常感激吗?
这是一个小例子,形式BLR包,演示了我的问题:
library(BLR)
library(missForest)
data(wheat)
X2<- prodNA(X, 0.1)
dim(X2) ## i need to divide X2 to several 7 data frames (ii)
X3<- missForest(X2)
X3$Ximp ## combine ii data frames
Run Code Online (Sandbox Code Playgroud)
在并行处理大型矩阵时,只传递每个集群工作人员所需的数据非常重要.在Linux上使用时mclapply
,直接或间接使用时不会出现问题doParallel
.但是在Windows上,输入数据通过套接字连接发送给集群工作者,因此它非常重要.
对于这样的情况,我使用包中的isplitCol
函数itertools
.它在矩阵的列块上创建迭代器.使用该chunks
参数,您可以拆分矩阵,以便每个集群工作者只获得一个子矩阵.
下面是您的示例的转换foreach
,用于isplitCol
将输入矩阵拆分为7个子矩阵,从而将发送给每个工作者的数据减少7倍,与自动导出X2
到每个工作者相比:
library(doParallel)
library(itertools)
library(BLR)
library(missForest)
ncores <- 7
cl <- makePSOCKcluster(ncores)
registerDoParallel(cl)
data(wheat)
X2 <- prodNA(X, 0.1)
X3 <- foreach(m=isplitCols(X2, chunks=ncores), .combine='cbind',
.packages='missForest') %dopar% {
missForest(m)$ximp
}
print(X3)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3997 次 |
最近记录: |