Много раз я видел функцию set.seed
в R, прежде чем запускать программу. Я знаю, что это в основном используется для генерации случайных чисел. Есть ли какая-то конкретная необходимость установить это?
Причины использования функции set.seed
Ответ 1
Потребность в возможном желании воспроизводимых результатов, которые могут возникнуть, например, при попытке отладки вашей программы или, конечно, от повторения того, что она делает:
Эти два результата мы "никогда" не воспроизводим, поскольку я просто попросил что-то "случайное":
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 называются генераторами псевдослучайных чисел, поскольку они на самом деле полностью алгоритмичны: при одном и том же семя вы получаете одну и ту же последовательность. И это функция, а не ошибка.
Ответ 2
Вы должны устанавливать семя каждый раз, когда хотите получить воспроизводимый случайный результат.
set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
Ответ 3
Просто добавьте некоторые дополнительные аспекты. Необходимость установки семени: в академическом мире, если кто-то утверждает, что его алгоритм достигает, скажем, 98,05% производительности в одном симуляции, другие должны иметь возможность воспроизвести его.
?set.seed
Пройдя через файл справки этой функции, это некоторые интересные факты:
(1) set.seed() возвращает NULL, невидимый
(2) "Первоначально нет семени, новый создается из текущего времени и идентификатора процесса, когда требуется один. Следовательно, по-разному сеансы будут давать разные результаты моделирования по умолчанию. Однако семя может быть восстановлен из предыдущей сессии, если восстановлено ранее сохраненное рабочее пространство". Вот почему вы хотели бы вызвать set.seed() с одинаковыми значениями целых чисел в следующий раз, когда вам нужна одна и та же последовательность случайной последовательности.
Ответ 4
Фиксация семени имеет важное значение, когда мы пытаемся оптимизировать функцию, которая включает в себя случайно сгенерированные числа (например, при оценке на основе моделирования). Говоря кратко, если мы не зафиксируем семя, изменение из-за рисования разных случайных чисел, скорее всего, приведет к сбою алгоритма оптимизации.
Предположим, что по какой-либо причине вы хотите оценить стандартное отклонение (sd) нормального распределения с нулевым нормальным распределением путем моделирования, учитывая образец. Этого можно добиться, выполнив численную оптимизацию вокруг шагов
- (Установка семени)
- Учитывая значение для 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)
Результирующие распределения оценок параметров:
- Гистограмма оценок параметров без фиксации семени
- Гистограмма оценок параметров, фиксирующих затравку
Когда мы фиксируем семя, числовой поиск заканчивается ближе к истинному значению параметра 2 намного чаще.
Ответ 5
в основном функция set.seed() поможет повторно использовать один и тот же набор случайных величин, которые нам понадобятся в будущем, чтобы снова снова оценить конкретную задачу с помощью тех же случайных varibales
нам просто нужно объявить его перед использованием любой функции генерации случайных чисел.