참고 문헌은 q가 대칭 분포이면 비율 q (x | y) / q (y | x)가 1이되고 알고리즘을 메트로폴리스라고합니다. 그 맞습니까?
예, 맞습니다. 메트로폴리스 알고리즘은 MH 알고리즘의 특수한 경우입니다.
"Random Walk"Metropolis (-Hastings)는 어떻습니까? 다른 두 가지와 어떻게 다릅니 까?
무작위 보행에서, 제안 분배는 체인에 의해 마지막으로 생성 된 값에서 각 단계 후에 중심이 조정됩니다. 일반적으로 랜덤 워크에서 제안 분포는 가우시안이며이 경우이 랜덤 워크는 대칭 요구 사항을 충족하며 알고리즘은 대도시입니다. 비대칭 분포로 "의사"랜덤 보행을 수행 할 수 있다고 가정하면 제안이 기울기의 반대 방향으로 너무 표류하게됩니다 (왼쪽으로 치우친 분포는 오른쪽으로 제안을 선호합니다). 왜 당신이 이것을 할 것인지 잘 모르겠지만, 당신은 할 수 있고 대도시 헤이스팅스 알고리즘 일 것입니다 (즉, 추가 비율 항이 필요합니다).
다른 두 가지와 어떻게 다릅니 까?
비임의 보행 알고리즘에서 제안 분포는 고정되어 있습니다. 랜덤 워크 변형에서는 제안 반복의 중심이 각 반복마다 변경됩니다.
제안 배포가 포아송 배포 인 경우 어떻게합니까?
그런 다음 대도시 대신 MH를 사용해야합니다. 아마도 이것은 불연속 분포를 샘플링하는 것일 수 있습니다. 그렇지 않으면 불연속 함수를 사용하여 제안서를 생성하지 않을 것입니다.
어쨌든 샘플링 분포가 잘 리거나 기울어 짐에 대한 사전 지식이있는 경우 비대칭 샘플링 분포를 사용하려고하므로 대도시 헤이스팅스를 사용해야합니다.
누군가 나에게 간단한 코드 (C, python, R, pseudo-code 또는 원하는 코드)를 줄 수 있습니까?
대도시는 다음과 같습니다.
Metropolis <- function(F_sample # distribution we want to sample
, F_prop # proposal distribution
, I=1e5 # iterations
){
y = rep(NA,T)
y[1] = 0 # starting location for random walk
accepted = c(1)
for(t in 2:I) {
#y.prop <- rnorm(1, y[t-1], sqrt(sigma2) ) # random walk proposal
y.prop <- F_prop(y[t-1]) # implementation assumes a random walk.
# discard this input for a fixed proposal distribution
# We work with the log-likelihoods for numeric stability.
logR = sum(log(F_sample(y.prop))) -
sum(log(F_sample(y[t-1])))
R = exp(logR)
u <- runif(1) ## uniform variable to determine acceptance
if(u < R){ ## accept the new value
y[t] = y.prop
accepted = c(accepted,1)
}
else{
y[t] = y[t-1] ## reject the new value
accepted = c(accepted,0)
}
}
return(list(y, accepted))
}
바이 모달 분포를 샘플링하기 위해 이것을 사용해 봅시다. 먼저, 우리의 propsal에 임의의 보행을 사용하면 어떻게되는지 봅시다 :
set.seed(100)
test = function(x){dnorm(x,-5,1)+dnorm(x,7,3)}
# random walk
response1 <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, x, sqrt(0.5) )}
,I=1e5
)
y_trace1 = response1[[1]]; accpt_1 = response1[[2]]
mean(accpt_1) # acceptance rate without considering burn-in
# 0.85585 not bad
# looks about how we'd expect
plot(density(y_trace1))
abline(v=-5);abline(v=7) # Highlight the approximate modes of the true distribution
이제 고정 제안서 배포를 사용하여 샘플링을 시도하고 어떻게되는지 살펴 보겠습니다.
response2 <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, -5, sqrt(0.5) )}
,I=1e5
)
y_trace2 = response2[[1]]; accpt_2 = response2[[2]]
mean(accpt_2) # .871, not bad
처음에는 괜찮아 보이지만, 만약 우리가 후부 밀도를 살펴보면 ...
plot(density(y_trace2))
로컬 최대 값에 완전히 고정되어 있음을 알 수 있습니다. 우리가 실제로 제안서 배포를 중심으로 했으므로 이것은 놀라운 일이 아닙니다. 우리가 이것을 다른 모드에 집중 시키면 같은 일이 일어납니다 :
response2b <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, 7, sqrt(10) )}
,I=1e5
)
plot(density(response2b[[1]]))
두 가지 모드 사이 에서 제안을 제거 할 수 있지만 두 가지 모드 중 하나를 탐색 할 수 있도록 분산을 실제로 높게 설정해야합니다.
response3 <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, -2, sqrt(10) )}
,I=1e5
)
y_trace3 = response3[[1]]; accpt_3 = response3[[2]]
mean(accpt_3) # .3958!
제안서 배포의 중심 선택이 어떻게 샘플러의 수락 률에 큰 영향을 미치는지 살펴보십시오.
plot(density(y_trace3))
plot(y_trace3) # we really need to set the variance pretty high to catch
# the mode at +7. We're still just barely exploring it
우리는 여전히 두 가지 모드에 가까워지고 있습니다. 이것을 두 모드 사이에 직접 놓아 봅시다.
response4 <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, 1, sqrt(10) )}
,I=1e5
)
y_trace4 = response4[[1]]; accpt_4 = response4[[2]]
plot(density(y_trace1))
lines(density(y_trace4), col='red')
마지막으로, 우리는 찾고 있던 것에 더 가까워지고 있습니다. 이론적으로, 만약 우리가 샘플러를 충분히 오래 운영하게한다면, 우리는이 제안서 분포에서 대표 샘플을 얻을 수 있지만, 랜덤 워크는 유용한 샘플을 매우 빨리 생성했으며, 어떻게 후자가 추정되었는지에 대한 지식을 이용해야했습니다. 고정 된 샘플링 분포를 조정하여 유용한 결과를 얻습니다 (실제로 아직 알려지지 않은 결과 y_trace4
).
나중에 대도시 헤이스팅의 예로 업데이트하려고합니다. 메트로폴리스 헤이스팅스 알고리즘을 생성하기 위해 위의 코드를 수정하는 방법을 상당히 쉽게 볼 수 있어야합니다 (힌트 : 추가 비율을 logR
계산 에 추가하면 됩니다).