非対称のプロポーザル分布を使用したMetropolis-Hastingsの理解


13

モデルのパラメーターを推定するためのコード(つまり)を記述するために、Metropolis-Hastingsアルゴリズムを理解しようとしています。参考文献によると、Metropolis-Hastingsアルゴリズムには次の手順があります。fバツ=aバツ

  • を生成しYtqy|バツt
  • バツt+1={Yt確率でρバツtYtバツt確率で1ρバツtYt

ここで、ρバツy=fyfバツqバツ|yqy|バツ1

いくつか質問したい方法:

  • 書誌では、qが対称分布の場合、比率qバツ|y/qy|バツは1になり、アルゴリズムはMetropolisと呼ばれると述べています。あれは正しいですか?メトロポリスとメトロポリス・ヘイスティングスの唯一の違いは、最初のものが対称分布を使用しているということですか?「ランダムウォーク」メトロポリス(-ヘイスティングス)はどうですか?他の2つとどのように違いますか?
  • 私がオンラインで見つけるコード例のほとんどは、ガウス提案分布qを使用しているため、ρバツy=fy/fバツ1ここでfy/fバツは尤度比です。プロポーザルの分布がポアソン分布の場合はどうなりますか?非対称分布を使用するときにその比率が1にならない理由は理にかなっていると思いますが、数学的に理解するのか、それともコードで実装するのかはわかりません。非対称のプロポーザル分布を使用したMetropolis-Hastingsアルゴリズムの簡単なコード(C、python、R、擬似コードなど)を教えてもらえますか?

1
私は、関連する問題に関する優れたブログの記事を思い出し、多分これは役立ちます:darrenjw.wordpress.com/2012/06/04/...
joint_p

回答:


19

書誌では、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計算に補足比率を追加するだけです)。


素晴らしい答え!どうもありがとうございます!私の場合、6-7のパラメーターモデルがあり、データセットが完全に異なる場合があるため、事後分布がどのように見えるかわかりません(ただし、二峰性になる可能性があります)。あなたが言ったことに基づいて、提案の分布に大きな分散を使用してMetropolis(-Hastings)を使用するか、提案の分布に小さな分散を使用してRandom Walk Metropolis(-Hastings)を使用できます。特別な状況ではない場合、2番目のソリューションはターゲット分布により速く収束するはずです。正しい?
AstrOne

メトロポリス・ヘイスティングスのコードに関連して、私はR=exp(logR)これに置き換えることを考えていました:R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))ランダムウォークと非ランダムウォークの両方のMH。あれは正しいですか?
-AstrOne

1
基本的には、メトロポリスコードで述べたように、ログスペースで計算を実行します。尤度計算は非常に小さな値で動作する傾向があるため、通常、生の値を乗算するよりも、対数を追加して結果を累乗するよりもはるかに優れた結果が得られます。
デビッドマルクス

1
yt1qyt|yt1=qytyt1

1
「非ランダムウォークアルゴリズムでは、プロポーザルの分布が固定されています。ランダムウォークバリアントでは、反復ごとにプロポーザルの分布の中心が変化します」と述べていますが、これは正しくありません。ランダムウォークではないMHバージョンには、主にマルコフチェーンの現在の状態に依存する提案があり、この状態に集中することもあります。主要な例は、ランジュバンMCMCアルゴリズムです。提案が修正されると、これは独立したMHアルゴリズムになります
西安
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.