2

現在、MonadRandom ライブラリを使用しています。私は計算をしています:

metroChain :: (RandomGen g) => Rand g Double

複数回実行して、結果を順番に出力したいと思います。というか、複数の計算のある種のリストを作成したいと思います。

一度それを行うには、私は使用します

main = do
  result <- evalRandIO metroChain
  print result

また

main = evalRandIO metroChain >>= (\result -> print result)

ただし、任意の (n) 量のmetroChain結果を出力するのに苦労しています。

各結果は、最後の結果の最後に指定された RandomGen を使用する必要があります...それが MonadRandom の動作方法ですよね?

私はreplicateMfmap、および少しトランスフォーマーを調べました (ただし、私の問題への適用を理解するのに十分なほど理解できないようです)。

私が探している機能を実現するのを手伝ってくれる人はいますか? 本当に単純なものが欠けているような気がします。しかし、私はHaskellにはかなり慣れていません。

4

2 に答える 2

4

metroStep飛躍して、それが MCMC メトロポリス - ヘイスティングスの反復であると仮定します。

あなたが抱えている問題は、MH ステップをマルコフにしたいということですが、単にRandomGen状態を共有するだけreplicateM n metroStepでは不十分です。これは、各ステップが独立した確率変数に基づくことができるようにするだけです。比較すると、状態が共有されていない場合、不変性によりすべてが同一であるRandomGenことが保証されます。metroStep

したがって、本当に必要なのは、独立変数サンプルを生成するための疑似乱数のチェーンを提供するための状態と、各ステップで を持つことができる固定状態の両方を持つRandomGenものです。これを行うためにトランスフォーマー スタックを構築します。数日前にこれらのライブラリを使用して MCMC を作成したので、ライブラリを使用します。P(x_i | theta, x_(i-1))mtlrandom-fu

metroStep :: (MonadRandom m, MonadState StateSpace m) => m StateSpace

ここStateSpaceで、観測された変数と観測されていない変数の両方を含む状態空間のポイントです。これは、尤度関数の右側にあるすべてのパラメーターです。さて、replicateM n metroStep :: (MonadRandom m, MonadState StateSpace m) => m [StateSpace]マルコフ系列StateSpace点のリストです。

次に、このモナド スタックの具体的なバージョンを次のように「実行」します。

do steps <- (`runRVar` StdRandom) . (`evalStateT` ss0) $ (replicateM n metroStep)
   mapM_ print steps
于 2013-05-13T11:49:27.337 に答える
3

replicateMランダム計算を構築する際に必要なものです。(電話の推測が正しい場合を除きます。)

foo :: Int -> IO ()
foo n = do
    results <- evalRandIO (replicateM n metroStep)
    mapM_ print results

mapM_次に、実際に結果を印刷するのを支援したいと考えています。

これはあなたが望むことをしますか?拡張してほしいものはありますか?

于 2013-05-13T11:49:39.670 に答える