Причини використання функції set.seed


185

Я багато разів бачив цю set.seedфункцію в R, перш ніж запускати програму. Я знаю, що в основному використовується для генерації випадкових чисел. Чи є певна потреба встановити це?


Відповіді:


264

Необхідність - це можливе прагнення до відтворюваних результатів, яке, наприклад, може виникнути від спроби налагодження вашої програми або, звичайно, від спроби повторити те, що вона робить:

Ці два результати ми "ніколи" не відтворимо, оскільки я просто попросив щось "випадкове":

R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"

Ці два, однак, ідентичні, тому що я встановив насіння :

R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> 

Про все це є велика література; Вікіпедія - хороший початок. По суті, ці RNG називаються псевдогенераторами випадкових чисел, оскільки вони насправді повністю алгоритмічні : даючи одне і те ж насіння, ви отримуєте ту саму послідовність. І це особливість, а не помилка.


5
Дякую Дірк, за такий приємний приклад .. Я прояснив це на 99%, але все-таки питання. 1. У своїй відповіді ви використовували set.seed з 42 в якості аргументу. Чи є пов’язана причина для вибору цього значення?
Виньєш

43
Для нормальної RNG пристойної якості значення не має значення. "42" - це посилання на відому книгу; інші користуються днем ​​народження або "123" або просто "1".
Дірк Еддельбуеттель

7
char2seedФункція в пакеті TeachingDemos дозволяє встановити початкове число (або вибрати насіння переходять в set.seed) на основі рядка символів. Наприклад, ви можете змусити учнів використовувати їх ім'я як насіння, тоді кожен студент має унікальний набір даних, але викладач також може створити однакові набори даних для оцінювання.
Грег Сног

8
Можна повторити один і той же код з різними насінням, поки ви не отримаєте "найкращий" результат (я це зробив для прикладів). Для захисту від звинувачень у цьому найкраще вибирати насіння, яке має певне значення, або завжди однакове насіння, або дату, або я використовую char2seedі прізвище принципового дослідника в проекті.
Грег Сніг

5
Значення насіння @DirkEddelbuettel може мати значення з не обчислювальних причин. У мого знайомого виникли проблеми з публікацією результатів на основі імітації, оскільки цей код розпочався set.seed(666)і рецензентам не сподобалося насіння Devils у коді ...
Тім

33

Ви повинні встановлювати насіння щоразу, коли хочете отримати відтворюваний випадковий результат.

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)

17

Просто додавання деяких аспектів додавання. Необхідність у налаштуванні насіння: Якщо в академічному світі можна стверджувати, що його алгоритм досягає, скажімо, 98,05% продуктивності в одному моделюванні, інші повинні мати можливість його відтворити.

?set.seed

Переглядаючи довідковий файл цієї функції, ось кілька цікавих фактів:

(1) set.seed () повертає NULL, невидимий

(2) "Спочатку немає насіння; створюється нове з поточного часу та ідентифікатора процесу, коли потрібен. Отже, різні сеанси дають різні результати моделювання за замовчуванням. Однак насіння може бути відновлено з попередній сеанс, якщо відновлена ​​раніше збережена робоча область. ", тому ви хочете викликати set.seed () з однаковими цілими значеннями наступного разу, коли ви захочете ту саму послідовність випадкової послідовності.


7

Виправлення насіння є надзвичайно важливим, коли ми намагаємось оптимізувати функцію, яка включає випадково генеровані числа (наприклад, в оцінці на основі моделювання). Якщо ми не виправляємо насіння, зміна, пов’язана з малюванням різних випадкових чисел, швидше за все, призведе до виходу з ладу алгоритму оптимізації.

Припустимо, що з якоїсь причини ви хочете оцінити стандартне відхилення (sd) нормального середнього нуля нормального розподілу за допомогою моделювання за даним зразком. Цього можна досягти, провівши чисельну оптимізацію навколо кроків

  1. (Встановлення насіння)
  2. Давши значення для sd, генеруйте нормально розподілені дані
  3. Оцініть ймовірність ваших даних з урахуванням імітованих розподілів

Наступні функції роблять це, один раз без кроку 1., включивши його:

# without fixing the seed
simllh <- function(sd, y, Ns){
  simdist <- density(rnorm(Ns, mean = 0, sd = sd))
  llh <- sapply(y, function(x){ simdist$y[which.min((x - simdist$x)^2)] })
  return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
  set.seed(48)
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}

Ми можемо перевірити відносну продуктивність двох функцій у виявленні справжнього значення параметра за допомогою короткого дослідження Монте-Карло:

N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for (i in 1:1000) {
  as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
  y <- rnorm(N, sd = sd) # generate the data
  est1[i] <- optim(1, simllh, y = y, Ns = 1000, lower = 0.01)$par
  est2[i] <- optim(1, simllh.fix.seed, y = y, Ns = 1000, lower = 0.01)$par
}
hist(est1)
hist(est2)

Отримані розподіли оцінок параметрів:

Гістограма оцінок параметрів без фіксації насіння Гістограма оцінок параметрів, що фіксують насіння

Коли ми фіксуємо насіння, числовий пошук набагато частіше закінчується близьким до істинного значення параметра.


6

В основному функція set.seed () допоможе повторно використовувати той самий набір випадкових змінних, який нам може знадобитися в майбутньому, щоб знову оцінити певну задачу ще раз з тими ж випадковими варіаціями

нам просто потрібно оголосити це, перш ніж використовувати функцію генерації випадкових чисел.


детальніше відповідь
Spry Techies
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.