下校時刻

メモ、読んだ本のまとめメモ、考えたことのメモ、その他のメモなどが書いてあるブログです(twitter: @hoture6)

『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)

モデル化のアプローチ

データをモデル化したいときの考え方。

  1. データが従う確率分布を考える(このデータは云々の理由でPoisson分布に従いそう)
  2. 確率分布を表すのに必要なパラメータは何か( \lambdaが必要)
  3. そのパラメータはどんな形をしているか(今回は2つの \lambdaが必要)
  4. パラメータが従うべき確率分布は何か(云々の理由で指数分布がいい。指数分布のパラメータ \alphaは適当に決めよう)

モデルからデータを生成

逆に、確率分布からデータを生成できる。(たぶん)Stochastic変数の名前を小文字にして最初にrをつければOK。

tau = pm.rdiscrete_uniform(0, 80)

モデルの評価

作ったモデルが良いかどうかの評価方法はいくつかある。

  • Bayesian p-value
  • separation plots

モデルの適合度の評価は結局主観的なものにならざるを得ないので、どれだけ客観的(っぽいか)よりもわかりやすさを重視した方がいい。