• ベストアンサー

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