set.seed 함수를 사용하는 이유


답변:


264

예를 들어 프로그램을 디버깅하려고 시도하거나 물론 작업을 다시 실행하려고 할 때와 같은 재현 가능한 결과에 대한 가능한 요구가 있습니다.

이 두 결과는 방금 "무작위"를 요구했을 때 "절대"재생산되지 않습니다.

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> 

이 모든 것에 대한 방대한 문헌이 있습니다. Wikipedia는 좋은 출발입니다. 본질적으로 이러한 RNG는 실제로 완전 알고리즘 이기 때문에 유사 난수 생성기라고 합니다. 동일한 시드가 주어지면 동일한 시퀀스를 얻게됩니다. 그리고 그것은 버그 가 아닌 기능 입니다.


5
좋은 예를 들어 Dirk에게 감사드립니다. 99 %로 해결했지만 여전히 의문입니다. 1. 귀하의 답변에서 42를 인수로 사용하여 set.seed를 사용했습니다.이 값을 선택하는 관련 이유가 있습니까?
Vignesh

43
괜찮은 품질의 정상적인 RNG의 경우 값이 중요하지 않습니다. "42"는 유명한 책에 대한 참조입니다. 다른 사람들은 생일이나 "123"또는 "1"만 사용합니다.
Dirk Eddelbuettel 1

7
char2seedTeachingDemos 패키지 의 기능을 사용하면 set.seed문자열을 기반으로 시드를 설정하거나 전달할 시드를 선택할 수 있습니다 . 예를 들어 학생들에게 씨앗으로 자신의 이름을 사용하도록하고 각 학생마다 고유 한 데이터 집합이 있지만 강사는 채점을 위해 동일한 데이터 집합을 만들 수도 있습니다.
Greg Snow

8
"최상의"결과를 얻을 때까지 다른 시드로 동일한 코드를 다시 실행할 수 있습니다 (예를 들어이 작업을 수행했습니다). 이 일에 대한 비난을 막기 위해 항상 같은 종자 또는 날짜, 또는 char2seed프로젝트에서 주요 조사자의 성명을 사용하는 명백한 의미를 가진 종자를 선택하는 것이 가장 좋습니다 .
Greg Snow

5
@DirkEddelbuettel 시드 값 계산이 아닌 이유로 중요 할 수 있습니다 . 제 친구는 코드가 시작 set.seed(666)되고 검토자가 코드에서 악마 시드를 좋아하지 않기 때문에 시뮬레이션 기반 결과를 게시하는 데 문제가있었습니다 ...
Tim

33

재현 가능한 임의 결과를 얻으려면 시드를 설정해야합니다.

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

17

추가 측면 만 추가하면됩니다. 시드 설정의 필요성 : 학계에서 한 시뮬레이션에서 98.05 %의 성능을 달성하는 알고리즘이 있다고 주장하는 경우 다른 시뮬레이션에서도이를 재현 할 수 있어야합니다.

?set.seed

이 함수의 도움말 파일을 살펴보면 다음과 같은 흥미로운 사실이 있습니다.

(1) set.seed ()는 보이지 않는 NULL을 반환합니다.

(2) "초기에는 시드가 없습니다. 새로운 시드는 현재 시간과 프로세스 ID가 필요할 때 생성됩니다. 따라서 다른 세션은 기본적으로 다른 시뮬레이션 결과를 제공합니다. 그러나 시드는 이전에 저장 한 작업 공간이 복원 된 경우 이전 세션이 발생합니다. "따라서 다음에 동일한 임의 순서의 시퀀스를 원할 때 동일한 정수 값으로 set.seed ()를 호출하려고합니다.


7

시드 수정은 무작위로 생성 된 숫자를 포함하는 함수 (예 : 시뮬레이션 기반 추정)를 최적화하려고 할 때 필수적입니다. 느슨하게 말해서, 시드를 수정하지 않으면 다른 난수를 그리는 것으로 인한 변동으로 인해 최적화 알고리즘이 실패 할 수 있습니다.

어떤 이유로 표본이 주어지면 시뮬레이션을 통해 평균 제로 정규 분포의 표준 편차 (sd)를 추정한다고 가정합니다. 단계별로 수치 최적화를 실행하여 달성 할 수 있습니다.

  1. (종자 설정)
  2. sd 값이 주어지면 정규 분포 데이터 생성
  3. 모의 분포를 고려하여 데이터의 가능성을 평가하십시오.

다음 함수는 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)))
}

짧은 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)

모수 추정치의 결과 분포는 다음과 같습니다.

시드를 고정하지 않은 모수 추정치의 히스토그램 시드를 고정하는 모수 추정치의 히스토그램

시드를 수정하면 수치 검색이 실제 매개 변수 값 2에 훨씬 더 가깝습니다.


6

기본적으로 set.seed () 함수는 동일한 무작위 변수 세트를 재사용하는 데 도움이되며, 나중에 동일한 무작위 변수로 특정 작업을 다시 평가해야 할 수도 있습니다.

난수 생성 함수를 사용하기 전에 선언해야합니다.


정교하게 답변
Spry Techies
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.