誰かPassage、PARallel SAmpler GENerator を使ったことがありますか?
私にとって非常に役立つ可能性がありますが、私が見つけた唯一のドキュメントは、Github の 3 行の README (https://github.com/cscherrer/passage) と、Hackage の簡潔な API です。
それを実行する方法の簡単な例は素晴らしいでしょう!
誰かPassage、PARallel SAmpler GENerator を使ったことがありますか?
私にとって非常に役立つ可能性がありますが、私が見つけた唯一のドキュメントは、Github の 3 行の README (https://github.com/cscherrer/passage) と、Hackage の簡潔な API です。
それを実行する方法の簡単な例は素晴らしいでしょう!
大まかに言うと、パッセージには覚えておくべき 2 つの重要なモナドがあります。BayesianNetwork
とBayesianSimulator
です。
まず、BayesianNetwork モナドでモデルを構築します。
myModel :: Int -> BayesianNetwork (Node, Node, [Node])
myModel n = do
mu <- normal 0 0.001
tau <- improperScale
xs <- replicateM n $ normal mu tau
return (mu, tau, xs)
これは生成モデルとして指定されるため、ランダムでないもの (ここではデータ ポイントの数n
) はパラメーターとして渡す必要があります。または、ディストリビューションを に配置することもできますn
。
次に、モデルを呼び出すシミュレーターを構築します。
mySim :: [Double] -> BayesianSimulator ()
mySim xs0 = do
setThreadNum 4
let n = length xs0
(mu, tau, xs) <- model $ myModel n
forM (zip xs xs0) $ \(x, x0) -> observe x x0
monitor mu
monitor tau
最後に、いくつかのデータを取得します。
xs0 = [1, -1, 2, 2, 2, -2]
シミュレーターを実行します。
main = genSimulator "myExample" (mySim xs0)
myExample
これにより、サンプラー用の OpenMP コードを含む新しいディレクトリが作成されます。