2013-02-25 2 views
3

Я выполнял несколько параллельных симуляций в R, и я заметил, что семя не изменяется при использовании «L'Ecuyer-CMRG» rng. Я читал книгу «Параллельный R», а опция mc.set.seed = TRUE должна давать каждому работнику новое семя каждый раз, когда вызывается mclapply().R не сбрасывает семя при использовании RNG «L'Ecuyer-CMRG»?

Вот мой код:

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 

EDIT: То же самое происходит и на моем рабочем столе и на моем ноутбуке (как Ubuntu 12.04 LTS).

+0

Вы находитесь в Windows или UNIX? похоже, что этот параметр игнорируется в Windows. – agstudy

+0

работает отлично для меня на Mac с пакетом 'multicore'. – Arun

+0

Это работает для меня в Windows 7 и R-2.15-2. Я получаю разные значения каждый раз. – Andrie

ответ

2

Мне кажется, что если вы хотите гарантировать, что последующие вызовы mclapply в сеансе R получают разные случайные числа, вам нужно либо вызвать set.seed с другим значением, удалить глобальную переменную ".Random.seed »или сгенерировать по крайней мере одно случайное число в этом сеансе R перед повторным вызовом mclapply.

Причина такого поведения заключается в том, что mclapply (в отличие от mcparallel, например) вызывает mc.reset.stream внутренне. Это сбрасывает семя, которое спрятано в «параллельном» пакете, на значение «.Random.seed», поэтому, если «.Random.seed» не изменилось, когда mclapply снова вызвано, рабочие, запущенные mclapply, получат такие же случайные числа, как и ранее.

Обратите внимание, что это не относится к функциям, таким как clusterApply и parLapply, поскольку они используют постоянных работников и, следовательно, продолжают рисовать случайные числа из потока RNG. Но новые рабочие раздваиваются каждый раз, когда вызывается mclapply, по-видимому, намного сложнее иметь такой тип поведения.

Вот пример установки семян для различных значений для того, чтобы получить различные случайные числа, используя mclapply:

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»:

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") 
mclapply(1:2, function(i) rnorm(2)) 
rnorm(1) 
mclapply(1:2, function(i) rnorm(2)) 

Я не уверен, что это лучший подход, но это может зависеть от того, что вы пытаетесь сделать.

Хотя кажется, что просто вызов mclapply несколько раз без изменения «.Random.seed» приводит к воспроизводимым результатам, я не знаю, гарантировано ли это. Чтобы гарантировать воспроизводимые результаты, я думаю, вам нужно позвонить 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

Спасибо за ваш ответ Стив! (Не могу проголосовать, потому что у меня недостаточно репутации). Странно, что такое поведение должно происходить на разных платформах, но похоже, что код в моем вопросе дал разные результаты для каждого вызова mclapply() на @Andrie Windows 7. –

+0

Странно, потому что я не думал, что Параметр обеспечивает функцию mclapply в Windows. –

+0

Это тоже так!Помимо RNG, в моей системе происходит много других странных событий: 1) если я использую mclapply и загружается пакет «debug», часто R замораживается, и я должен убить его и его работников. 2) опции (cores = detectCores()) просто не работает, и мне всегда приходится выбирать количество ядер вручную в mclapply. –