PyMC3サンプリングのpickleによる保存
PyMC3におけるサンプリングの保存と読み出しを試してみた。以下に、備忘録として記録しておく。
なお、WindowsでPyMC3を利用するときは、Jupyter Notebookで実行するとよい。Jupyter NorebookはAnacondaとともに簡単にインストールできるが、これらの説明をこのウェブサイトで行っている。
まず、2項分布によるPyMC3スクリプトを以下のように用意した(リスト1)。
リスト1
import matplotlib.pyplot as plt
import pymc3 as pm
import pickle
import arviz as az
N = 10
k = 7
with pm.Model() as BinModel:
theta
= pm.Uniform('theta', lower = 0.0, upper = 1.0)
k_obs
= pm.Binomial('k_obs', n = N, p = theta, observed = k)
trace
= pm.sample()
with
open('sample.pkl', 'wb') as f: # The file name is arbitrary
pickle.dump(trace,
f)
pm.traceplot(trace)
plt.show()
smry
= pm.summary(trace)
print(smry)
v_waic = az.waic(trace)
print('\nWAIC statistics...\n',
v_waic)
サンプリングの結果trace = pm.sample()を、次のpickleを用いたスクリプトでファイルsample.pklに保存している。
リスト1を実行すると図1のサンプリングのトレースが表示される。
図1
実行終了後の端末の出力は図2のようになっている。
図2
リスト1の実行後、次のリスト2を実行する。
リスト2
import matplotlib.pyplot as plt
import pymc3 as pm
import pickle
import arviz as az
N = 10
k = 7
with pm.Model() as BinModel:
theta
= pm.Uniform('theta', lower = 0.0, upper = 1.0)
k_obs
= pm.Binomial('k_obs', n = N, p = theta, observed = k)
#trace
= pm.sample()
#with
open('sample.pkl', 'wb') as f:
# pickle.dump(trace,
f)
trace
= pickle.load(open('sample.pkl', 'rb'))
pm.traceplot(trace)
plt.show()
smry
= pm.summary(trace)
print(smry)
v_waic = az.waic(trace)
print('\nWAIC statistics...\n', v_waic)
リスト1で保存されたファイルsample.pklがpickle.loadによってtraceに読み込まれている。
trace = pickle.load(open('sample.pkl', 'rb'))
である。
リスト2は、サンプリングを行わずファイルから読み込んでいることを除いてリスト1と同じである。実行すると図3のサンプリングのトレースが表示される。これは、図1に示すものと同じである。
図3
プログラム実行後の端末の表示は、図4に示すようになっている。
図4
サンプリングはファイルから読み込み、サンプリングは行われていないのでサンプリング進行時に表示される出力はないが、それ以外は図2に示すものと同じである。
すなわち、リスト1および2におけのpickleによる保存、読出しによって、サンプリングの結果を繰り返しファイルから読み込み利用することができることが確認できた。
なお、Stan(PyStan)の場合におけるpickleによるサンプリングの保存と読み出しは、拙著
岡本安晴「いまさら聞けないPythonでデータ分析――多変量解析、ベイズ統計分析(PyStan、PyMC)――」丸善出版
のpp. 197-200で説明している。