6

pymc2 を pymc3 に使用したいくつかの計算を更新しています。モデルに離散確率変数がある場合、サンプラーの動作に問題があります。例として、pymc2 を使用した次のモデルを考えてみましょう。

import pymc as pm

N = 100
data = 10

p = pm.Beta('p', alpha=1.0, beta=1.0)
q = pm.Beta('q', alpha=1.0, beta=1.0) 
A = pm.Binomial('A', N, p)
X = pm.Binomial('x', A, q, observed=True, value=data)

これは何かを代表するものではなく、観測されていない変数の 1 つが離散しているモデルにすぎません。このモデルを pymc2 でサンプリングすると、次の結果が得られます。

mcmc = pm.MCMC(model)
mcmc.sample(iter=100000, burn=50000, thin=100)
plot(mcmc)

あ q p

しかし、PYMC3 で同じことを試すと、次のようになります。

with pm.Model() as model:
    N = 100
    p = pm.Beta('p', alpha=1.0, beta=1.0)
    q = pm.Beta('q', alpha=1.0, beta=1.0) 
    A = pm.Binomial('A', N, p)
    X = pm.Binomial('x', A, q, observed=10)

with model:
    start = pm.find_MAP()

with model:
    step = pm.NUTS()
    trace = pm.sample(3000, step, start)

pm.traceplot(trace)

か

変数 A がまったくサンプリングされていないようです。pymc3で使用されているサンプリング方法についてはあまり読んでいませんでしたが、特に連続モデルを対象としているように見えました。これは、モデルで観測されていない離散変数を除外することを意味しますか、それとも私がやろうとしていることを行う方法はありますか?

4

1 に答える 1

9

NUTS サンプラーは、離散変数では機能しません (ただし、そのように一般化する作業が行われています)。やりたいことは、さまざまなタイプの変数にさまざまなステップ メソッドを割り当てることです。例えば:

step1 = pm.NUTS(vars=[p, q])
step2 = pm.Metropolis(vars=[A])

trace = pm.sample(3000, [step1, step2], start)
于 2014-01-27T17:17:42.337 に答える