Motivi per l'utilizzo della funzione set.seed


Risposte:


264

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.


5
Grazie Dirk, per un bell'esempio .. L'ho eliminato con il 99%, ma rimango ancora in discussione. 1. Nella tua risposta hai usato set.seed con 42 come argomento .. c'è qualche motivo correlato per scegliere questo valore?
Vignesh,

43
Per un RNG normale di buona qualità, il valore non ha importanza. "42" è un riferimento a un libro famoso; altre persone usano il loro compleanno o "123" o semplicemente "1".
Dirk Eddelbuettel,

7
La char2seedfunzione 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.
Greg Snow,

8
È possibile rieseguire lo stesso codice con semi diversi fino ad ottenere il risultato "migliore" (l'ho fatto per esempi). Per difendersi dalle accuse di farlo, è meglio scegliere un seme che abbia un significato ovvio, o sempre lo stesso seme, o la data, oppure io uso char2seede il cognome del principale investigatore in un progetto.
Greg Snow,

5
Il valore del seme di @DirkEddelbuettel può essere importante per ragioni non computazionali, un mio amico ha avuto problemi con la pubblicazione dei suoi risultati basati sulla simulazione perché il codice è iniziato set.seed(666)e ai revisori non è piaciuto il seme Devils nel codice ...
Tim

33

Devi impostare il seme ogni volta che vuoi ottenere un risultato casuale riproducibile.

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)

17

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.


7

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

  1. (Impostazione del seme)
  2. Dato un valore per sd, genera dati normalmente distribuiti
  3. Valuta la probabilità dei tuoi dati date le distribuzioni simulate

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:

Istogramma delle stime dei parametri senza fissare il seme Istogramma delle stime dei parametri che fissano il seme

Quando ripariamo il seme, la ricerca numerica si avvicina molto più spesso al valore del parametro reale di 2.


6

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.


elabora la risposta
Spry Techies il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.