25

いくつかのシミュレーションを実行する必要があり、デバッグの目的で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))必要があります。つまり、ゼロである必要がありますが、そうではありません。私は何か間違ったことをしていますか、それともいくつかの機能に遭遇しましたか?

これは、R2.13とR2.14の2つの異なるシステムで再現できます。

4

4 に答える 4

20

私のデフォルトの答えは、snowパッケージが(確実に!)あなたに代わってこれを行うので、「それではそれをしないでください」(foreachを使用)でした。

しかし、@ Spacedmanが指摘しているように、Renaudの新しいdoRNGdoFooは、 / foreachファミリーにとどまりたい場合に探しているものです。

ただし、実際の鍵は、すべてのノードにシードを設定するためのclusterApplyスタイルの呼び出しです。そして、ストリーム間で調整された方法で。ああ、そして私はティアニー、ロッシーニ、リー、セビコバによるがほぼ10年間あなたのためにこれをやってきたと言いましたか?

編集:そして、あなたはについて尋ねなかったが、完全を期すために、ここにコマンドラインからの例があります:

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> 
于 2011-12-02T15:34:45.367 に答える
5

doRNG パッケージは役に立ちますか? あなたの問題は、ランダムシードベクトルを両方ともスプラッティングする2つのスレッドが原因であると思われます:

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/doRNG/index.html

于 2011-12-02T15:30:43.267 に答える
3

より複雑なループの場合、 for ループに set.seed() を含める必要がある場合があります。

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

set.seed(123)
a <- foreach(i=1:2,.combine=cbind) %dopar% {
  create_something <- c(1, 2, 3)
  rnorm(5)
}
set.seed(123)
b <- foreach(i=1:2,.combine=cbind) %dopar% {
  create_something  <- c(4, 5, 6)
  rnorm(5)
}
identical(a, b)
# FALSE

a <- foreach(i=1:2,.combine=cbind) %dopar% {
  create_something  <- c(1, 2, 3)
  set.seed(123)
  rnorm(5)
}
b <- foreach(i=1:2,.combine=cbind) %dopar% {
  create_something  <- c(4, 5, 6)
  set.seed(123)
  rnorm(5)
}
identical(a, b)
# TRUE
于 2016-12-12T21:05:52.627 に答える