Odpowiedzi:
Potrzebna jest możliwa chęć uzyskania powtarzalnych wyników, które mogą na przykład wynikać z próby debugowania programu lub oczywiście z ponownej próby wykonania tego, co robi:
Te dwa wyniki „nigdy” nie odtworzymy, ponieważ właśnie poprosiłem o coś „losowego”:
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>
Na ten temat jest ogromna literatura; Wikipedia to dobry początek. W gruncie rzeczy te RNG są nazywane generatorami liczb pseudolosowych, ponieważ w rzeczywistości są w pełni algorytmiczne : biorąc pod uwagę to samo ziarno, otrzymujesz tę samą sekwencję. I to jest funkcja, a nie błąd.
char2seed
Funkcja w pakiecie TeachingDemos pozwala ustawić ziarno (lub wybierz ziarno przechodzi w set.seed
) na podstawie ciągu znaków. Na przykład możesz mieć uczniów, którzy używają ich nazw jako nasion, wtedy każdy uczeń ma unikalny zestaw danych, ale instruktor może również utworzyć te same zestawy danych do oceny.
char2seed
i nazwisko głównego badacza projektu.
set.seed(666)
a recenzentom nie podobało się ziarno diabła w kodzie ...
Musisz ustawić ziarno za każdym razem, gdy chcesz uzyskać powtarzalny losowy wynik.
set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
Właśnie dodając kilka dodatkowych aspektów. Potrzeba ustawienia nasion: W świecie akademickim, jeśli ktoś twierdzi, że jego algorytm osiąga, powiedzmy 98,05% wydajności w jednej symulacji, inni muszą być w stanie go odtworzyć.
?set.seed
Przeglądając plik pomocy tej funkcji, oto kilka interesujących faktów:
(1) set.seed () zwraca NULL, niewidoczny
(2) „Początkowo nie ma nasion; nowy jest tworzony na podstawie bieżącej godziny i identyfikatora procesu, gdy jest wymagany. Stąd różne sesje będą domyślnie dawały różne wyniki symulacji. Jednak ziarno może zostać przywrócone z poprzednia sesja, jeśli poprzednio zapisany obszar roboczy zostanie przywrócony. ”, dlatego chciałbyś wywołać set.seed () z tymi samymi wartościami całkowitymi, kiedy następnym razem będziesz chciał mieć taką samą sekwencję losowej sekwencji.
Naprawienie zarodka jest niezbędne, gdy próbujemy zoptymalizować funkcję, która obejmuje losowo generowane liczby (np. W estymacji opartej na symulacji). Mówiąc luźniej, jeśli nie naprawimy zarodka, zmiana spowodowana rysowaniem różnych liczb losowych prawdopodobnie spowoduje awarię algorytmu optymalizacji.
Załóżmy, że z jakiegoś powodu chcesz oszacować odchylenie standardowe (sd) rozkładu normalnego średniego zera metodą symulacji, biorąc pod uwagę próbkę. Można to osiągnąć, przeprowadzając optymalizację numeryczną wokół kroków
Następujące funkcje to robią, raz bez kroku 1., raz włączając to:
# 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ść dwóch funkcji w odkryciu 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)
Wynikowe rozkłady oszacowań parametrów są następujące:
Kiedy naprawimy ziarno, wyszukiwanie numeryczne kończy się znacznie bliżej prawdziwej wartości parametru 2.
w zasadzie funkcja set.seed () pomoże ponownie wykorzystać ten sam zestaw zmiennych losowych, które mogą być potrzebne w przyszłości, aby ponownie ocenić dane zadanie ponownie z tymi samymi losowymi zmiennymi
musimy tylko to zadeklarować przed użyciem jakiejkolwiek funkcji generowania liczb losowych.