Up

PyStan 3によるMCMCサンプルのtickleによる保存と読み出し

 

StanPyStan 3)によるMCMCサンプリングの結果をファイルに保存して、そのファイルを別のプログラムで読み出して分析することを試みた。MCMC
サンプリングに時間が掛かるときは、サンプルを保存しておいて別のプログラムで描画や事後分析を行うとサンプルの分析を効率よく行うことができる。

以下の例では、PyStan 3の実行をWindowsWSLによりインストールされたUbuntuで行い、MCMCサンプルの分析プログラムはWindows上のPythonで実行した。WindowsへのUbuntuPythonのインストールについては、このウェブサイトで説明している。

 

PyStan 3のスクリプト例としてリスト1のものを用意した。

 

 

リスト1 MCMCサンプリング(PyStan 3

import stan

import matplotlib.pyplot as plt

import arviz as az

import pickle

 

stan_code = """

    data {

        int N;

        int k;

    }

    parameters {

        real<lower=0, upper=1> p;

    }

    model {

        k ~ binomial(N, p);

    }

"""

sm = stan.build(stan_code, data={'N':10, 'k':7})

fit = sm.sample()

#

#      MCMCサンプリングの結果fitPandasDataFrame型に変換して保存

#

dframe = fit.to_frame()

with open('dframe.pkl', 'wb') as f:

    pickle.dump(dframe, f)

plt.hist(dframe['p'])

plt.show()

#

#      MCMCサンプリングの結果をArvizInferenceData型として保存

#

infdata = az.from_pystan(posterior = fit, posterior_model = sm)

with open('infdata.pkl', 'wb') as f:

    pickle.dump(infdata, f)

summary = az.summary(infdata)

print('\nSummary...\n', summary)

 

az.plot_trace(infdata)

plt.show()

 

 

次のコード

 

sm = stan.build(stan_code, data={'N':10, 'k':7})

fit = sm.sample()

 

で作成したサンプルfit2種類のファイルに保存している。

1つはPandasDataFrameの形式で、次のコード

 

dframe = fit.to_frame()

with open('dframe.pkl', 'wb') as f:

    pickle.dump(dframe, f)

 

で保存されている。この形式のデータはPandasDataFrameとして分析できる。

次のコードは、パラメータpの事後分布を描くものである。

 

plt.hist(dframe['p'])

plt.show()

 

dframeから'p'をキーとしてパラメータpの事後分布のサンプルを取り出している。

図1

 

 

サンプルfitは、ArvizInferenceData型として次のコード

 

infdata = az.from_pystan(posterior = fit, posterior_model = sm)

with open('infdata.pkl', 'wb') as f:

    pickle.dump(infdata, f)

 

で保存することができる。InferenceData型のデータはArvizの関数で分析することができる。

MCMCサンプルの統計量を次のコードで求めている。

 

summary = az.summary(infdata)

print('\nSummary...\n', summary)

 

上のコードが実行されると、以下の出力が端末に表示される。

 

Summary...

     mean     sd  hdi_3%  hdi_97%  mcse_mean  mcse_sd  ess_bulk  ess_tail  r_hat

p  0.662  0.128   0.422     0.89      0.003    0.002    1498.0    1683.0    1.0

 

次のコード

 

az.plot_trace(infdata)

plt.show()

 

を実行すると、MCMCサンプリングのトレース図が描画される。

図2

 

 

リスト1を実行すると、次のコード

 

with open('dframe.pkl', 'wb') as f:

    pickle.dump(dframe, f)

 

により、dframeがファイルdframe.pklに保存され、

次のコード

 

with open('infdata.pkl', 'wb') as f:

    pickle.dump(infdata, f)

 

により、infdataがファイルinfdata.pklに保存される。

 

 

リスト1の実行によって保存されたファイルdframe.pklinfdata.pklを読み込んで処理するスクリプト例をリスト2に示す。

 

 

リスト2 ファイルの読み込みと処理

 

import matplotlib.pyplot as plt

import arviz as az

import pickle

#

#     dframe.pklからの読み出し

#

with open('dframe.pkl', 'rb') as f:

    dframe = pickle.load(f)

plt.hist(dframe['p'])

plt.show()

#

#     infdata.pklからの読み出し

#

with open('infdata.pkl', 'rb') as f:

    infdata = pickle.load(f)

summary = az.summary(infdata)

print('\nSummary...\n', summary)

 

az.plot_trace(infdata)

plt.show()

 

 

リスト2は、WindowsにインストールされたPythonで実行することができる。

以下は、WindowsにインストールされたPython 3.12.2の実行により表示されるグラフと端末出力である。

図3

 

図4

 

図5

 

Jupyter Notebookによるリスト2の実行例を以下に示す。PythonのスクリプトファイルをNotebookにコピー・貼り付けを行う例については、このウェブサイトで説明している。

 

 

 

なお、PyStan2の場合のMCMCサンプルの保存と読み出しについては、岡本(2019pp. 197-200で説明している。

 

 

Home