gpt4 book ai didi

r - 拆分数据集并将子集并行传递给函数,然后重新组合结果

转载 作者:行者123 更新时间:2023-12-01 09:00:52 28 4
gpt4 key购买 nike

这是我尝试使用 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

最佳答案

在并行处理大型矩阵时,仅传递每个集群工作人员所需的数据可能非常重要。在 Linux 上直接或间接使用 mclapply 时,这不是问题。但在 Windows 上,输入数据是通过套接字连接发送到集群工作人员的,因此它可能非常重要。

对于这种情况,我使用 itertools 包中的 isplitCol 函数。它在矩阵的列 block 上创建一个迭代器。使用 chunks 参数,您可以拆分矩阵,以便每个集群工作人员获得一个子矩阵。

这是您的示例到 foreach 的翻译,它使用 isplitCol 将输入矩阵拆分为 7 个子矩阵,从而将发送给每个工作人员的数据减少了七倍与向每个 worker 自动导出 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)

关于r - 拆分数据集并将子集并行传递给函数,然后重新组合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17350867/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com