LoginSignup
1
2

More than 3 years have passed since last update.

ベイズ推論用ライブラリー・・PyMC3での変数の設定

Last updated at Posted at 2020-08-10

PythonのPyMC3の解説

「Pythonで体験するベイズ推論」から、PyMC3での変数の設定の方法を解説する。

第2章の2.1のPyMC2の内容をPyMC3用に若干変更しています。

変数について

PyMC3では、Modelオブジェクト内で必要なすべての変数を処理します。


import pymc3 as pm

with pm.Model() as model:
    parameter = pm.Exponential("poisson_param", 1.0)
    data_generator = pm.Poisson("data_generator", parameter)

with model:
    data_plus_one = data_generator + 1

with pm.Model() as model:
    theta = pm.Exponential("theta", 2.0)
    data_generator = pm.Poisson("data_generator", theta)    

with pm.Model() as ab_testing:
    p_A = pm.Uniform("P(A)", 0, 1)
    p_B = pm.Uniform("P(B)", 0, 1)

print("parameter.tag.test_value =", parameter.tag.test_value)
print("data_generator.tag.test_value =", data_generator.tag.test_value)
print("data_plus_one.tag.test_value =", data_plus_one.tag.test_value)

#parameter.tag.test_value = 0.6931471824645996
#data_generator.tag.test_value = 0
#data_plus_one.tag.test_value = 1

変数には親変数と子変数がある。
親変数は他の変数に影響を与える変数で、子変数は他の変数から影響を受ける変数である。

この場合、parameterは、data_generatorの親変数である。逆にdata_generatorparameterの子変数である。
すでに作成したモデルオブジェクトの名前(model)で「with」を使用することにより、同じモデル内で変数を作ることができます。
またPyMC変数は値を持っている。もし変数が子変数であれば親変数が変われば、子変数の値も変わる。

PyMC3変数には初期値(つまり、テスト値)があります。 ****.tag.test_valueで初期値が得られます。test_valueは、開始位置が指定されていない場合のサンプリングの開始点として使用されます。

2つの変数(確率的変数と決定的変数)

PyMC3は、確率的(stochhastic)および決定的(deterministic)という2つの変数があります。

確率的変数(stochhastic)は、決定的でない変数である。つまり、この変数の親変数の値を知っていても、この変数は依然としてランダムである。このカテゴリーに属するクラスには、Poisson(ポアソン分布)、DiscreteUniform(一様分布)、およびExponential(指数分布)がある。

決定的(deterministic)変数は、親変数の値がわかっていたら、その値が決まる変数である。
一瞬紛らわしいと感じるがこのように考えましょう。「変数fooの親変数がすべてわかった時にそのfooの値が決まるか?」もし値が決まるなら、そのfooは決定的変数である。

確率的変数の初期化

確率変数またはランダム変数を初期化するための第1引数は、変数の名前を表す文字列で、第2引数以降にクラス固有の追加引数を渡すことができます。

some_variable = pm.DiscreteUniform( "discrete_uni_var"、0、4)

これは、DiscreteUniform(一様分布)クラスで、discrete_uni_varが変数の名前で、0と4は、確率変数が取りえる上限と下限である。

引数に渡す名前は、事後分布を作時に必要になるので、できるだけわかりやすい方がよい。
また、多くの変数を使う問題の時は、shape引数を使います。モデル化したい多くの変数$𝛽𝑖、𝑖= 1、...、𝑁$が存在するという時に便利です。次のようにそれぞれに任意の名前と変数を作成する代わりに


beta_1 = pm.Uniform "beta_1"01
beta_2 = pm.Uniform "beta_2"01

次のように一つの変数で作ることができる。

betas = pm.Uniform "betas"01shape = N

確定的変数の初期化

確率変数を作成する方法と同様に、確定変数を作成できます。 PyMC3pm.Deterministicクラスを呼び出し、必要な引数を渡すだけです。

deterministic_variable = pm.Deterministic "deterministic variable"some_function_of_variables

これで、決定的変数を作成することができます。

with pm.Model() as model:
    lambda_1 = pm.Exponential("lambda_1", 1.0)
    lambda_2 = pm.Exponential("lambda_2", 1.0)
    tau = pm.DiscreteUniform("tau", lower=0, upper=10)

new_deterministic_variable = lambda_1 + lambda_2

これは、ベイズ推論の考え方(3)・・pymc3による実際の計算で使ったスクリプトです。

このように加減などの演算子を使った計算をしたものは暗黙的に決定的変数になります。つまりnew_deterministic_variableは決定的変数です。


\lambda = 
\begin{cases}\lambda_1  & \text{if } t \lt \tau \cr
\lambda_2 & \text{if } t \ge \tau
\end{cases}

theanoとは

どうもtheanoとは、昔のディープラーニング用のライブラリーのようです。PyMC3のバックエンドで計算しています。でも、PyMC4では、tensorflowがバックエンドになったようなので、この勉強限りのお付き合いですので、あまり気にしないようにしましょう。

モデルに観測を組み込む

ここまでで、変数の設定。つまり事前分布の指定が完了している。
つまりλの形とかも表すことができます。つまり、ベイズ推論の考え方(2)・・ベイズ推定と確率分布でのベイズの定理の$P(A)$を決定したことになる。これに、データ(あるいは証拠、観測等)である$X$をモデルに組み込むことを行う。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2