Redenen voor het gebruik van de set.seed-functie

Vaak heb ik de functie set.seedin R gezien, voordat ik het programma startte. Ik weet dat het in principe wordt gebruikt voor het genereren van willekeurige getallen. Is er een specifieke behoefte om dit in te stellen?


Antwoord 1, autoriteit 100%

De behoefte is de mogelijke wens voor reproduceerbare resultaten, die bijvoorbeeld kunnen komen door te proberen uw programma te debuggen, of natuurlijk door te proberen opnieuw te doen wat het doet:

Deze twee resultaten zullen we “nooit” reproduceren omdat ik zojuist om iets “willekeurigs” heb gevraagd:

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

Deze twee zijn echter identiek omdat ik de seed heb ingesteld:

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> 

Er is uitgebreide literatuur over dat alles; Wikipedia is een goed begin. In wezen worden deze RNG’s Pseudo Random Number Generators genoemd omdat ze in feite volledig algoritmischzijn: als je dezelfde seed krijgt, krijg je dezelfde reeks. En dat is een functieen geen bug.


Antwoord 2, autoriteit 12%

Je moet elke keer seed instellen als je een reproduceerbaar willekeurig resultaat wilt krijgen.

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

Antwoord 3, autoriteit 6%

Gewoon wat extra aspecten toevoegen.
Noodzaak om zaad te zetten: als iemand in de academische wereld beweert dat zijn algoritme een prestatie van bijvoorbeeld 98,05% behaalt in één simulatie, moeten anderen het kunnen reproduceren.

?set.seed

Het doorlopen van het helpbestand van deze functie, dit zijn enkele interessante feiten:

(1) set.seed () retourneert NULL, onzichtbare

(2) “In eerste instantie is er geen zaad van een nieuwe wordt gemaakt op basis van de huidige tijd en het proces ID wanneer men nodig Vandaar verschillende sessies zullen verschillende simulatieresultaten, geven standaard is echter mogelijk dat het zaad zijn.. hersteld van een vorige sessie als een eerder opgeslagen werkruimte wordt hersteld. ‘, dit is de reden waarom je zou willen noemen set.seed () met dezelfde gehele getallen de volgende keer dat u een zelfde reeks willekeurige volgorde wilt.


Antwoord 4, Autoriteit 2%

Opknappen van het zaad is van essentieel belang als we proberen om een ​​functie die willekeurig gegenereerde nummers gaat optimaliseren (bijv. In de simulatie gebaseerde schatting). Losjes spreken, als we niet het zaad, de variatie op te lossen als gevolg van tekenen van verschillende willekeurige getallen zal waarschijnlijke oorzaak van de optimalisatie algoritme te mislukken.

Stel dat, om wat voor reden dan ook, wilt u de standaarddeviatie (sd) van een gemiddelde nul normale verdeling door middel van simulatie te schatten, gezien een monster. Dit kan worden bereikt door het uitvoeren van een numerieke optimalisatie rond stappen

  1. (Instellen van het zaad)
  2. Aangezien een waarde SD, het genereren normale datadistributie
  3. Evalueer de kans dat uw gegevens gezien de gesimuleerde distributies

De volgende functies dit, doe eens zonder stap 1, nadat het op te nemen:

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

We kunnen de relatieve prestaties van de twee functies controleren bij het ontdekken van de echte parameterwaarde met een korte Monte Carlo-studie:

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)

De resulterende verdelingen van de parameterschattingen zijn:


Als we de seed repareren, komt de numerieke zoekopdracht veel vaker in de buurt van de echte parameterwaarde van 2.


Antwoord 5, autoriteit 2%

in principe zal de set.seed()-functie helpen om dezelfde set willekeurige variabelen te hergebruiken, die we in de toekomst misschien nodig hebben om een bepaalde taak opnieuw te evalueren met dezelfde willekeurige variabelen

we hoeven het alleen maar te declareren voordat we een functie voor het genereren van willekeurige getallen gebruiken.


Antwoord 6

set.seedis een basisfunctie die (elke keer dat je wilt) samen andere functies kan genereren (rnorm, runif, sample) dezelfde willekeurige waarde.

Hieronder een voorbeeld zonder set.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

Hieronder een voorbeeld met set.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

Antwoord 7

Om nog meer toe te voegen… Je moet elke keer dat je wat willekeurige dingen doet de seed instellen als je consistentie wilt. Het zaad blijft niet ingesteld.

set.seed(0)
rnorm(3)
set.seed(0)
rnorm(3)
[1]  1.2629543 -0.3262334  1.3297993
[1]  1.2629543 -0.3262334  1.3297993
set.seed(0)
rnorm(3)
rnorm(3)
[1]  1.2629543 -0.3262334  1.3297993
[1]  1.2724293  0.4146414 -1.5399500

Other episodes