Compartilhe
- Gerar link
- X
- Outros aplicativos
Set.seed
Razões para usar a função set.seed
Muitas vezes vi a função set.seed em R, antes de iniciar o programa. Eu sei que é basicamente usado para a geração de números aleatórios. Existe alguma necessidade específica para definir isso?
A necessidade é o possível desejo de resultados reproduzíveis, que podem, por exemplo, advir da tentativa de depurar seu programa ou, claro, de tentar refazer o que ele faz:
Esses dois resultados "nunca" serão reproduzidos, já que eu pedi algo "aleatório":
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
Esses dois, no entanto, são idênticos porque eu configurei a semente:
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>
Há vasta literatura sobre tudo isso; A Wikipédia é um bom começo. Em essência, esses RNGs são chamados de Geradores de Números Pseudo-Aleatórios porque eles são de fato totalmente algorítmicos: dada a mesma semente, você obtém a mesma sequência. E isso é uma característica e não um bug.
Você precisa definir a semente toda vez que quiser obter um resultado aleatório reproduzível.
set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
Apenas adicionando alguns aspectos de adição. Necessidade de criar sementes: No mundo acadêmico, se alguém afirma que seu algoritmo alcança, digamos, 98,05% de desempenho em uma simulação, outros precisam ser capazes de reproduzi-lo.
?set.seed
Indo através do arquivo de ajuda desta função, estes são alguns fatos interessantes:
(1) set.seed () retorna NULL, invisível
(2) "Inicialmente, não há semente; um novo é criado a partir do momento atual e do ID do processo quando um é necessário. Portanto, diferentes sessões fornecerão resultados de simulação diferentes, por padrão. No entanto, a semente pode ser restaurada de um sessão anterior se um espaço de trabalho salvo anteriormente for restaurado. ", é por isso que você deve chamar set.seed () com os mesmos valores inteiros na próxima vez que desejar uma sequência de sequência aleatória.
A fixação da semente é essencial quando tentamos otimizar uma função que envolve números gerados aleatoriamente (por exemplo, na estimativa baseada em simulação). Falando livremente, se não corrigirmos a semente, a variação devida ao desenho de números aleatórios diferentes provavelmente fará com que o algoritmo de otimização falhe.
Suponha que, por algum motivo, você queira estimar o desvio padrão (dp) de uma distribuição normal média-zero por simulação, dada uma amostra. Isso pode ser conseguido executando uma otimização numérica em torno de etapas
- (Definindo a semente)
- Dado um valor para sd, gere dados normalmente distribuídos
- Avalie a probabilidade de seus dados, dadas as distribuições simuladas
As seguintes funções fazem isso, uma vez sem a etapa 1., uma vez incluída:
# 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)))
}
Podemos verificar o desempenho relativo das duas funções ao descobrir o verdadeiro valor do parâmetro com um estudo de Monte Carlo curto:
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)
As distribuições resultantes das estimativas de parâmetros são:
- Histograma de estimativas de parâmetros sem fixar a semente
- Histograma de estimativas de parâmetro que fixa a semente
Quando corrigimos a semente, a pesquisa numérica termina perto do valor verdadeiro do parâmetro 2 com muito mais frequência.
basicamente set.seed () função irá ajudar a reutilizar o mesmo conjunto de variáveis aleatórias, o que podemos precisar no futuro para avaliar novamente tarefa particular novamente com o mesmo varibales aleatórios
nós só precisamos declará-lo antes de usar qualquer função geradora de números aleatórios.
Postagens mais visitadas
Comandos Google Dorks
- Gerar link
- X
- Outros aplicativos
💔 Suspeita de traição?
- Gerar link
- X
- Outros aplicativos
ELICITAÇÃO PROFISSIONAL AVANÇADA
- Gerar link
- X
- Outros aplicativos
Lamborghini Gallardo V10
- Gerar link
- X
- Outros aplicativos

Comentários
Postar um comentário