세트를 사용하는 이유.종자 함수
나는 여러 번 그것을 보았습니다.set.seed
프로그램을 시작하기 전에 R에서 기능합니다.기본적으로 난수 생성에 사용되는 것으로 알고 있습니다.이것을 설정할 특별한 필요성이 있습니까?
필요한 것은 재현 가능한 결과에 대한 가능한 욕구입니다. 예를 들어 프로그램을 디버깅하거나 프로그램이 수행하는 작업을 다시 수행하는 데서 발생할 수 있습니다.
이 두 가지 결과는 제가 방금 "무작위"를 요청했기 때문에 "절대" 재현되지 않을 것입니다.
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
그러나 이 두 가지는 제가 씨를 뿌렸기 때문에 동일합니다.
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>
이 모든 것에 대한 방대한 문헌이 있습니다. 위키피디아는 좋은 출발입니다.본질적으로, 이 RNG들은 실제로 완전히 알고리즘적이기 때문에 의사 난수 생성기라고 불립니다. 동일한 시드가 주어지면 동일한 시퀀스를 얻을 수 있습니다.그리고 그것은 특징이지 버그가 아닙니다.
재현 가능한 랜덤 결과를 얻으려면 매번 시드를 설정해야 합니다.
set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
몇 가지 측면을 추가하는 것뿐입니다.시드 설정 필요:학계에서는 자신의 알고리즘이 한 시뮬레이션에서 98.05%의 성능을 달성했다고 주장하면 다른 사람들이 이를 재현할 수 있어야 합니다.
?set.seed
이 기능의 도움말 파일을 살펴보면 몇 가지 흥미로운 사실이 있습니다.
set.seed()가 NULL을 반환합니다. 보이지 않습니다.
"처음에는 시드가 없습니다. 현재 시간과 프로세스 ID가 필요할 때 새로운 시드가 생성됩니다.따라서 세션마다 기본적으로 다른 시뮬레이션 결과가 제공됩니다.그러나 이전에 저장한 작업 공간이 복원된 경우 시드가 이전 세션에서 복원될 수 있습니다.". 이는 다음에 동일한 임의 시퀀스를 원할 때 동일한 정수 값으로 set.seed()를 호출하려는 이유입니다.
무작위로 생성된 숫자를 포함하는 함수를 최적화하려고 할 때(예: 시뮬레이션 기반 추정) 시드를 고정하는 것이 필수적입니다.대략적으로 말하면, 시드를 고정하지 않으면 서로 다른 난수를 그려서 발생하는 변동으로 인해 최적화 알고리즘이 실패할 가능성이 높습니다.
어떤 이유에서 표본이 주어진 경우 시뮬레이션을 통해 평균 0 정규 분포의 표준 편차(sd)를 추정하려고 한다고 가정합니다.이는 단계별로 수치 최적화를 실행하여 달성할 수 있습니다.
- (시드 설정)
- sd 값이 주어지면 정규 분포 데이터 생성
- 시뮬레이션된 분포가 주어진 데이터의 가능성 평가
다음 기능은 1단계를 포함하지 않고 1단계를 포함하지 않고 1단계를 수행합니다.
# 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)))
}
우리는 짧은 몬테카를로 연구를 통해 실제 매개 변수 값을 발견할 때 두 기능의 상대적인 성능을 확인할 수 있습니다.
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)
모수 추정치의 결과 분포는 다음과 같습니다.
시드를 수정하면 수치 검색이 실제 매개 변수 값인 2에 훨씬 더 자주 근접하게 됩니다.
기본적으로 set.seed() 함수는 동일한 무작위 변수 세트를 재사용하는 데 도움이 될 것이며, 우리는 미래에 동일한 무작위 변수로 특정 작업을 다시 평가하기 위해 필요할 수 있습니다.
임의의 난수 생성 함수를 사용하기 전에 선언해야 합니다.
set.seed
는 다른 마다)를 할 수 입니다.rnorm
,runif
,sample
값 동일한 랜덤 값입니다.
설정되지 않은 예제 아래.씨를 뿌리다
> 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
집합이 있는 예제 아래에 있습니다.씨를 뿌리다
> 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
좀 더 덧붙이자면...일관성을 원한다면 임의의 작업을 수행할 때마다 시드를 설정해야 합니다.시드가 세팅되어 있지 않습니다.
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
언급URL : https://stackoverflow.com/questions/13605271/reasons-for-using-the-set-seed-function
'source' 카테고리의 다른 글
C# 배열에 값 추가 (0) | 2023.06.18 |
---|---|
사용자 정의 Wordpress 사용자 유형 (0) | 2023.06.18 |
Angular 9에서 유형 스크립트를 사용하여 관찰자 크기 조정 찾기 (0) | 2023.06.18 |
Mariadb에서 변수 정의 (0) | 2023.06.18 |
플로트에 대한 범위(범위) (0) | 2023.06.18 |