2

非常に単純な例を pymc 2.3 から pymc 3.0 に変換していますが、予測事後分布からサンプリング (または MAP を取得) する方法がわかりません。ドキュメント (7.3 モデルのチェックと診断: 適合度) の提案に従って、観測されていない確率論を追加することにより、pymc 2.3 を使用してこの分布からサンプリングできます。ここにノートブックへのリンクがあります。すべてうまくいくようです。

ただし、これをpymc 3.0で実行しようとすると、2 つの奇妙なことが起こります。

  1. 観測されていない確率論が最小化に影響を与えているかのように、MAP 値は近くさえなく、観測されていない確率論の MAP 値は間違っていますか?
  2. NUTS サンプラーは観測されていない確率論の値を変更しないため、トレースは単純に 10 という単一の値になります。

もちろん、観測された確率論が存在しない場合、この値は理にかなっています。pymc 3.0 では、予測事後分布の MAP 値の検索とサンプリングはどのように変更されましたか?

アップデート:

これは、私が間違っていたことを示す最小限の例です。

import pymc as mc
with mc.Model() as model:
    p = mc.Beta('p',2,2)
    surv_sim = mc.Binomial('surv_sim',n=20,p=p)
    surv = mc.Binomial('surv',n=20,p=p,observed=15)

with model:
    step = mc.step_methods.HamiltonianMC(vars=model.vars) #Again must specificy
                                                          #model.vars or else
                                                          #only continuous values will
                                                          #be sampled

with model:
    trace = mc.sample(100000,step)

mc.traceplot(trace);

with model:
    map_est = mc.find_MAP(vars=model.vars) #Must Specify model.vars, or else
                                           #only continuous stochastics will
                                           #be fit, however this fit will be 
                                           #horrible

私はこれに自分自身で部分的に答えたと思います。まずはサンプリング。私が知る限り、NUTS サンプラーは離散変数を処理する機能を備えていません。ただし、Metropolis サンプラーは確実に離散を処理し (issue #235 で解決)、HamiltonianMC サンプラーも離散変数を処理するようです。

ただし、離散確率論の MAP 推定値は悪い運命にあります。すべての変数を使用するように指定した場合でも (デフォルトではありません)。離散確率論の対数確率関数は、任意の離散確率論の下限の対数確率を返すため、どの scipy 最小化関数が使用されても、局所最適に捕らえられます。最小化は、離散変数の小さなステップのいずれも対数確率の改善をもたらさないため、離散確率を固定したまま、連続確率論のみを最適化します。これがバグなのか、それとも離散変数と連続変数の両方がある場合に MAP 推定値を見つける際の基本的な制限なのかはわかりません。

更新 2:

複数のステップを使用すると、サンプリングはさらにうまく機能します。上記のモデルに使用できます。

with model:
    step1 = mc.step_methods.NUTS(vars=[p])
    step2 = mc.step_methods.Metropolis(vars=[surv_sim])

with model:
    trace = mc.sample(100000,[step1,step2])
4

1 に答える 1