Powody korzystania z zestawu.funkcja nasion

Wiele razy widziałem set.seed funkcję w R, Przed uruchomieniem programu. Wiem, że służy do generowania liczb losowych. Czy jest jakaś konkretna potrzeba, aby to ustawić?

 194
Author: Roland, 2012-11-28

6 answers

Potrzeba jest możliwym pragnieniem powtarzalnych wyników, które mogą na przykład pochodzić z próby debugowania programu lub oczywiście z próby ponownego wykonania tego, co robi:

Te dwa wyniki będziemy" nigdy "odtworzyć jak tylko poprosiłem o coś "przypadkowego":

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

Te dwa są jednak identyczne ponieważ ustawiłem ziarno :

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> 

Istnieje obszerna literatura na ten temat; Wikipedia to dobry początek. W istocie, te RNGs nazywane są Pseudo liczby losowej Generatory, ponieważ są w rzeczywistości w pełni algorytmiczne : biorąc pod uwagę to samo ziarno, otrzymujesz tę samą sekwencję. I to jest funkcją , a nie błędem.

 276
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 15:00:10

Musisz ustawić ziarno za każdym razem, gdy chcesz uzyskać powtarzalny losowy wynik.

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
 34
Author: Chia-hung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 13:50:52

Dodaję tylko kilka dodatkowych aspektów. Potrzeba ustawienia ziarna: w świecie akademickim, jeśli ktoś twierdzi, że jego algorytm osiąga wydajność 98,05% w jednej symulacji, inni muszą być w stanie ją odtworzyć.

?set.seed

Przeglądając plik pomocy tej funkcji, oto kilka interesujących faktów:

(1) set.seed () zwraca NULL, invisible

(2) "początkowo nie ma seedu; nowy jest tworzony od bieżącego czasu i ID procesu, gdy jest wymagane. Dlatego różne sesje domyślnie dają różne wyniki symulacji. Jednak seed może zostać przywrócony z poprzedniej sesji, jeśli zostanie przywrócony wcześniej zapisany obszar roboczy.", dlatego warto zadzwonić do set.seed () z tymi samymi wartościami całkowitymi następnym razem, gdy chcesz mieć tę samą sekwencję losowej sekwencji.

 17
Author: Ridingstar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 16:02:18

Ustalenie nasion jest niezbędne, gdy staramy się zoptymalizować funkcję, która obejmuje losowo generowane liczby (np. w estymacji opartej na symulacji). Mówiąc luźno, jeśli nie naprawimy ziarna, zmiana spowodowana losowaniem różnych liczb losowych prawdopodobnie spowoduje niepowodzenie algorytmu optymalizacji.

Załóżmy, że z jakiegoś powodu chcesz oszacować odchylenie standardowe (sd) średniego-zerowego rozkładu normalnego przez symulację, biorąc pod uwagę próbkę. Można to osiągnąć poprzez uruchomienie optymalizacja numeryczna wokół kroków

  1. (ustawienie nasion)
  2. biorąc pod uwagę wartość sd, Generuj dane o normalnym rozkładzie
  3. Oceń prawdopodobieństwo Twoich danych biorąc pod uwagę symulowane rozkłady

Wykonują to następujące funkcje, raz bez kroku 1., raz w tym:

# 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)))
}

Możemy sprawdzić względną wydajność obu funkcji w odkrywaniu prawdziwej wartości parametru za pomocą krótkiego badania Monte Carlo:

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)

Wynik rozkład estymatorów parametrów jest następujący:

Histogram oszacowania parametrów bez ustalania materiału siewnegoHistogram szacunkowych parametrów ustalających materiał siewny

Gdy naprawimy ziarno, wyszukiwanie numeryczne kończy się blisko wartości prawdziwego parametru 2 znacznie częściej.

 7
Author: Matthias Schmidtblaicher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 21:18:14

W zasadzie ustawione.funkcja seed() pomoże ponownie użyć tego samego zestawu zmiennych losowych, które mogą być potrzebne w przyszłości, aby ponownie ocenić dane zadanie z tymi samymi losowymi zmiennymi

Wystarczy ją zadeklarować przed użyciem dowolnej funkcji generującej liczby losowe.

 6
Author: user4388407,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 11:42:38

set.seed jest podstawową funkcją, która jest w stanie wygenerować (za każdym razem, gdy chcesz) razem inne funkcje (rnorm, runif, sample) ta sama losowa wartość.

Poniżej przykład bez zestawu.seed

> set.seed(NULL)
> rnorm(5)
[1]  1.5982677 -2.2572974  2.3057461  0.5935456  0.1143519
> rnorm(5)
[1]  0.15135371  0.20266228  0.95084266  0.09319339 -1.11049182
> set.seed(NULL)
> runif(5)
[1] 0.05697712 0.31892399 0.92547023 0.88360393 0.90015169
> runif(5)
[1] 0.09374559 0.64406494 0.65817582 0.30179009 0.19760375
> set.seed(NULL)
> sample(5)
[1] 5 4 3 1 2
> sample(5)
[1] 2 1 5 4 3

Poniżej przykład z zestawem.seed

> set.seed(123)
> rnorm(5)
[1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
> set.seed(123)
> rnorm(5)
[1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
> set.seed(123)
> runif(5)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
> set.seed(123)
> runif(5)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
> set.seed(123)
> sample(5)
[1] 3 2 5 4 1
> set.seed(123)
> sample(5)
[1] 3 2 5 4 1
 0
Author: Earl Mascetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 09:08:21