Причины использования функции set.seed

Много раз я видел функцию set.seed в R, прежде чем запускать программу. Я знаю, что это в основном используется для генерации случайных чисел. Есть ли какая-то конкретная необходимость установить это?

Ответ 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

нам просто нужно объявить его перед использованием любой функции генерации случайных чисел.