Molte volte ho visto la set.seed
funzione in R, prima di avviare il programma. So che è sostanzialmente utilizzato per la generazione di numeri casuali. C'è qualche necessità specifica per impostare questo?
Molte volte ho visto la set.seed
funzione in R, prima di avviare il programma. So che è sostanzialmente utilizzato per la generazione di numeri casuali. C'è qualche necessità specifica per impostare questo?
Risposte:
La necessità è il possibile desiderio di risultati riproducibili, che possono ad esempio provenire dal tentativo di eseguire il debug del programma o, naturalmente, dal tentativo di ripetere ciò che fa:
Questi due risultati non "mai" riproduciamo come ho appena chiesto qualcosa di "casuale":
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
Questi due, tuttavia, sono identici perché ho impostato il seme :
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>
C'è una vasta letteratura su tutto ciò; Wikipedia è un buon inizio. In sostanza, questi RNG sono chiamati generatori di numeri casuali pseudo perché in realtà sono completamente algoritmici : dato lo stesso seme, si ottiene la stessa sequenza. E questa è una caratteristica e non un bug.
char2seed
funzione nel pacchetto TeachingDemos consente di impostare il seme (o scegliere un seme in cui passare set.seed
) in base a una stringa di caratteri. Ad esempio, è possibile che gli studenti utilizzino il proprio nome come seme, quindi ogni studente ha un set di dati univoco, ma l'istruttore può anche creare gli stessi set di dati per la valutazione.
char2seed
e il cognome del principale investigatore in un progetto.
set.seed(666)
e ai revisori non è piaciuto il seme Devils nel codice ...
Aggiungo solo alcuni aspetti aggiuntivi. Necessità di impostare il seme: nel mondo accademico, se si afferma che il suo algoritmo raggiunge, si dice il 98,05% di prestazioni in una simulazione, gli altri devono essere in grado di riprodurlo.
?set.seed
Passando attraverso il file di aiuto di questa funzione, questi sono alcuni fatti interessanti:
(1) set.seed () restituisce NULL, invisibile
(2) "Inizialmente, non è presente alcun seed; ne viene creato uno nuovo dall'ora corrente e l'ID del processo quando richiesto. Pertanto sessioni diverse forniranno risultati di simulazione diversi, per impostazione predefinita. Tuttavia, il seed potrebbe essere ripristinato da un sessione precedente se viene ripristinato uno spazio di lavoro salvato in precedenza. ", ecco perché si vorrebbe chiamare set.seed () con gli stessi valori interi la volta successiva che si desidera una stessa sequenza di sequenza casuale.
Riparare il seme è essenziale quando proviamo a ottimizzare una funzione che coinvolge numeri generati casualmente (ad esempio nella stima basata sulla simulazione). In parole povere, se non risolviamo il seed, la variazione dovuta al disegno di numeri casuali diversi farà probabilmente fallire l'algoritmo di ottimizzazione.
Supponiamo che, per qualche motivo, si desideri stimare la deviazione standard (sd) di una distribuzione normale media zero mediante simulazione, dato un campione. Ciò può essere ottenuto eseguendo un'ottimizzazione numerica attorno ai passaggi
Le seguenti funzioni lo fanno, una volta senza il passaggio 1., una volta includendolo:
# 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)))
}
Possiamo verificare le prestazioni relative delle due funzioni scoprendo il vero valore del parametro con un breve studio di 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)
Le distribuzioni risultanti delle stime dei parametri sono:
Quando ripariamo il seme, la ricerca numerica si avvicina molto più spesso al valore del parametro reale di 2.
sostanzialmente la funzione set.seed () aiuterà a riutilizzare lo stesso insieme di variabili casuali, che in futuro potremmo aver bisogno per valutare nuovamente un determinato compito con le stesse varibales casuali
dobbiamo solo dichiararlo prima di utilizzare qualsiasi funzione di generazione di numeri casuali.