書誌では、qが対称分布の場合、比率q(x | y)/ q(y | x)は1になり、アルゴリズムはMetropolisと呼ばれると述べています。あれは正しいですか?
はい、これは正しいです。Metropolisアルゴリズムは、MHアルゴリズムの特殊なケースです。
「ランダムウォーク」メトロポリス(-ヘイスティングス)はどうですか?他の2つとどのように違いますか?
ランダムウォークでは、各ステップの後、チェーンによって最後に生成された値で提案の分布が中心に戻されます。一般に、ランダムウォークでは、提案分布はガウス分布であり、この場合、このランダムウォークは対称性の要件を満たし、アルゴリズムはメトロポリスです。非対称分布で「疑似」ランダムウォークを実行すると、提案がスキューの反対方向にドリフトしすぎる可能性があります(左に歪んだ分布は、右側に提案を優先します)。なぜこれを行うのかはわかりませんが、可能性があり、それは大都市のヘイスティングアルゴリズムです(つまり、追加の比率項が必要です)。
他の2つとどのように違いますか?
非ランダムウォークアルゴリズムでは、提案の分布が固定されています。ランダムウォークバリアントでは、提案の分布の中心が各反復で変化します。
プロポーザルの分布がポアソン分布の場合はどうなりますか?
次に、大都市の代わりにMHを使用する必要があります。おそらく、これは離散分布をサンプリングすることです。そうでなければ、提案を生成するために離散関数を使用したくないでしょう。
いずれにせよ、サンプリング分布が切り捨てられているか、そのスキューについての予備知識がある場合は、非対称サンプリング分布を使用する必要があるため、メトロポリスヘイスティングを使用する必要があります。
誰かが私に簡単なコード(C、python、R、擬似コード、またはあなたが好むもの)の例を教えてもらえますか?
ここに大都市があります:
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))
}
これを使用して、二峰性分布をサンプリングしてみましょう。まず、提案にランダムウォークを使用するとどうなるかを見てみましょう。
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]]))
2つのモードの間に提案をドロップしてみることができますが、どちらかを探索する機会を得るために、分散を本当に高く設定する必要があります。
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
我々はまだ 2つのモードのより近くで立ち往生。これを2つのモードの間に直接ドロップしてみましょう。
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
計算に補足比率を追加するだけです)。