2013-02-25 3 views
3

R에서 일부 병렬 시뮬레이션을 수행했으며 "L' Ecuyer-CMRG"rng를 사용할 때 시드가 변경되지 않습니다. 나는 책 "Parallel R"을 읽었고 mc.set.seed = TRUE 옵션은 mclapply()가 호출 될 때마다 각 작업자에게 새로운 시드를 제공해야합니다."L' Ecuyer-CMRG"RNG를 사용할 때 R이 시드를 재설정하지 않습니까?

library(parallel) 
RNGkind("L'Ecuyer-CMRG") 

mclapply(1:2, function(n) rnorm(n), mc.set.seed = TRUE) 
[[1]] 
[1] -0.7125037 

[[2]] 
[1] -0.9013552 0.3445190 

mclapply(1:2, function(n) rnorm(n), mc.set.seed = TRUE) 
[[1]] 
[1] -0.7125037 

[[2]] 
[1] -0.9013552 0.3445190 

편집 :

여기 내 코드는 같은 일이 내 바탕 화면에 내 노트북 ​​(모두 우분투 12.04 LTS)에 모두 발생합니다.

+0

Windows 또는 UNIX에 있습니다. 이 옵션은 Windows에서 무시 됨처럼 보입니다. – agstudy

+0

은'multicore' 패키지로 맥에서 잘 작동합니다. – Arun

+0

이것은 Windows 7 및 R-2.15-2에서 저에게 적합합니다. 나는 매번 다른 값을 얻는다. – Andrie

답변

2

R 세션에서 mclapply를 연속해서 호출 할 때 다른 난수를 얻게하려면 set.seed를 다른 값으로 호출하거나 전역 변수 ".Random.seed"를 제거해야합니다. ", 또는 mclapply를 다시 호출하기 전에 해당 R 세션에서 적어도 하나의 난수를 생성하십시오.

이 동작의 이유는 mclapply (예 : mcparallel과 달리)가 mc.reset.stream을 내부적으로 호출하기 때문입니다. 이렇게하면 "병렬"패키지에 숨겨진 시드가 ".Random.seed"값으로 재설정되므로 mclapply가 다시 호출 될 때 ".Random.seed"가 변경되지 않으면 mclapply에 의해 시작된 작업자가 이전에했던 것과 같은 난수.

clusterApply 및 parLapply와 같은 함수는 영구적 인 작업자를 사용하므로 RNG 스트림에서 임의의 숫자를 계속 그리기 때문에이 경우에는 해당되지 않습니다. 그러나 mclapply가 호출 될 때마다 새 작업자가 분기되며 아마도 이러한 유형의 동작을 갖는 것이 훨씬 더 어려워 질 것입니다.

RNGkind("L'Ecuyer-CMRG") 
mclapply(1:2, function(i) rnorm(2)) 
rm(.Random.seed) 
mclapply(1:2, function(i) rnorm(2)) 

: 여기

RNGkind("L'Ecuyer-CMRG") 
set.seed(100) 
mclapply(1:2, function(i) rnorm(2)) 
set.seed(101) 
mclapply(1:2, function(i) rnorm(2)) 

는 ".Random.seed"제거의 예 : 여기

는 mclapply 사용하여 서로 다른 난수를 얻기 위해 다른 값으로 종자를 설정하는 예이다 다음은 마스터에서 임의의 숫자를 생성하는 예입니다.

RNGkind("L'Ecuyer-CMRG") 
mclapply(1:2, function(i) rnorm(2)) 
rnorm(1) 
mclapply(1:2, function(i) rnorm(2)) 

어떤 방법이 최선의 방법인지는 모르겠지만, 당신이하려는 일에 달려 있습니다.

단순히 ".Random.seed"를 변경하지 않고 mclapply를 여러 번 호출하면 재현 가능한 결과가 발생하지만, 이것이 보장되는지는 알 수 없습니다. 재현 가능한 결과를 보장하기 위해 set.seed를 호출해야한다고 생각합니다.

RNGkind("L'Ecuyer-CMRG") 
set.seed(1234) 
mclapply(1:2, function(i) rnorm(2)) 
set.seed(1234) 
mclapply(1:2, function(i) rnorm(2)) 
+0

답변 해 주셔서 감사합니다. Steve! (충분한 평판이 없기 때문에 투표 할 수 없습니다.) 이상하게 보이는 것은 이런 종류의 동작이 다른 플랫폼에서 일어나야한다는 것입니다. 제 질문의 코드가 @Andrie Windows 7에서 각 mclapply() 호출마다 다른 결과를 얻은 것처럼 보입니다. –

+0

생각하지 않았기 때문에 이상합니다 parallel은 Windows에서 mclapply 함수를 제공합니다. –

+0

그게 사실이에요!RNG을 제외하고, 내 시스템에는 다른 많은 이상한 일들이 계속 발생합니다 : 1) mclapply를 사용하고 패키지 "debug"가 자주로드되면 R이 멈추고 그것과 그 작업자를 죽여야합니다 2) options (cores = detectCores())는 작동하지 않으며 mclapply에서 수동으로 코어 수를 선택해야합니다. –