1

午後 1 時 23 分 (20 分前) こんにちは。

pymc3を学習しようとしています(pymc2を学習したことがないため、新しいものに飛び込みます)。私がやろうとしていることの非常に単純な例/疑似コードがあると思います。ここ数時間、私はあまり進歩していないので、誰かが私を助けてくれるかどうか疑問に思っています...

私の問題は、かなり単純な方法で事後からサンプリングすることです。「x」をベクトル、「t(x)」をそのベクトルの関数 (R^n --> R^n マップ)、「D」を観測データとします。ベクトル x をサンプリングしたい

P( x | D ) \propto P( D | x ) P(x)

いつものベイジアン。NUTS を使用してこれを行う方法の例は素晴らしいでしょう! 私の主な問題は、関数 t(x) を適切に機能させ、モデルが事後 (事前ではなく) からサンプルを返すようにすることです。

すべてのヘルプ/ヒントをいただければ幸いです。その間、私はいろいろなことを試し続けます。

一番、

TJ

4

1 に答える 1

1

あなたの表記は私には少し混乱しますが、私が正しく理解していれば、尤度(パラメーターとデータの関数)から事前にサンプリングしたいと考えています。そして、私は同意します-それは典型的なベイジアンのものです。

ベイジアンロジスティック回帰は、分析的に解決できないため、良い例だと思います。私たちのモデルが次のようなものだとしましょう:

B ~ 通常(0, sigma2 * I)

p(y_i | B) = p_i ^ {y_i} (1 - p_i) ^{1 - y_i}

y_i が観測され、p_i = 1 / (1 + exp(-z_i)) および

z_i = B_0 + B_1 * x_i

sigma2 が既知であると仮定します。numpy 配列 x と y にデータをロードした後、次のようにして事後からサンプリングできます。

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
    yhat = pm.Bernoulli("yhat", 1 / (1 + t.exp(-(b0 + b1*x))), observed=y)
    # Sample from the posterior
    trace = pm.sample(10000, pm.NUTS(), progressbar=False)

完全な例を確認するには、次の iPython ノートブックを確認してください。

http://nbviewer.ipython.org/gist/jbencook/9295751c917941208349

pymc3 には素晴らしい glm 構文もあります。ここでその仕組みを確認できます。

http://jbencook.github.io/portfolio/bayesian_logistic_regression.html

于 2014-03-28T12:56:28.093 に答える