2013-05-23 20 views
21

pymcがMetropolis-Hastingsアルゴリズムを実装して関心のあるパラメータの事後密度からサンプルを作成する場合、マルコフ連鎖の次の状態に移動するかどうかを決定するには、すべての与えられたパラメータ値の事後密度。pymcは事前分布と尤度関数をどのように表していますか?

事後密度は、観測データに基づいて尤度関数に比例します。

これらはそれぞれどのようにpymcで表現されていますか?モデルオブジェクトからこれらの量のそれぞれをどのように計算するのですか?

誰かが私にアプローチの高水準の説明を与えたり、私がそれを見つける場所を教えてくれるのだろうかと思います。

+0

誰もあなたに答えることができないように見えるので、ここで質問してみることをお勧めします:https://github.com/pymc-devs/pymc/issues – pablofiumara

+0

これは[ソース](https: //github.com/pymc-devs/pymc/blob/master/pymc/step_methods/metropolis.py#L47)。それは比較的短く、アルゴリズムについてのあなたの明白な理解をもって、おそらく素早い見た目があなたにとって私にとってより明るいものになるでしょう。 –

答えて

3

前を表現するには、次の2つの主要な属性を持つ確率クラスのインスタンスが必要になります。

value : the variable's current value 
logp : the log probability of the variable's current value given the values of its parents 

あなたが使用しているディストリビューションの名前で前を初期化することができます。

尤度を表すには、いわゆるデータ確率論が必要です。つまり、クラスobservedフラグがTrueに設定されているクラスのインスタンスです。この変数の値は変更できず、サンプリングされません。ここでも、使用しているディストリビューションの名前を使用して尤度を初期化することができます(しかし、observedフラグをTrueに設定することを忘れないでください)。

は、我々は次のセットアップを持っていると言う:

import pymc as pm 
import numpy as np 
import theano.tensor as t 

x = np.array([1,2,3,4,5,6]) 
y = np.array([0,1,0,1,1,1]) 

私たちは、次のように簡単なロジスティック回帰を実行することができます。

with pm.Model() as model: 
    #Priors 
    b0 = pm.Normal("b0", mu=0, tau=1e-6) 
    b1 = pm.Normal("b1", mu=0, tau=1e-6) 
    #Likelihood 
    z = b0 + b1 * x 
    yhat = pm.Bernoulli("yhat", 1/(1 + t.exp(-z)), observed=y) 
    # Sample from the posterior 
    trace = pm.sample(10000, pm.Metropolis()) 

上記のほとんどはクリスFonnesbeckのiPythonノートhereから来ました。

+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+0

ベン、あなたはpymc2とpymc3表記を混ぜています。 'observed = true'はpymc2のものでした。次に、値の中に値を与える必要がありました。 pymc3はこれらの2つのキーワードを結合し、データは 'observed = y'で直接与えられます。これは(observed = true)を意味します。 –

+0

b0がベクトルであり、そのすべての要素が独立している場合はどうなりますか?すなわち、先行は密度の積として書き表すことができるか?これをpymcにどのように書きますか? –

関連する問題