私は私の問題を解決することができました。主なポイントは、testvalを "false"ではなく "true"に設定することでした。ステップメソッドをMetropolisからBinaryGibbsMetropolisに変更するように状況を改善しました。
ここでは完全な解決策をご紹介します。私は要点も更新しました。
import numpy as np
import pandas as pd
import pymc3 as pm
niter = 10000 # 10000
tune = 5000 # 5000
model = pm.Model()
with model:
tv = [1]
rain = pm.Bernoulli('rain', 0.2, shape=1, testval=tv)
sprinkler_p = pm.Deterministic('sprinkler_p', pm.math.switch(rain, 0.01, 0.40))
sprinkler = pm.Bernoulli('sprinkler', sprinkler_p, shape=1, testval=tv)
grass_wet_p = pm.Deterministic('grass_wet_p', pm.math.switch(rain, pm.math.switch(sprinkler, 0.99, 0.80), pm.math.switch(sprinkler, 0.90, 0.0)))
grass_wet = pm.Bernoulli('grass_wet', grass_wet_p, observed=np.array([1]), shape=1)
trace = pm.sample(20000, step=[pm.BinaryGibbsMetropolis([rain, sprinkler])], tune=tune, random_seed=124)
# pm.traceplot(trace)
dictionary = {
'Rain': [1 if ii[0] else 0 for ii in trace['rain'].tolist() ],
'Sprinkler': [1 if ii[0] else 0 for ii in trace['sprinkler'].tolist() ],
'Sprinkler Probability': [ii[0] for ii in trace['sprinkler_p'].tolist()],
'Grass Wet Probability': [ii[0] for ii in trace['grass_wet_p'].tolist()],
}
df = pd.DataFrame(dictionary)
p_rain = df[(df['Rain'] == 1)].shape[0]/df.shape[0]
print(p_rain)
p_sprinkler = df[(df['Sprinkler'] == 1)].shape[0]/df.shape[0]
print(p_sprinkler)
「PyMC2」の同じコードで要点を更新しました。 PyMC2バージョンはPyMC3バージョンと同じ問題を抱えません。何か案は? –
[pymc3-multiple-observed-values](http://stackoverflow.com/questions/24242660/pymc3-multiple-observed- valuesues)では、次のような記述があります。「あなたのアプローチに根本的に間違いはありません。ベイジアンMCMC分析の落とし穴を除き、(1)非収束、(2)プリオリ、(3)モデル。 私のケースは同様のケースだと思いますが、私は解決策を引き続き調整します。私が芝生が濡れているのではなく草が濡れていないという証拠として私が提供するならば、 'PyMC3'版も働きます。 私はここで、そして要点を更新し続けます。 –