PyMC初心者:適合モデルから実際にサンプリングする方法


11

私は非常に単純なモデルを試しています。精度がわかっていると想定し、平均を求めたいだけの場合に法線をフィッティングします。以下のコードは、正常に正しく適合しているようです。しかし、フィッティング後、モデルからサンプリングしたい、つまりdata変数に似た新しいデータを生成したい。trace("mean")平均変数のサンプルを取得するために使用できることを知っています。しかし、どうすればモデル自体から新しいサンプルを取得できますか?

私はドキュメント、例えばhttp://pymc-devs.github.io/pymc/database.html#accessing-sampled-dataを見てきました。鉱山災害などのかなりの数の例と、確率的プログラミングのノートブックからのいくつかも見てきましたが、これについては触れられていません。私(多かれ少なかれMCMCの初心者)は、フィットしたモデルからのサンプリングがポイントであると期待していました!何が欠けていますか?

from pymc import *
data = np.array([-1, 0, 4, 0, 2, -2, 1, 0, 0, 2, 1, -3, -1, 0, 0, 1, 0, 1])
mean = Uniform("mean", -4, 4)
precision = 2.0**-2
obs = Normal("obs", mean, precision, value=data, observed=True)
model = Model( {"mean": mean, "obs": obs})
mcmc = MCMC(model)
mcmc.sample(10000, 1000, 1)
# I can get samples for the "mean" variable
mean_samples = mcmc.trace("mean")[:]
hist(mean_samples)
# but how can I do the equivalent of mcmc.trace("obs")?

まさに私が持っていた質問!予測サンプリングがpymc3で簡略化されているかどうか疑問に思います...
Vladislavs Dovgalecs

回答:


13

予測分布と呼ばれるものを探しています。これを含めるのは非常に簡単です。を作成する前にModel、追加の確率変数を追加します。

predictive = mc.Normal( "predictive", mean, precision )
model = Model( {"mean": mean, "obs": obs, "pred":predictive})

...

predictive_traces = mcmc.trace("predictive")[:]
hist( predictive_traces )

適合モデルからの人工データ

これにより、適合モデルから人工データが生成されます。この見落としを指摘してくれてありがとう、私はそれをBMHプロジェクトに含めます。


nがランダムであるn個のランダム変数の配列をどのように作成しますか?stackoverflow.com/questions/45283843/…(申し訳ありませんがこれは多すぎます...)
drake

2

PyMC3を使用して同じものを探しているときに数年後にここに着陸したので、新しいバージョンに関連する回答を残します:(事後予測チェックから)。

ppc = pm.sample_ppc(trace, samples=500, model=model, size=100)

これで、ppcには500個の生成されたデータセット(各100サンプルを含む)が含まれ、それぞれが事後からの異なるパラメーター設定を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.