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

71,517 views

Published on

※ここで解説しているお天気推移モデルはオリジナルなものですので、数値・計算等にミスがある可能性が否めませんので、もし間違いを見かけた方は優しく教えていただけると助かります。

お天気推移モデルで理解するマルコフ連鎖モンテカルロ法。2状態離散モデルの解説を中心に、メトロポリス法の解説まで行った。

次は連続モデルや熱浴法・メトロポリスヘイスティング法の解説資料も作成したい⇒完成。以下のLINKを参照下さい。http://www.slideshare.net/teramonagi/ss-5344006

誤字を修正(2010/11/01)

Published in: Technology
1 Comment
144 Likes
Statistics
Notes
No Downloads
Views
Total views
71,517
On SlideShare
0
From Embeds
0
Number of Embeds
4,961
Actions
Shares
0
Downloads
832
Comments
1
Likes
144
Embeds 0
No embeds

No notes for slide

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

  1. 1. マルコフ連鎖モンテカルロ法入門ー1~お天気推移モデルで理解するマルコフ連鎖モンテカルロ法~ @teramonagi
  2. 2. ご注意本資料は個人的な勉強会のために作成したものです。本情報の内容については万全を期しておりますが、その内容を保証するものではありません。これらの情報によって生じたいかなる損害についても、情報提供者は一切の責任を負いません。なお、本資料における意見、見解等はすべて筆者の個人的なものであり、筆者の属する組織の意見、見解等ではないことをあらかじめご了承ください。
  3. 3. Contents1:マルコフ連鎖モンテカルロ法とは2:お天気推移モデルで見るマルコフ連鎖の特徴3:お天気推移モデルのマルコフ連鎖をつくる4:そしてマルコフ連鎖モンテカルロ法へ5:まとめ
  4. 4. 1:マルコフ連鎖モンテカルロ法とは
  5. 5. マルコフ連鎖モンテカルロ法とは-1■【マルコフ連鎖】【モンテカルロ法】と二つの語から成る■【マルコフ連鎖】 1個前の状態だけによって次の状態が決まる連鎖(高校数学でいう数列の所にあった漸化式)。例えば明日の株価は1年前の株価もおとといの株価も関係なくて、今日の株価だけから決まるということ。小難しく書くと(理解しなくてOK)となる。当然、言ってる事は上と全く同じ。 ■【モンテカルロ法】モンテカルロ法とはシミュレーションや数値計算を乱数を用いて行なう手法の総称。なんで、サイコロを振ってシミュレーションしてもモンテカルロ法になる。
  6. 6. マルコフ連鎖モンテカルロ法とは-2■【マルコフ連鎖モンテカルロ法】皆様方のお好きな、任意の分布(正規分布でも、よくわからん関数形の分布でもなんでもOK!)を不変分布(詳細は後述)に持つマルコフ連鎖を設計・生成することで、望む分布に従った乱数を生成するモンテカルロ法のこと マルコフ連鎖モンテカルロ法を説明する前に、次の章 でまず具体的なマルコフ連鎖の例とその特徴について 見る。
  7. 7. 2:お天気推移モデルで見るマルコフ連鎖の特徴
  8. 8. お天気推移モデルの定義■日々のお天気が以下のようなマルコフ連鎖に従って推移するようなモデルを考える ・今日晴の場合、明日晴である確率:1/2 明日の天気が今日の 天気だけから決まっ ・今日晴の場合、明日雨である確率:1/2 ているのでマルコフ連 ・今日雨の場合、明日晴である確率:2/3 鎖の条件を満たす! ・今日雨の場合、明日雨である確率:1/3
  9. 9. お天気推移モデルの計算例(図の読み方)■計算例 今日は晴だとしておくと、モデルの仮定(天気の推移確率)から  明日晴の確率 = 1/2 明日雨の確率 = 1/2となる 
  10. 10. お天気推移モデルのクイズ問題:明後日晴・雨である確率はそれぞれいくつ? 明後日晴の確率 = 明日晴の確率 × 1/2 + 明日雨の確率 × 2/3             = 1/2 × 1/2 + 1/2 × 2/3 = 7/12 明後日雨の確率 = 明日晴の確率 × 1/2 + 明日雨の確率 × 1/3            = 1/2 × 1/2 + 1/2 × 1/3 = 5/12
  11. 11. お天気推移モデルの満たすべき漸化式■漸化式(高校数学の数列)による一般化 F_t : (今日から見て)t日後に晴である確率 R_t : (今日から見て)t日後に雨である確率とすると、F_t,R_tは以下の漸化式を満たす  
  12. 12. お天気推移モデルの満たすべき漸化式を解くー1この漸化式は、                とおくことで、解くことができる     (行列の対角化を使用してもOK)数列でいう初項であるt=0(今日)のお天気確率を何でもいいのだけれどもあらかじめ以下のように指定する。今日の天気は100%晴だという意味
  13. 13. お天気推移モデルの満たすべき漸化式を解くー2■センター試験を思い出して解いてみると・・・として、解くことができる。さて、ここでtを無限大に持っていくと、-1/6の絶対値は1よりも小さいのでt乗の項が消えてtに依存しない定数だけが残る。これがマルコフ連鎖の大事な大事な性質である不変分布への収束というものである。
  14. 14. お天気推移モデルの満たすべき漸化式を解くー3さらに、この不変分布を先ほどの漸化式の右辺に突っ込んでみると…となる。従って、不変分布はという式を満たす分布ともいうことができる。一般にはここの推移確率はなんでもよくて、推移させても分布が変わらなければOK
  15. 15. お天気推移モデルの不変分布について■以上の考察から、t日後のお天気確率は、t→∞極限で不変分布に到達することがわかった■ここで設定したお天気推移モデルの場合、確率(晴)=4/7、確率(雨)=3/7となるような確率分布が不変分布になっている■湧き上がる疑問 ⇒どんな感じで不変分布へと収束していくのか? ⇒初項に対する依存性はあるのか?■以上、2つの疑問をRによる数値計算で確認してみる
  16. 16. お天気推移モデルの不変分布をRで見るー1■どのような数値計算を行うか? -漸化式を逐次的に解いていく(初項はさっきと同じ) ・・・・・・・・・・・・・・・・・・・・・・・・・・・
  17. 17. お天気推移モデルの不変分布をRで見るー2#数日後の天気確率計算関数#weather.initial_:#transition.matrix_:お天気遷移行列#size_:何日間の遷移を計算するのかTranslateWeather <- function(weather.initial_,transition.matrix_,size_){ result <- matrix(NA, nrow = size_ + 1, ncol = nrow(weather.initial_)) result[1,] <- t(weather.initial_) weather.day <- weather.initial_ for(day in 1:size_){ weather.day <- transition.matrix %*% weather.day result[day + 1,] <- t(weather.day) } return(result)}#状態遷移行列として以下のような遷移確率#晴⇒晴:1/2、晴⇒雨:1/2、雨⇒晴:2/3、雨⇒雨:1/3transition.matrix <- matrix(c(1/2,1/2,2/3,1/3), nrow = 2, ncol = 2)#今日の天気(初期状態)としては晴を指定weather.initial <- matrix(c(1.0,0.0),nrow = 2)#天気の推移計算size <- 10weather.transition <- TranslateWeather(weather.initial, transition.matrix, size)matplot(weather.transition,lwd = 3, ylab="確率", xlab="何日後", type = "l", lty = 1, col=c("red","blue"))legend(nrow(weather.transition)- 4, 1, legend = c("晴","雨"), col=c("red","blue"), lty = 1)
  18. 18. お天気推移モデルの不変分布をRで見るー3漸化式に従ってどんどん計算していくと晴の確率が4/7 = 0.5714286...雨の確率が3/7 = 0.4285714...    に収束していく様子がわかる!
  19. 19. お天気推移モデルの不変分布をRで見るー4■初項のみを変えて再度計算 ここだけ変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・
  20. 20. お天気推移モデルの不変分布をRで見るー5#数日後の天気確率計算関数#weather.initial_:#transition.matrix_:お天気遷移行列#size_:何日間の遷移を計算するのかTranslateWeather <- function(weather.initial_,transition.matrix_,size_){ result <- matrix(NA, nrow = size_ + 1, ncol = nrow(weather.initial_)) result[1,] <- t(weather.initial_) weather.day <- weather.initial_ for(day in 1:size_){ weather.day <- transition.matrix %*% weather.day result[day + 1,] <- t(weather.day) } return(result)}#状態遷移行列として以下のような遷移確率#晴⇒晴:1/2、晴⇒雨:1/2、雨⇒晴:2/3、雨⇒雨:1/3transition.matrix <- matrix(c(1/2,1/2,2/3,1/3), nrow = 2, ncol = 2)#今日の天気(初期状態)として以下を指定 c(0.5,0.5)weather.initial <- matrix( ,nrow = 2)#天気の推移計算size <- 10weather.transition <- TranslateWeather(weather.initial, transition.matrix, size)matplot(weather.transition,lwd = 3, ylab="確率", xlab="何日後", type = "l", lty = 1, col=c("red","blue"))legend(nrow(weather.transition)- 4, max(weather.transition), legend = c("晴","雨"), col=c("red","blue"), lty = 1)
  21. 21. お天気推移モデルの不変分布をRで見るー6初項を変更したこのケースでも、やっぱり晴の確率が4/7 = 0.5714286...雨の確率が3/7 = 0.4285714...    に収束していく
  22. 22. お天気推移モデルで見るマルコフ連鎖の特徴■漸化式(マルコフ連鎖!)に従って日々のお天気確率を計算していくと、それはある程度tが大きくなった所で、tに依存しないある不変分布へと辿りつく■この不変分布は初項に依存しない(ような挙動を示す程度のことしかここでは言えない・・・) 数式を使った詳しい話は 「計算統計 2 マルコフ連鎖モンテカルロ法とその周辺」 の伊庭先生の章がvery good !
  23. 23. 3:お天気推移モデルのマルコフ連鎖をつくる
  24. 24. マルコフ連鎖を作るとは何か?■お天気推移モデルに従って天気を何日も推移させて、日々のお天気推移を記録した配列を得ること■発想としてはスゴロクとほぼ同じ。難しくない■次のページでスゴロクっぽく具体例を紹介
  25. 25. お天気推移モデルをスゴロクのように書く■スタートのマスを晴にするか雨にするかてきとーに決める■以下を気が済むまでループ ■今いるマスの天気に応じた処理の実行 if(今いるマスの天気が晴の場合)  ・サイコロを振って偶数の目が出た⇒晴のマスのまま  ・サイコロを振って奇数の目が出た⇒雨のマスへ移動  (推移確率:晴⇒晴:1/2,晴⇒雨:1/2をサイコロで表現) elseif(今いるマスの天気が雨の場合)  ・サイコロを振って1~4までの目が出た⇒晴のマスへ移動  ・サイコロを振って5か6の目が出た⇒雨のマスのまま  (推移確率:雨⇒晴:2/3,雨⇒雨:1/3をサイコロで表現) ■今いるマスの天気をメモして、日付を一日更新。次のループへ
  26. 26. スゴロクの結果を表にしてみました■10日でおしまいにしたお天気推移モデルスゴロクをN回やってみると、例えば以下のような結果が得られる。(スタートのマスは晴とした)シミュレー 1日目の 2日目の 3日目の ・・・ 9日目の 10日目のション番号 お天気 お天気 お天気 お天気 お天気 1 2 ・・・ N
  27. 27. 2章との関係-1■下表のように、日ごとにグルーピングして、各グループごとに晴の回数/N、雨の回数/Nを計算してみると・・・シミュレー 1日目の 2日目の 3日目の ・・・ 9日目の 10日目のション番号 お天気 お天気 お天気 お天気 お天気 1 2 ・・・ N
  28. 28. 2章との関係-2【クイズ】さて、これはN→∞の極限において何と一致するでしょうか(ヒント:サイコロを100回振って、【6の目が出た回数】/100を計算するのとまったく同じ)
  29. 29. 2章との関係-3【正解】まさに2章で計算した各日のお天気確率 シミュレーショ 1日目の 2日目の 3日目の 9日目の 10日目の ン番号 お天気 お天気 お天気 ・・・ お天気 お天気 1 2 ・・・ N
  30. 30. マルコフ連鎖から得られるサンプルの意味 2章の結果から「マルコフ連鎖に従っ てお天気をどんどん生成していって、 ある程度日数が経過した後には、晴 か雨のお天気が出る確率は、日にち が経過しても変わらない不変分布に 従っている」ということがわかっていたある程度日数が経過した後、マルコフ連鎖から得られるお天気は不変分布からサンプリングしたもの(不変分布に従う乱数!)と見做して良い
  31. 31. 実際の数値計算では・・・実際にマルコフ連鎖モンテカル法を使って乱数を生成するときには、N=1としておしまいの日付であるTを大きくした計算をすることが多いです。そして、不変分布に到達してない部分を捨てて、残りの部分を不変分布からのサンプルだとします。 ↑↓ここだけ使うシミュレー 1日目の 2日目の 3日目の 9日目の 10日目の T日目のション番号 お天気 お天気 お天気 ・・・ お天気 お天気 ・・・ お天気 1
  32. 32. 不変分布からのサンプリングの実装■では、今の話が本当か数値的にチェック!■使う言語は・・・ -マルコフが枕元で「Rを使え」と言うのでRを使います■計算の仕様 -不変分布に従うように"晴"という文字が4/7、"雨"という文字が3/7の確率で出現するような計算を2通りのやり方で実施  1:if-elseで不変分布を既知としてサンプリング   (よくやるサンプリング、比較の意味で登場させた)  2:お天気推移モデルを使ってサンプリング   (さきほどのスゴロクアルゴリズムを実装したもの。これがマルコフ連鎖モンテカルロ法によるサンプリング)   
  33. 33. ~不変分布からのサンプリングの実装-1~1:if-elseで不変分布を既知としてサンプリング #サンプリング回数 size <- 10000 #サンプリング."晴"が4/7の確率で出るようにしている。逆に雨は3/7の確率 result <- ifelse(runif(size) > 3/7, "晴", "雨") #結果表示、標本から確率を計算 print(sum(result=="晴")/size) print(sum(result=="雨")/size) 計算結果 > print(sum(result=="晴")/size) [1] 0.5775 > print(sum(result=="雨")/size) [1] 0.4225
  34. 34. ~不変分布からのサンプリングの実装-2~2:お天気推移モデルを使ってサンプリング#晴⇒晴:1/2,雨⇒雨:1/3な推移確率transition <- c(Fine=1/2,Rain=1/3)size <- 10000 #サンプリング回数result <- c() #結果格納weather.now <- "晴" #現在のお天気#マルコフ連鎖の生成&不変分布からのサンプリング.for(i in 1:size){ result <- c(result,weather.now) #現在の状態に応じて次の状態を決める⇒マルコフ連鎖の生成 if(weather.now=="晴"){ weather.now <- ifelse(runif(1) > transition["Fine"],"晴","雨")  }else if(weather.now=="雨"){ weather.now <- ifelse(runif(1) > transition["Rain"],"晴","雨")  }} > print(sum(result[-(10:1)]=="晴")/(size-10))#結果表示、標本から確率を計算#初めの10個は不変分布に達してないと思って捨てる [1] 0.5705706print(sum(result[-(10:1)]=="晴")/(size-10)) > print(sum(result[-(10:1)]=="雨")/(size-10))print(sum(result[-(10:1)]=="雨")/(size-10) [1] 0.4294294
  35. 35. 不変分布からのサンプリングの実装-3■2通りのやり方でお天気推移モデルからのサンプリングをした。どちらも(確率分布としての)不変分布に従ったサンプリングとなっている■1のやり方を一般化すると逆変換法という乱数生成手法になる(機会があれば別資料で。。。)■2のやり方では、お天気推移モデルをスゴロクアルゴリズムそのまんまを使ってサンプリングした。これはマルコフ連鎖モンテカルロ法によるサンプリングの例となっている(手法名はない・・・と思う)
  36. 36. お天気推移モデルのマルコフ連鎖をつくる■マルコフ連鎖を作るということは、スゴロクをするようなものだ■そのスゴロクをやり続けていると、それはいつの間にか不変分布からのサンプリングをしていることに等しかった次の章で、マルコフ連鎖モンテカルロ法をより詳しく見る
  37. 37. 4:そしてマルコフ連鎖モンテカルロ法へ
  38. 38. マルコフ連鎖モンテカルロ法の発想■今までのお天気推移モデルではお天気の推移確率が与えられていて、そこから不変分布を出すということを行ったマルコフ連鎖モンテカルロ法の発想では、逆に望む不変分布を持つように推移確率を与える(=マルコフ連鎖を設計する)にはどうしたらよいのだろうか?
  39. 39. 推移確率決定の指針~詳細釣り合いの条件1~■「望む不変分布を得るためにどのように推移確率を与えるか、マルコフ連鎖を設計するのか?」という問いに対する1つの解として詳細釣り合いの条件を満たすように推移確率を決めるという1手段がある(あくまで1手段でありマルコフ連鎖であるための十分条件でしかない、必要条件ではない)■詳細釣り合いの条件の具体例:お天気推移モデル不変分布 晴⇒雨の 不変分布 雨⇒晴の晴の確率 推移確率 雨の確率 推移確率という関係を満たすように推移確率を決定する
  40. 40. 推移確率決定の指針~詳細釣り合いの条件2~■詳細釣り合いの条件を満たせば本当に不変分布になるのか、お天気推移モデルでチェック! ↑詳細釣り合いの条件で消える確かに不変分布が満たすべき式を満たしている。(本稿「お天気推移モデルの満たすべき漸化式を解くー3」を参照)
  41. 41. 推移確率決定の指針~詳細釣り合いの条件3~■一般の場合、x、xをある状態(お天気の数がたくさん、つまり晴,雨,雪,台風...みたいに増えたとして、そのどれかがx,xに対応)とし、Π_x→xを状態xからxへの推移確率(=お天気の推移確率)、Pr{x}を不変分布において状態xが起こる確率だとすると■詳細釣り合いの条件はと書ける。(x,xに晴,雨、Pr{x},Pr{x}に4/7,3/7を入れればさきほどのお天気推移モデルでの具体例になる)
  42. 42. 推移確率決定の指針~詳細釣り合いの条件4~■詳細釣り合いの条件を満たせば不変分布になる事の証明(あるxについて成立することを示す。行列でいうと1行を証明) ↑ ↑ お天気推移モデルの一般化式 詳細釣り合いの条件 ↓ ↓推移確率の和は1 Q.E.D
  43. 43. 詳細釣り合いの条件からメトロポリス法へ■お天気モデルの詳細釣り合いの条件再掲不変分布 晴⇒雨の 不変分布 雨⇒晴の晴の確率 推移確率 雨の確率 推移確率■未知数2つ(推移確率)に式1本(詳細釣り合いの条件)なんで、推移確率が一意に決まらない決め方にも種類が色々。代表的な推移確率の決め方として 1:メトロポリス法 2:熱浴法(ギブスサンプラー)  3:メトロポリス・ヘイスティング法 がある。ここではメトロポリス法だけ紹介。
  44. 44. メトロポリス法でお天気推移モデルー1■メトロポリス法による推移確率の決め方(不変分布の比を計算する。そのため7はキャンセルされる。これがとてもありがたい性質で不変分布は規格化しておく必要がないことを意味する。本稿でも以降のスクリプトは一応、不変分布の和が1になるように規格化してあるが規格化因子なしでも同様の結果を返す)■↓の詳細釣り合いの条件を満たしていることがわかる
  45. 45. メトロポリス法でお天気推移モデルー2■この推移確率で不変分布を推移させてみると・・・■お天気推移モデルとしてはじめに設定しておいた推移確率とは違うけれども、ちゃんと不変分布が出てくる!同じ不変分布を作る推移確率はたくさんあるということ
  46. 46. メトロポリス法をRでやってみる-1■基本、前述のスゴロクアルゴリズムと同じ(これもマルコフ連鎖モンテカルロ法によるサンプリングの1つではあった!)■異なる点は、メトロポリス法を使ってスゴロクのマスを移動していく(お天気推移の仕方)点、つまりマルコフ連鎖の生成法が違う■コード自体はこのお天気モデルだけでなくて、一般の場合でも使いやすいように書いておく
  47. 47. メトロポリス法をRでやってみる-2#不変分布を返す関数InvariantDistribution <- function(weather){ ifelse(weather=="晴",4/7,3/7)} 結果#推移したい次の天気を返却NextWeather <- function(weather){ > print(sum(result[-(10:1)]=="晴")/(size-10)) return(ifelse(weather=="晴","雨","晴")) [1] 0.5691692}size <- 10000 #サンプリング回数 > print(sum(result[-(10:1)]=="雨")/(size-10))result <- c() #結果格納 [1] 0.4308308weather.now <- "晴" #現在のお天気#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- c(result,weather.now) #遷移したい次の天気を指定(一般化したときのためにこう書いてる) weather.next <- NextWeather(weather.now) #メトロポリス法による推移確率の計算 transition.probability <- min(1, InvariantDistribution(weather.next)/InvariantDistribution(weather.now)) #推移確率に応じて状態を推移 weather.now <- ifelse(transition.probability > runif(1),weather.next,weather.now)}#結果表示、標本から確率を計算print(sum(result[-(10:1)]=="晴")/(size-10))print(sum(result[-(10:1)]=="雨")/(size-10))
  48. 48. メトロポリス法(一般の場合)ー1■一般の場合、x、xをある状態ベクトル(x,xにはお天気が入ると考える。2状態ではなく晴,雨,雪,台風...みたいにたくさんあると考える)とし、Π_x→xを状態xからxへの推移確率(=お天気の推移確率)、Pr{x}を不変分布において状態xが起こる確率だとすると■メトロポリス法はと書ける。(x,xに晴か雨、Pr{x},Pr{x}に4/7か3/7を対応させて代入すればさきほどのお天気推移モデルでの具体例になる)
  49. 49. メトロポリス法(一般の場合)ー2■教科書にあまり明示的に書いていない大事なことこのままの推移確率を使おうと思うと、各天気ごとの推移確率の和が1にならない■一般の場合の具体例として、下図のように3つのお天気推移モデルを構築して考察※この図でいう確率は推移確率ではなく不変分布
  50. 50. メトロポリス法(一般の場合)ー3■メトロポリス法から推移確率を計算、結果は下図■橙色丸印の箇所を足しただけでも2(>1)!なんで推移確率が規格化されていない事がわかる 黒字:不変分布※暇なら今までの例が 赤字:推移確率全部規格化されてるか確認してみよう
  51. 51. メトロポリス法(一般の場合)ー4■これは”次にどのお天気に推移するのか?”を決定する過程が抜けているため(今計算している推移確率は、例えば”次の推移候補先は雨だ!”という条件付きの推移確率と考えてもよい)■なんでこんなことになるのかというと、詳細釣り合いの条件は推移元と推移先、2つのお天気ペアについての性質を決めるものであって、全体の推移を特徴付けるものではないから(「規格化?俺は2つのお天気ペアの事しか知ったこっちゃねーよ!」という感じ)
  52. 52. メトロポリス法(一般の場合)ー5■ここでは次の推移先候補を単純に一様乱数で決める(推移候補先のお天気がみんな等しい確率で出現)。無論、欲しい確率分布にうまくマッチした”うまい”決め方があったりもする■一様に決めるとは例えば晴の次は"雨"か"雪"が推移先候補だが、その選択される確率が雨・雪共1/2ということ■要するに前述の推移確率を全部1/2するということ(同じお天気に推移する確率は規格化条件から決まる)
  53. 53. メトロポリス法(一般の場合)ー6■推移確率を1/2しても詳細釣り合いの条件は両辺1/2倍されただけなのでちゃんと成立※ちなみに晴・雨だけの2状態モデルの時は推移先が1個しかないのでこの問題は生じなかった。1/1倍しても意味はないweb上にあるメトロポリス法のアルゴリズムを読むと、だいたい ・現在の状態から(ランダムに)変化させた新しい候補点を生成というステップが入っていると思うが、それこそまさにここでいう”次の推移先候補”を決定する過程。その過程をメトロポリス法による推移の過程と分離して記述しているのが通例のよう。前述のプログラムでもあえて分けて書いておいた(NextWeather関数)
  54. 54. メトロポリス法(一般の場合)ー7■推移確率を全部1/2し、お天気推移図を再描画■晴⇒晴等同じお天気推移確率は規格化条件から決定
  55. 55. メトロポリス法をRでやってみる-1■基本、お天気推移モデル(2天気版)とおなじ■異なる点は、NextWeather関数内で乱数(サイコロ)振って次の推移先候補を選定している点■他書の通例に習って、推移先候補選択と実際の推移を分けて記述■アルゴリズムをまとめると Step0:最初のお天気をてきとーに決める Step1:推移候補先を選定(NextWeather関数) Step2:メトロポリス法で決まる推移確率に従って推移 Step3:気が済んだ⇒End、気が済まない⇒Step1へ
  56. 56. メトロポリス法をRでやってみる-2#不変分布を返す関数InvariantDistribution <- function(weather){ ifelse(weather=="晴",4/7,ifelse(weather=="雪",2/7,1/7)) > print(sum(result[-(10:1)]=="}#推移したい次の天気を返却 晴")/(size-10))NextWeather <- function(weather){ [1] 0.5690691  #今の天気以外の天気を作成、1/2で選択 > print(sum(result[-(10:1)]==" weathers <- c("晴","雪","雨") 雪")/(size-10)) weathers <- weathers[weathers!=weather] [1] 0.2917918 return(weathers[round(runif(1))+1]) > print(sum(result[-(10:1)]=="} 雨")/(size-10))size <- 10000 #サンプリング回数result <- c() #結果格納 [1] 0.1391391weather.now <- "晴" #現在のお天気#メトロポリス法によるマルコフ連鎖の生成&不変分布からのサンプリングfor(i in 1:size){ result <- c(result,weather.now) #遷移したい次の天気を指定 weather.next <- NextWeather(weather.now) #メトロポリス法による推移確率の計算 transition.probability <- min(1, InvariantDistribution(weather.next)/InvariantDistribution(weather.now)) #推移確率に応じて状態を推移 weather.now <- ifelse(transition.probability > runif(1),weather.next,weather.now)}
  57. 57. 5:まとめ
  58. 58. まとめ-1■マルコフ連鎖モンテカルロ法とは任意の確率分布に従う乱数を生成するための手法■モンテカルロ法とは乱数を使ったシミュレーションの総称■マルコフ連鎖次の状態(次の日のお天気)を決めるために今の状態(今日のお天気)だけしか必要としない連鎖(=漸化式)■マルコフ連鎖に従ってお天気を推移させていくと、各お天気が出現する確率が日にちに依存しない不変分布へと収束する
  59. 59. まとめ-2■マルコフ連鎖モンテカルロ法では欲しい確率分布がマルコフ連鎖の不変分布となるように(お天気の)推移確率を調整する■その1調整手段が詳細釣り合いの条件。この条件を満たす方法もいろいろあって、ここでは最も基本的なメトロポリス法について紹介■Next Step is ....  ・このモデルは離散状態⇒連続モデルへの拡張   ・熱欲法・メトロポリスヘイスティグ法の解説              ・・・・・・・etc ・・・・・・To be continued

×