誰かが助けてくれるかどうか疑問に思っている一般的な問題に遭遇しました。私はよく pymc3 を 2 つのモードで使用したいと思います: トレーニング (つまり、実際にパラメーターの推論を実行する) と評価 (つまり、推論されたパラメーターを使用して予測を生成する) です。
一般に、ポイントごとの推定だけでなく、予測よりも事後が必要です(それはベイジアンフレームワークの利点の一部ですよね?)。トレーニング データが固定されている場合、これは通常、類似した形式のシミュレートされた変数を観測された変数に追加することによって達成されます。例えば、
from pymc3 import *
with basic_model:
# Priors for unknown model parameters
alpha = Normal('alpha', mu=0, sd=10)
beta = Normal('beta', mu=0, sd=10, shape=2)
sigma = HalfNormal('sigma', sd=1)
# Expected value of outcome
mu = alpha + beta[0]*X1 + beta[1]*X2
# Likelihood (sampling distribution) of observations
Y_obs = Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
Y_sim = Normal('Y_sim', mu=mu, sd=sigma, shape=len(X1))
start = find_MAP()
step = NUTS(scaling=start)
trace = sample(2000, step, start=start)
しかし、データが変更された場合はどうなりますか? 新しいデータに基づいて予測を生成したいとしますが、推論を最初から実行する必要はありません。理想的には、theano 計算グラフを介して新しいデータを単純に実行する、predict_posterior(X1_new, X2_new, 'Y_sim', trace=trace)
またはのような関数が必要です。predict_point(X1_new, X2_new, 'Y_sim', vals=trace[-1])
私の質問の一部は、pymc3 が theano 計算グラフを実装する方法に関連していると思います。関数model.Y_sim.eval
は私が望むものと似ているように見えますがY_sim
、入力として必要であり、与えられたものを返すだけのようです。
このプロセスは非常に一般的だと思いますが、それを行う方法が見つからないようです。どんな助けでも大歓迎です。(また、pymc2 でこれを行うためのハックがあることにも注意してください。pymc3 では、theano のためにより困難です。)