Top Banner
マルコフ連鎖モンテカルロ法入門ー2 ~お天気推移モデルから連続モデルへ~ E-mail:teramonagi AtMark gmail.com (twitter : teramonagi)
43

マルコフ連鎖モンテカルロ法入門-2

Jan 15, 2015

Download

Technology

tera monagi

マルコフ連鎖モンテカルロ法入門-1(http://www.slideshare.net/teramonagi/ss-5190440)
の続き。お天気推移モデルを拡張して連続モデル(正規分布等)を構築。そのマルコフ連鎖モンテカルロ法をどうするのか?という点を解説。また合わせて熱浴法・メトロポリスヘイスティング法の解説も実施。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: マルコフ連鎖モンテカルロ法入門-2

マルコフ連鎖モンテカルロ法入門ー2~お天気推移モデルから連続モデルへ~

E-mail:teramonagi AtMark gmail.com(twitter : teramonagi)

Page 2: マルコフ連鎖モンテカルロ法入門-2

ご注意

本資料は個人的な勉強会のために作成したものです。本情報の内容については万全を期しておりますが、その内容を保証するものではありません。これらの情報によって生じたいかなる損害についても、情報提供者は一切の責任を負いません。なお、本資料における意見、見解等はすべて筆者の個人的なものであり、筆者の属する組織の意見、見解等ではないことをあらかじめご了承ください。

Page 3: マルコフ連鎖モンテカルロ法入門-2

Contents1:前回の復習

2:お天気推移モデルから連続モデルへ

3:連続モデルのマルコフ連鎖モンテカルロ法

4:熱欲法とメトロポリスヘイスティング法

5:まとめ

Page 4: マルコフ連鎖モンテカルロ法入門-2

1:前回の復習(※前回の資料は「マルコフ連鎖モンテカルロ法入門-1」)

Page 5: マルコフ連鎖モンテカルロ法入門-2

■下図の赤字で書かれた推移確率に従って日々のお天気が推移していくようなモデル■例えば今日晴の場合、明日雨である確率は1/8、雪である確率は1/4、再び晴となる確率は5/8となる

お天気推移モデルの復習

黒字:不変分布赤字:推移確率

■このモデルを何日にもわたってシミュレーションすると、各お天気が出現する確率は最終的にt(日にち)に依らない一定の分布へと辿りついた(不変分布、図の黒数字)

Page 6: マルコフ連鎖モンテカルロ法入門-2

マルコフ連鎖モンテカルロ法の復習ー1

■マルコフ連鎖モンテカルロ法サンプリングしたい分布を不変分布に持つマルコフ連鎖を設計・生成することで、それに従った乱数を生成するモンテカルロ法のこと

■マルコフ連鎖モンテカルロ法の方針マルコフ連鎖(≒スゴロク)をシミュレーションし続けていくと、それは不変分布からのサンプリングをしていることに等しくなる。従ってうまく”不変分布=サンプリングしたい分布”となるようにマルコフ連鎖を設計(=推移確率を設定)すればよい

Page 7: マルコフ連鎖モンテカルロ法入門-2

■推移確率設定のコツ~詳細釣り合いの条件~x、x'をある状態(お天気の数がたくさん、つまり晴,雨,雪,台風...みたいに増えたとして、そのどれかがx,x'に対応)とし、Π_x→x'を状態xからx'への推移確率(=お天気の推移確率)、Pr{x}を不変分布において状態xが起こる確率だとすると、詳細釣り合いの条件は

と書ける。(x,x'を晴,雨,雪のいずれかとし「お天気推移モデルの復習」のページの値を代入すれば成立していることがわかる)

この詳細釣り合いの条件を満たすように推移確率を設定すれば不変分布からサンプリングした分布とすることができる

マルコフ連鎖モンテカルロ法の復習ー2

Page 8: マルコフ連鎖モンテカルロ法入門-2

■詳細釣り合いの条件を満たす推移確率は複数存在

■メトロポリス法では推移確率を以下のように決定

■あとは、これに従って推移確率を作成し、スゴロク(likeな)シミュレーションすることで不変分布からのサンプリングが実行できるのだった!

(※記号の意味は前頁参照)

マルコフ連鎖モンテカルロ法の復習ー3

Page 9: マルコフ連鎖モンテカルロ法入門-2

2:お天気推移モデルから連続モデルへ

Page 10: マルコフ連鎖モンテカルロ法入門-2

■お天気推移モデルでは有限個の状態(=お天気)を扱っていた(お天気が晴・雨・雪の3つなので3状態のモデル)

■これは確率分布でいうと離散確率分布を扱っていたことと同義

■連続モデルとは言うならば、状態が無限個あるようなモデル

■これは確率分布でいうと連続確率分布を扱うことになる

■代表的な連続確率分布としては正規分布・t分布等がある

■基本的な考え方は単純で確率を確率密度に変えるだけ(※連続と離散の詳細な違いはwikipediaの確率分布を読もう)

連続モデルとは-1

Page 11: マルコフ連鎖モンテカルロ法入門-2

■概念的に描くと下図のようなイメージ■今までお天気推移モデルでは有限個の状態(=お天気)を扱っていたが、状態を無限個に増やす

連続モデルとは-2

お天気推移モデル(3状態)連続モデル

(実際には全ての点を矢印で結ぶけど描くのめんどい...) 

Page 12: マルコフ連鎖モンテカルロ法入門-2

3:連続モデルのマルコフ連鎖モンテカルロ法

Page 13: マルコフ連鎖モンテカルロ法入門-2

■連続モデルで扱う連続確率分布の代表的な確率分布として正規分布がある

■まず具体例として1次元の標準正規分布に従う乱数をマルコフ連鎖モンテカルロ法を使って発生させる

■今まで扱ってきたお天気推移モデルとの対応を考えてみると・・・・・(Next Page)

連続モデルの例~正規乱数の発生~

Page 14: マルコフ連鎖モンテカルロ法入門-2

お天気推移モデルと連続モデルの対応

■数直線上には実数が無限個にあるので、その実数(この場合位置)1つ1つを状態(今までの場合お天気)と考える!

■各お天気の出現確率はある実数(付近の)値が出現する確率に対応(ある実数が出現する確率は0。確率密度は幅を持たせて確率としての意味を持つ)

Page 15: マルコフ連鎖モンテカルロ法入門-2

■コードは既に「マルコフ連鎖モンテカルロ法入門-1」で書いているお天気推移モデルのものを修正して使用

■変更点 1:変数・関数名をWeatherからStateに変更(変数名大事!) 2:不変分布の返却値を規格化因子のない標準正規分布へ変更 3:推移先候補は「区間[-0.5,0.5]の一様乱数+今の位置」で決定

■アルゴリズムはお天気推移モデルのものと同じで Step0:最初の状態(=位置)をてきとーに決める Step1:推移候補先を選定(NextState関数) Step2:メトロポリス法で決まる推移確率に従って推移 Step3:気が済んだ⇒End、気が済まない⇒Step1へ

メトロポリス法で正規乱数を生成 in R-1

Page 16: マルコフ連鎖モンテカルロ法入門-2

#不変分布(今の場合は標準正規分布)返却関数。#メトロポリス法を使う場合、前回の資料で述べたように規格化因子は必要ない!(もちろんあってもOK)InvariantDistribution <- function(x){

return(exp(-0.5 * x^2))}#推移したい次の状態(以前はお天気、今は位置)を返却する関数#適当でいいので今回は-0.5~0.5の一様乱数で移動先候補を決めたNextState <- function(x,dx){

return(x+dx*(runif(1)-0.5))}size <- 10000 #サンプリング回数result <- c() #結果格納dx <- 10 #次の状態を決める時に使う適当な定数。値自体に深い意味はなしstate.now <- 0 #現在の状態(位置)#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- c(result,state.now) #遷移したい次の天気を指定 state.next <- NextState(state.now,dx) #メトロポリス法による推移確率の計算 transition.probability <- min(1, InvariantDistribution(state.next)/InvariantDistribution(state.now)) #推移確率に応じて状態を推移 state.now <- ifelse(transition.probability > runif(1),state.next,state.now) }

メトロポリス法で正規乱数を生成 in R-2

Page 17: マルコフ連鎖モンテカルロ法入門-2

メトロポリス法で正規乱数を生成 in R-3

#平均と標準偏差がほぼ正規乱数の値0と1に!> mean(result)[1] 0.0004929868> sd(result)[1] 0.9942468

#結果の表示(シミュレーション結果のヒストグラムと正規分布の重ね描)hist(result,breaks=length(result)^0.5,freq=FALSE)lines(seq(-3,3,0.01),dnorm(seq(-3,3,0.01)),col=2,lwd=5)

Page 18: マルコフ連鎖モンテカルロ法入門-2

■基本となるロジックは全てお天気推移モデルと同じ■メトロポリス法では不変分布の比だけで推移確率が決まるので、規格化因子は必要ない!■dxで推移先候補の選択範囲を調整している。これをうまく選ぶと速く不変分布に収束したりする。adhocに設定。■推移先候補は一様乱数で選択しなくても、詳細釣り合いの条件を満たすように「x→x'」への推移と「x'→x」への推移が候補として選択される確率を等しくすればOK。詳細釣り合いの条件の両辺に同じ数を掛けても詳細釣り合いの条件は成立するということ

メトロポリス法で正規乱数を生成 in Rの解説

数式を使った詳しい話はやっぱり「計算統計 2 マルコフ連鎖モンテカルロ法とその周辺」の伊庭先生の章がvery good !

Page 19: マルコフ連鎖モンテカルロ法入門-2

■1次元だけだとありきたりでつまらないので2次元正規乱数を生成してみる■基本のコード・アルゴリズムはさっきのとほとんど同じ■変更点 1:不変分布の返却値を2次元正規分布へ変更 (各次元の平均値は0、標準偏差は1になるようにしている)  2:推移先候補は半径と角度を一様乱数で振って、極座標⇔直交座標の変換式から決定。前述のように詳細釣り合いの条件を壊さないように選んでいます。 3:今回は2つの次元間の相関を0.5とした。無論なんでもOK

(Advancedな話:次のページで紹介するコードだと、推移先候補は2次元平面状に一様分布しない。もしそうしたければ、2次元のヤコビアンであるrを考慮して、それに比例する形で半径方向の乱数を生成しないとだめ。興味ある方は乱数生成法の書物を読もう。私のやり方でも対称性はよく、詳細釣り合いの条件を壊すわけではないのでサンプリング自体には影響ない&本稿の本題ではないので割愛)

メトロポリス法で2次元正規乱数を生成 in R-1

Page 20: マルコフ連鎖モンテカルロ法入門-2

#不変分布返却関数。前回同様規格化因子は必要ないInvariantDistribution <- function(x,cov.mat){ return(exp(-0.5*t(x)%*%solve(cov.mat)%*%x))}#推移したい次の状態を返却する関数。角度と半径を指定して移動先を極座標のノリで決めてみたNextState <- function(x,dr){ radius <- dr*runif(1) theta <- 2*pi*runif(1) return(x + matrix(dr* c(cos(theta),sin(theta)),nrow=2))}size <- 10000 #サンプリング回数result <- c() #結果格納dr <- 1 #次の状態を決める時に使う適当な定数。深い意味はなしcov.mat <- matrix(c(1,0.5,0.5,1),nrow=2)#共分散(分散1にしてるので、=相関行列)state.now <- matrix(0,nrow=2)#現在の状態(位置)#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- cbind(result,state.now) #遷移したい次の天気を指定 state.next <- NextState(state.now,dr) #メトロポリス法による推移確率の計算 transition.probability <- min(1, InvariantDistribution(state.next,cov.mat)/InvariantDistribution(state.now,cov.mat)) #推移確率に応じて状態を推移(ifelseのままだと値1個しか返してきよらんかった・・・) if(transition.probability > runif(1)){ state.now <- state.next }}

メトロポリス法で2次元正規乱数を生成 in R-2

Page 21: マルコフ連鎖モンテカルロ法入門-2

メトロポリス法で2次元正規乱数を生成 in R-3

#平均値と標準偏差、相関行列。

> apply(result,1,mean)[1] 0.00603927 -0.01952479> apply(result,1,sd)[1] 1.014926 1.019436> cor(t(result)) [,1] [,2][1,] 1.0000000 0.5099159[2,] 0.5099159 1.0000000

#結果の表示plot(t(result))

Page 22: マルコフ連鎖モンテカルロ法入門-2

メトロポリス法で2次元正規乱数を生成 in R-4

#多次元正規分布を発生できるRのライブラリと比較(目視)install.packages("mvtnorm")#未インストールの場合library(mvtnorm)cov.mat <- matrix(c(1,0.5,0.5,1), ncol=2)#相関行列は同じplot(rmvnorm(10000,c(0,0),cov.mat))

自作マルコフ連鎖モンテカルロ法

(前ページの図)

mvtnormパッケージより

Page 23: マルコフ連鎖モンテカルロ法入門-2

■「正規分布に従う乱数なんてすぐ作れますわ。マルコフ連鎖モンテカルロ法なんていらないですわ…」と言われそう

■それならば 「exp(-(x+7))」(1次元,x>=-7で左記値,それ以外では0)に従うような乱数を発生させてみようではないか!

■よくやる方法だと「逆関数法」を使うが、累積分布関数の逆関数を計算しないといけない。おまけに規格化も気にしないといけない・・・

メトロポリス法でよくわからん分布を生成 in R-1

マルコフ連鎖モンテカルロ法なら超簡単!(1次元正規分布のコードを1行修正でおしまい!)

Page 24: マルコフ連鎖モンテカルロ法入門-2

■プログラムの変更点(1次元正規分布のコードを流用) ・不変分布の返却値をよくわからない分布へ変更(これだけ!)

■アルゴリズムは正規分布のものとまったく同じ■えっ、これだけでいいんですか!?⇒いいんです、これでマルコフ連鎖モンテカルロ法の汎用性がわかってもらえたと思います■もちろん、ここで提案したよくわからん分布以外のよくわからん分布でもよいのです!

メトロポリス法でよくわからん分布を生成 in R-2

よくわからん分布の形はこんな感じ⇒

Page 25: マルコフ連鎖モンテカルロ法入門-2

#よくわからん不変分布返却関数InvariantDistribution <- function(x){

return(ifelse(x>=-7,exp(-(x+7)),0))}#推移したい次の状態(以前はお天気、今は位置)を返却する関数#適当でいいので今回は-0.5~0.5の一様乱数で移動先候補を決めたNextState <- function(x,dx){ return(x+dx*(runif(1)-0.5))}size <- 10000 #サンプリング回数result <- c() #結果格納dx <- 10 #次の状態を決める時に使う適当な定数。値自体に深い意味はなしstate.now <- 0 #現在の状態(位置)#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- c(result,state.now) #遷移したい次の天気を指定 state.next <- NextState(state.now,dx) #メトロポリス法による推移確率の計算 transition.probability <- min(1, InvariantDistribution(state.next)/InvariantDistribution(state.now)) #推移確率に応じて状態を推移 state.now <- ifelse(transition.probability > runif(1),state.next,state.now) }

メトロポリス法でよくわからん分布を生成 in R-3

Page 26: マルコフ連鎖モンテカルロ法入門-2

メトロポリス法でよくわからん分布を生成 in R-4

#平均と標準偏差もみておく#たぶん手計算の値に近い(はず!)> mean(result)[1] -5.995345> sd(result)[1] 1.056846

#結果の表示(ヒストグラムとして結果表示&よくわからん分布重ねがき)hist(result,breaks=length(result)^0.5,freq=FALSE)lines(seq(-7,0,0.01),exp(-(seq(-7,0,0.01)+7)),col=2,lwd=5)

Page 27: マルコフ連鎖モンテカルロ法入門-2

4:熱浴法とメトロポリスヘイスティング法

Page 28: マルコフ連鎖モンテカルロ法入門-2

熱浴法とメトロポリスヘイスティング法

■今まではメトロポリス法を用いて、詳細釣り合いの条件を満たすように推移確率を決めてきた

■しかし、メトロポリス法は詳細釣り合いの条件を満たす1手法でしかなく、詳細釣り合いの条件を満たすような手法は他にも存在

1:熱浴法(ギブスサンプラー)2:メトロポリスヘイスティング法という2つの他の推移確率決定法について見てみる

Page 29: マルコフ連鎖モンテカルロ法入門-2

■熱浴法では現在の状態(位置)から次の状態を決める際にある1次元の状態だけ変更を行う(実際は複数次元の状態を同時に変更してもよい。ただいろんな資料を見るとだいたい1次元ずつ変更してる)

■上の操作を全次元に対して適用したものを1ステップと考える(教科書がおおい。正確な定義は知らないので原著論文を読もう!)

■というわけで、2次元以上の分布じゃないとありがたみがないので以下2次元正規分布で考える。パラメーターは本稿「メトロポリス法で2次元正規乱数を生成」に合わせる(平均0、分散1、相関0.5)

熱浴法(ギブスサンプラー)-1

Page 30: マルコフ連鎖モンテカルロ法入門-2

■熱浴法では以下のように推移確率を決定

熱浴法(ギブスサンプラー)-2

※状態x,x'が離散的な場合。連続の場合は和が積分に変わる

x_0が与えられたという条件の下での条件付サンプリングとして定義される(これをx_0についても実行し1ステップとする)

Page 31: マルコフ連鎖モンテカルロ法入門-2

■熱浴法が詳細釣り合いの条件満たすことの証明

熱浴法(ギブスサンプラー)-3

※ここでは2次元の分布を考えて、状態更新する際にある1次元の状態のみを動かたケース(前頁参照)を証明している。一般の場合も同様に可能

Page 32: マルコフ連鎖モンテカルロ法入門-2

■熱浴法のメリット メトロポリス法と違って、推移確率が規格化されている(定義式の両辺をx'_1で和(or積分)を取ってみよ!)ので、いちいち推移先候補選択をしなくてよい。(もともと推移先候補選択という処理はメトロポリス法が2つの状態間の関係だけを考慮して作られてら生じたものだった!前回の資料参照)

■熱浴法のデメリット 条件付の分布から乱数を引かないといけないので、それが不明なものについては扱えない

熱浴法(ギブスサンプラー)-4

ラッキーな事に、正規分布は条件付が計算できるのでそれで実際にやってみよう! with R!

Page 33: マルコフ連鎖モンテカルロ法入門-2

■条件付確率は2次元正規分布の指数の肩部を以下のように整理できるので※分散1にしてるので共分散行列=相関行列

熱浴法で2次元正規乱数を生成 in R-1

と条件付確率計算することができる。※x_0の条件付確率もまったく同様。この場合、上式でx_0とx_1を入れ替えるだけ

Page 34: マルコフ連鎖モンテカルロ法入門-2

■アルゴリズム Step0:最初の状態(=位置)をてきとーに決める Step1:熱浴法で条件付確率からサンプリング(x_1) Step2:熱浴法で条件付確率からサンプリング(x_0) ※更新したx_1を使う Step3:気が済んだ⇒End、気が済まない⇒Step1へ

■メトロポリス法のように乱数を振って推移先候補を選択することはない(前述)■従って、その分高速になる■その反面、条件付確率をあらかじめ求めておかないといけない

熱浴法で2次元正規乱数を生成 in R-2

Page 35: マルコフ連鎖モンテカルロ法入門-2

#条件付分布関数

#標準正規分布を発生させて平均と分散を調整し、望む条件付確率にしているConditionalDistribution <- function(fixed,correlation){

return(correlation*fixed + sqrt(1-correlation^2)*rnorm(1))}size <- 10000 #サンプリング回数result <- c() #結果格納correlation <- 0.5 #相関state.now <- matrix(0,nrow=2)#現在の状態(位置)#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- cbind(result,state.now) #熱浴法による推移計算,前回のx.0を使ってx.1を決めて、そのx.1を使ってx.0を更新する

x.1 <- ConditionalDistribution(state.now[1,1],correlation) x.0 <- ConditionalDistribution(x.1,correlation) #状態の更新 state.now <- matrix(c(x.0, x.1),nrow=2)}

熱浴法で2次元正規乱数を生成 in R-3

Page 36: マルコフ連鎖モンテカルロ法入門-2

#平均値と標準偏差、相関行列。

> apply(result,1,mean)[1] -0.01151708 -0.01209051> apply(result,1,sd)[1] 1.0034438 0.9926755> cor(t(result)) [,1] [,2][1,] 1.000000 0.495733[2,] 0.495733 1.000000

#結果の表示plot(t(result))

熱浴法で2次元正規乱数を生成 in R-4

Page 37: マルコフ連鎖モンテカルロ法入門-2

メトロポリスヘイスティング法-1

■実は今までの3つの手法で一番一般的な形■メトロポリス法、熱浴法 ∈ メトロポリスヘイスティング法(メトロポリス法、熱浴法はメトロポリスヘイスティング法の特殊ケース!■そのメトロポリスヘイスティング法では推移確率を

と決定する。ここでQ(x,x')はxという状態にいるときにx'という状態が選択される確率です。

Q(x,x')を適切に選ぶことでメトロポリス法・熱浴法が再現される

Page 38: マルコフ連鎖モンテカルロ法入門-2

メトロポリスヘイスティング法-2

■Q(x,x')=Q(x',x)とすると、約分されて・・・

となってメトロポリス法が再現される。■残ったQ(x,x')は「どの状態に推移するか」を決める確率に対応している(今まではあえて分離して考えていたのだった!前回の資料参照)■本稿「メトロポリス法で正規乱数を生成 in Rの解説」で書いた「詳細釣り合いの条件を満たすように「x→x'」への推移と「x'→x」への推移が候補として選択される確率を等しくする」とはまさにこの事!

Page 39: マルコフ連鎖モンテカルロ法入門-2

メトロポリスヘイスティング法-3

■Q(x,x')=Pr{x' | x}とすると

となって熱浴法が再現される。

これで「メトロポリスヘイスティング法∋熱浴、メトロポリス法」となることがわかった。

Page 40: マルコフ連鎖モンテカルロ法入門-2

メトロポリスヘイスティング法-4

■メトロポリスヘイスティング法が詳細釣り合いの条件満たすことの証明(Pr{x}Q(x,x') > Pr{x'}Q(x',x)と仮定。不等号逆の時も同様に証明可能)

※メトロポリスヘイスティング法 ∋ 熱浴法、メトロポリス法なんで、自動的に熱浴法、メトロポリス法でも詳細釣り合いの条件が成立する!

Page 41: マルコフ連鎖モンテカルロ法入門-2

5:まとめ

Page 42: マルコフ連鎖モンテカルロ法入門-2

まとめ-1

■お天気推移モデルの拡張として、連続モデルを紹介。それは有限個のお天気を扱うかわりに無限個の状態を扱うものであった

■無限個の状態を扱う連続モデルの1例として1次元・2次元の正規分布に従う乱数をマルコフ連鎖モンテカルロ法で生成(with R!)

■マルコフ連鎖モンテカルロ法は非常に汎用的な手法で、欲しい分布を不変分布としてプログラムに入れればほとんどプログラムを修正することなしに簡単に手に入ることを「よくわからない分布」を生成することで示した

Page 43: マルコフ連鎖モンテカルロ法入門-2

まとめ-2

■メトロポリス法以外にも、推移確率を詳細釣り合いの条件を満たすように決定する手法は存在する。その例として熱浴法・メトロポリスヘイスティング法を紹介

■メトロポリス法、熱浴法 ∈ メトロポリスヘイスティング法

■Next Steps are ....  ・入門編は終わったので応用編へ  (モンテカルロ積分、ベイズ推定への応用)  ・拡張アンサンブル法へ?(実はお師匠の技ーっ!)  ・・・・・・・etc  (最近、モンテカルロフィルタの勉強したいんでそれやるかも)