gpt4 book ai didi

r - 如何使用 foreach 和 doMC 包为随机模拟设置种子?

转载 作者:行者123 更新时间:2023-12-03 11:22:46 26 4
gpt4 key购买 nike

我需要做一些模拟,出于调试目的,我想使用 set.seed得到相同的结果。这是我正在尝试做的示例:

library(foreach)
library(doMC)
registerDoMC(2)

set.seed(123)
a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
set.seed(123)
b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}

对象 ab应该是相同的,即 sum(abs(a-b))应该为零,但事实并非如此。我做错了什么,还是我偶然发现了某些功能?

我可以使用 R 2.13 和 R 2.14 在两个不同的系统上重现这个

最佳答案

我的默认答案曾经是“那么不要那样做”(使用 foreach )作为 snow包为您做到这一点(可靠!)。

但正如@Spacedman 指出的那样,雷诺的新 doRNG如果您想继续使用 doFoo,这就是您要寻找的。/foreach家庭。

真正的关键是一个 clusterApply 风格的调用,用于在所有节点上设置种子。并以跨流协调的方式。哦,我有没有提到 snow作者:蒂尔尼、罗西尼、李和塞维奇科娃已经为你做这件事快十年了?

编辑:虽然你没有问 snow ,为了完整起见,这里是命令行中的一个示例:

edd@max:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) } )))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
edd@max:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) } )))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
edd@max:~$

编辑:为了完整起见,这里是您的示例以及 doRNG 文档中的内容
> library(foreach)
R> library(doMC)
Loading required package: multicore

Attaching package: ‘multicore’

The following object(s) are masked from ‘package:parallel’:

mclapply, mcparallel, pvec

R> registerDoMC(2)
R> library(doRNG)
R> set.seed(123)
R> a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> set.seed(123)
R> b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> identical(a,b)
[1] FALSE ## ie standard approach not reproducible
R>
R> seed <- doRNGseed()
R> a <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> doRNGseed(seed)
R> a1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> identical(a,a1) && identical(b,b1)
[1] TRUE ## all is well now with doRNGseed()
R>

关于r - 如何使用 foreach 和 doMC 包为随机模拟设置种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358098/

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