2011-12-02 12 views
18

मुझे कुछ सिमुलेशन करने और डीबगिंग उद्देश्यों के लिए एक ही परिणाम प्राप्त करने के लिए set.seed का उपयोग करना है। यहाँ मैं क्या करना है कोशिश कर रहा हूँ के उदाहरण है:foreach और doMC संकुल के साथ यादृच्छिक सिमुलेशन के लिए बीज कैसे सेट करें?

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)} 

ऑब्जेक्ट्स a और b समान होना चाहिए, जैसे कि sum(abs(a-b)) शून्य होना चाहिए, लेकिन यह मामला नहीं है। मैं कुछ गलत कर रहा हूं, या क्या मैंने कुछ फीचर पर ठोकर खाई है?

मैं आर 2.13 और आर 2.14

उत्तर

17

मेरे डिफ़ॉल्ट हुआ करता था जवाब (foreach का प्रयोग करके) "अच्छी तरह से तो ऐसा नहीं है" snow पैकेज करता है के रूप में (भरोसेमंद!) तुम्हारे लिए।

लेकिन जैसा कि @ स्पेसमैन बताते हैं, रेनाड का नया doRNG वह है जिसे आप doFoo/foreach परिवार के साथ रहना चाहते हैं।

वास्तविक कुंजी हालांकि क्लस्टर है, सभी नोड्स पर बीज सेट करने के लिए ऐप्ली-स्टाइल कॉल। और एक फैशन में जो धाराओं में समन्वित है। ओह, और मैंने उल्लेख किया कि snow टियरनी, रॉसीनी, ली और सेविसिकोवा द्वारा लगभग एक दशक तक यह आपके लिए किया जा रहा है?

संपादित करें: और जब तुम यहाँ संपूर्णता के लिए के बारे में snow, नहीं पूछा कमांड लाइन से एक उदाहरण है:

[email protected]:~$ 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 
[email protected]:~$ 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 
[email protected]:~$ 

संपादित करें: और संपूर्णता के लिए, यहाँ संयुक्त अपने उदाहरण है क्या और अधिक जटिल छोरों के लिए के लिए 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> 
+0

बर्फ के साथ उदाहरण के लिए धन्यवाद। मैं आर में समांतर प्रोग्रामिंग की जटिलताओं में अच्छी तरह से परिचित नहीं हूं, इसलिए मैंने गैर-समानांतर कोड से समानांतर तक अपने दर्द रहित संक्रमण के लिए 'foreach' का उपयोग शुरू किया। मुझे पता था कि मुझे कुछ याद आ रहा था। – mpiktas

+2

ठीक है, यही कारण है कि हम सभी साल पहले बर्फ से शुरू हुए क्योंकि मानक * लागू() कार्यों से समानांतर में संक्रमण आसान था :) –

4

साथ दो अलग सिस्टम पर इस पुन: पेश करने में सक्षम हूँ doRNG पैकेज आप के लिए किसी भी उपयोग है? मुझे लगता है आपकी समस्या को दो धागे की वजह से है दोनों यादृच्छिक बीज वेक्टर splatting:

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

+0

धन्यवाद, मैं वास्तव में दोनों को जवाब के रूप में चिह्नित करना होगा, लेकिन डिर्क का जवाब अधिक व्यापक था। मैंने फिर भी आपका जवाब उभारा है, क्योंकि इसमें मेरी समस्या को हल करने के लिए पर्याप्त जानकारी है। – mpiktas

2

डॉक्स में है के साथ, आप 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 
6

का उपयोग करना set.seed(123, kind = "L'Ecuyer-CMRG") भी काम कर देता है और एक अतिरिक्त पैकेज की आवश्यकता नहीं है: आपके उत्तर के लिए

set.seed(123, kind = "L'Ecuyer-CMRG") 
a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)} 
b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)} 
identical(a,b) 
# TRUE 
+0

यह उत्तर Dirk Eddulbuettel के उत्तर से कहीं अधिक सरल है। क्या इसमें कोई कमी है? –

संबंधित मुद्दे