• ベストアンサー

MCMCによるサンプリング

メトロポリス法やギブスサンプリングについて勉強しているのですが、 任意の確率分布を発生させるのにマルコフ連鎖を利用していますが、 わざわざこういう方法を取るメリットは何なのでしょうか? マルコフ連鎖を使うことのメリットでなくてもギブスサンプリングなどのメリットが知りたいです。 確率分布にしたがってサンプルさせたいなら 乱数を発生させて、とる求める各状態の確率の大きさに 0~RAND_MAXを分割して a < rand() < bのときはこの状態を取る b < rand() < cのときはこの状態を取る・・・・ というようにやればいい気がしてしまいます。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

単純な問題の場合には仰る通りわざわざMCMCを使う必要はありません。 MCMCは状態数が多い場合や確率の積分が解析的にできない場合などに使われます。MCMCの強力な点は "各状態の相対確率しか現実的に計算できない場合" でも目的の分布を作り出せる所にあります ("現実的に計算できない" というのは、原理的には計算できても実際に計算をしようとすると途轍もなく時間が掛かるという意味です)。 ■例えば、 > 0~RAND_MAXを分割して > a < rand() < bのときはこの状態を取る > b < rand() < cのときはこの状態を取る・・・・ という方法でサンプリングする場合、予め a, b, c, … という値を全て計算しておかなければなりません。例えば状態に s(1), s(2), …, s(N) と番号をつけて、各状態 s の相対確率を f(s) とします。各状態の確率は p(s) = f(s) / Z; 但し Z は規格化因子:  Z = Σ[i=1~N] f(s(i)) となります(既に f が規格化されているのであれば Z=1)。a(i-1) <= rand() < a(i) の時に状態 s(i) を取る事にすると、これらの係数 a(i) は  a(k) = Σ[i=1~k] p(i) と求められます。状態数 N がそれ程大きくなければこの Z や a(k) を求められるので何とかなりますが、少し大きくなると途端にこの方法は使えなくなります。(例えば、3次元Ising模型の状態列をMCMCで作り出す場合、10x10x10 という小さな格子の場合ですら状態数は N = 2^1000 ~ 10^301 個になります。) そもそも、この様なサンプリングは単に状態列を生成するのを目的とするよりは、何らかの積分・総和(期待値, 相関関数, etc.)を直接計算するのが大変な場合に、MCで評価する為に行われる場合が多い訳です。上記の方法だと、直接積分が大変だからMC法を使うはずなのに、その為に Z や a(k) の直接積分が必要になるので使えません。Z や a(k) の直接積分ができるぐらいならば、直接目的の量を積分できます。 ■上記に示した方法は余りにも愚直ですが、一応問題毎に改良できる可能性はあります。例えば状態を「(確率的に)独立」な確率変数の直積で表すことができれば、それぞれの変数について独立に乱数を生成することができます。この様にする事で実質的に、乱数生成の際の「状態数」を減らす事ができます。状態を複数の変数の直積で書いた時に、それぞれの変数が独立でなくても変数同士の相関が「弱け」れば、変数を独立に生成した後で棄却法などを使って相関を入れる事もできるでしょう。しかし、大抵の場合にはうまく状態を独立な成分に分ける事はできません。それにこの方針だと、問題設定(確率 f の関数形)を少し変えるだけで再度考察を行わなければなりませんし、問題設定を変えた事によってうまく計算できなくなるかもしれません。 一方で MCMC は各状態の相対確率 f(s) さえ計算できればよく f の関数形などに制限もなく、共通の枠組で色々な分布 f(s) に対して計算ができます。

luna3x
質問者

お礼

回答ありがとうございます。 詳しくわかりやすい解説でイメージができました。 いくつかのサイトを見て回ってたんですが 理論や手順はたくさんあってもメリットや使い方などに ついてあまり書かれていなかったので助かりました。 引き続き色々見て学んでいきたいと思います。 ありがとうございました。

関連するQ&A

  • 確率のscilabプログラミングの質問

    この2問を考えているのですが、scilabが全然わからないので苦戦しています。どなたか教えてください。 (1)適当なモデルを作り、対数の法則、中心極限定理をシュミレートし、histplotを活用して、視覚的に中心極限定理が成り立つことを証明せよ。 (2)有限集合上のマルコフ連鎖をシュミレートし、遷移確率(stochastic matrix)や初期分布を各自定めて、マルコフ連鎖の定常分布を求めよ。この連鎖のサンプルを多数生成し、histplotを用いて大きなステップ数の下で連鎖の分布が定常分布に近づくことを確かめよ。

  • マルコフ過程(確率過程)に関する質問です!

    マルコフ連鎖に関する質問です。 下のマルコフ連鎖について 1、定常分布 2、既約になるための必要十分条件 3、p1=p2=1/2、q1=0、q2=1のとき(1)、(3)の再帰性を調べよ という3問がわからず困ってます。 <マルコフ連鎖> r:(1)から(1)に戻る確率 (r=1-p1-q1) p1:(1)から(2)へ移る確率 p2:(2)から(3)へ移る確率 q1:(1)から(3)へ移る確率 q2:(3)から(2) 1-p2:(2)から(1) 1ーq2:(3)から(1) 説明がわかりにくくて申し訳ありません。 かなり困っているので、よろしくお願い致します。

  • マルコフ連鎖モンテカルロ

    マルコフ連鎖モンテカルロ法で、既約で非周期性を満たすマルコフ連鎖の持つ不変分布を、推定パラメータの目標分布となるように推移核を構成する際に、ギブス・サンプラーアルゴリズムを用いることを考えた場合、大きな流れとして何故、推移核をギブスサンプラーで与えられる式を導入することによって、推定したいパラメータの目標分布が不変分布に収束していくのかその原理がよくわかりません。 参考書として、「東洋経済」から出版されている「ベイズ計量経済分析」を用いています。 誰か教えていただけないでしょうか?

  • マルコフ連鎖(確率過程)に関する問題です!

    マルコフ連鎖に関する質問です。 下のマルコフ連鎖について 1、定常分布 2、既約になるための必要十分条件 3、p1=p2=1/2、q1=0、q2=1のとき(1)、(3)の再帰性を調べよ という3問がわからず困ってます。 <マルコフ連鎖> r:(1)から(1)に戻る確率 (r=1-p1-q1) p1:(1)から(2)へ移る確率 p2:(2)から(3)へ移る確率 q1:(1)から(3)へ移る確率 q2:(3)から(2) 1-p2:(2)から(1) 1ーq2:(3)から(1) 説明がわかりにくくて申し訳ありません。 かなり困っているので、よろしくお願い致します

  • マルコフ連鎖の質問です

    至急解答をお願いいたします!!! マルコフ連鎖に関する問題です 下のマルコフ連鎖について 1、定常分布 2、既約になるための必要十分条件 3、p1=p2=1/2、q1=0、q2=1のとき(1)、(3)の再帰性を調べよ という3問がわからず困ってます。 <マルコフ連鎖> r:(1)から(1)に戻る確率 (r=1-p1-q1) p1:(1)から(2)へ移る確率 p2:(2)から(3)へ移る確率 q1:(1)から(3)へ移る確率 q2:(3)から(2) 1-p2:(2)から(1) 1ーq2:(3)から(1) 説明がわかりにくくて申し訳ありません。 かなり困っているので、よろしくお願い致します。

  • 定常なマルコフ連鎖の意味

    定常なマルコフ連鎖の意味 定常なマルコフ連鎖とは定常分布を持つ、非周期的・再帰的・既約なマルコフ連鎖という意味でしょうか? つまり、初期状態に依存しない極限があると判断しても良いのでしょうか?

  • いくつのデータをサンプリングすればいいか?

    数学の初心者です。 あるサンプルデータの配列Aがあり そのA配列の平均値をA'とします Aのデータはいくつでもサンプリング可能なデータです。 このとき、A'を指定の範囲に収めたいという要望が会社の上司からあり、 A'がその指定の範囲に収まる確率をBとして いくつのデータをサンプリングすればいいか、確率Bとともに提示せよと、上司から言われました。 どう計算すればよいのでしょうか? 提供できる情報に足りない要素があれば仰って下さい。

  • 規則に従った乱数

    一様乱数を発生させるプログラムはネット上でも入手できます。ある種の確率密度分布に従った乱数を発生させるにはどうしたらいいでしょうか。 例えば0から1の乱数ですが、平均が0.5で分散が0.2のガウス分布に従った乱数を発生させるとしたら0.5に近いところの値が多く出て、0.9のあたりはあまり出ないということになります。そういう乱数です。 そういうものを乱数というのかどうかわかりませんが。 しかし、物理現象は何らかの分布に従う乱数のようなものと考えることができるのではないでしょうか。 よろしくお願いします。

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • エクセルで0超1未満の乱数を発生する方法

    タイトルの通りです。 EXCELのRAND関数は0以上1未満の乱数を発生しますが、0超1未満の乱数を作る方法を教えて下さい。 確率の検証用に乱数を作りたいのですが、0や1(0%や100%)は除きたいのです。もちろん非常に小さい数でも0でなければ採用したいのですが0だけはダメです。 実用上、RANDでも0は殆ど出ないとは思いますが…あるいは乱数を発生させておいて0になった時だけ再計算させれば良いのかもしれませんが、出来れば再計算無しで最初からそうしたいのです。