Відповіді:
Необхідність - це можливе прагнення до відтворюваних результатів, яке, наприклад, може виникнути від спроби налагодження вашої програми або, звичайно, від спроби повторити те, що вона робить:
Ці два результати ми "ніколи" не відтворимо, оскільки я просто попросив щось "випадкове":
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 називаються псевдогенераторами випадкових чисел, оскільки вони насправді повністю алгоритмічні : даючи одне і те ж насіння, ви отримуєте ту саму послідовність. І це особливість, а не помилка.
char2seed
Функція в пакеті TeachingDemos дозволяє встановити початкове число (або вибрати насіння переходять в set.seed
) на основі рядка символів. Наприклад, ви можете змусити учнів використовувати їх ім'я як насіння, тоді кожен студент має унікальний набір даних, але викладач також може створити однакові набори даних для оцінювання.
char2seed
і прізвище принципового дослідника в проекті.
set.seed(666)
і рецензентам не сподобалося насіння Devils у коді ...
Просто додавання деяких аспектів додавання. Необхідність у налаштуванні насіння: Якщо в академічному світі можна стверджувати, що його алгоритм досягає, скажімо, 98,05% продуктивності в одному моделюванні, інші повинні мати можливість його відтворити.
?set.seed
Переглядаючи довідковий файл цієї функції, ось кілька цікавих фактів:
(1) set.seed () повертає NULL, невидимий
(2) "Спочатку немає насіння; створюється нове з поточного часу та ідентифікатора процесу, коли потрібен. Отже, різні сеанси дають різні результати моделювання за замовчуванням. Однак насіння може бути відновлено з попередній сеанс, якщо відновлена раніше збережена робоча область. ", тому ви хочете викликати set.seed () з однаковими цілими значеннями наступного разу, коли ви захочете ту саму послідовність випадкової послідовності.
Виправлення насіння є надзвичайно важливим, коли ми намагаємось оптимізувати функцію, яка включає випадково генеровані числа (наприклад, в оцінці на основі моделювання). Якщо ми не виправляємо насіння, зміна, пов’язана з малюванням різних випадкових чисел, швидше за все, призведе до виходу з ладу алгоритму оптимізації.
Припустимо, що з якоїсь причини ви хочете оцінити стандартне відхилення (sd) нормального середнього нуля нормального розподілу за допомогою моделювання за даним зразком. Цього можна досягти, провівши чисельну оптимізацію навколо кроків
Наступні функції роблять це, один раз без кроку 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)
Отримані розподіли оцінок параметрів:
Коли ми фіксуємо насіння, числовий пошук набагато частіше закінчується близьким до істинного значення параметра.
В основному функція set.seed () допоможе повторно використовувати той самий набір випадкових змінних, який нам може знадобитися в майбутньому, щоб знову оцінити певну задачу ще раз з тими ж випадковими варіаціями
нам просто потрібно оголосити це, перш ніж використовувати функцію генерації випадкових чисел.