『Bayesian Methods For Hackers』Ch. 2 まとめ
Ch. 2です。
PyMCの変数
PyMCの変数はいくつかの観点から分類できる
- 親変数と子変数
- Stochastic変数とDeterministic変数
すべてのPyMCの変数はvalue
プロパティを持つ。value
プロパティはその変数の現在の値。
Stochastic変数
初期化
some_var = pm.DiscreteUniform('some_var', 0, 4)
複数の変数
変数のarrayを作るよりも、size
を使った方が良い
betas = pm.Uniform('betas', 0, 1, size = 2)
random()
betas.random()
などとすることでその分布に従う乱数を生成できる。また、random()
を呼ぶことによりvalue
プロパティの値が変わる(最後に呼ばれたrandom()
の値になる)。
Deterministic変数
(たぶん)Stochastic変数を変換したり、まとめたりしたいときに使う。Deterministicと言っても、単に入力に対して決まった値を返すというだけで、親変数がStochasticであればそれに依存していろいろな値をとる。
宣言
いくつか宣言の方法がある。宣言の際、親変数となるStochastic変数はPyMCの変数でなくそのvalue
として振る舞う。また、関数の引数はキーワード引数にする必要がある。
# 1 デコレータ&関数 @pm.deterministic def var(sigma = sigma): return sigma**2 # 2 pm.Lambda var = pm.Lambda('var', lambda sigma = sigma: sigma**2) # 3 四則演算 var = sigma**2
データのinclude
データとモデルを統合する際、データは自身が従う(ことになっている)確率分布のvalue
引数に渡される。observed = True
によって、value
プロパティが変更されなくなり、データを保持することができる。
obs = pm.Poisson('obs', lambda_, value = data, observed = True)
モデル化のアプローチ
データをモデル化したいときの考え方。
- データが従う確率分布を考える(このデータは云々の理由でPoisson分布に従いそう)
- 確率分布を表すのに必要なパラメータは何か(が必要)
- そのパラメータはどんな形をしているか(今回は2つのが必要)
- パラメータが従うべき確率分布は何か(云々の理由で指数分布がいい。指数分布のパラメータは適当に決めよう)
モデルからデータを生成
逆に、確率分布からデータを生成できる。(たぶん)Stochastic変数の名前を小文字にして最初にr
をつければOK。
tau = pm.rdiscrete_uniform(0, 80)
例
- A/Bテストの例
- カンニングの例
- Challenger号の例
モデルの評価
作ったモデルが良いかどうかの評価方法はいくつかある。
- Bayesian p-value
- separation plots
モデルの適合度の評価は結局主観的なものにならざるを得ないので、どれだけ客観的(っぽいか)よりもわかりやすさを重視した方がいい。