PyStan 3のWindowsでの利用
PyStan 3は、直接Windows上で実行できないが、WindowsにインストールされたUbuntu上では実行できる。
UbuntuのWindowsへのインストールは、このウェブサイトで説明している。
WindowsにWSLによりインストールしたUbuntuにおいてminicondaをインストールすると使い易い。Minicondaに作成したPython仮想環境においてPyStan 3を利用すればよい。Anacondaの簡易版であるminicondaのインストールは、このウェブサイトで説明している。
PyStan 3の利用例を示すが、スクリプトはリスト1とリスト2に分けられている。リスト1においてPyStan3が利用されているが、Python3.12/miniconda/Ubuntu/WSL/Windowsにおいて実行した。WSLではGUIが利用できなかったので(2025.01)、リスト1におけるPyStan 3によるMCMCサンプルをファイルに保存して、Windows上でのPythonにより、保存されたMCMC
サンプルのグラフ表示を行った。リストの実行例を以下に示す。
リスト1の実行
リスト1のスクリプト(sample.py)は、PyStan3を利用しているので、miniconda/Ubuntu24/WSL/Windows10のPython 3.12仮想環境で実行した。
スクリプトは、次のコマンドで実行された。
(py312)
yasuharu@PSY-PM-PC:/mnt/*****/files$ python sample.py
実行が終わると、以下のメッセージが端末に出力される。
<stan.Fit>
Parameters:
p: ()
Draws: 4000
fit.pkl was saved.
(py312) yasuharu@PSY-PM-PC:/mnt/*****/files$
MCMCサンプルは、Pandas DataFrameの形式でファイルfit.pklに保存される。
MCMCサンプルのグラフを表示するために、リスト2のスクリプトdisplay.pyをWindows上で実行した。すなわち、Python3.12/Windows10において実行した。
リスト2の実行
リスト2のスクリプトdisplay.pyをPython3.12/Windows10において実行すると、リスト1の実行において出力されたファイルfit.pklが読み込まれる。
ファイルfit.pklの読み込み後、パラメータpの事後分布のグラフが表示される。
MCMCサンプリングの統計量は、Arvizを利用すると得ることができるが、これはリスト1の実行時に行う必要がある。リスト1のスクリプトに統計量
を求めるコードを追加した例をリスト3に示す。リスト3のスクリプトを実行するときは、scipyのバージョンを1.12.0にする必要がある。これは、コマンド
conda install
scipy=1.12
により、インストールあるいは上書きされる。
リスト3を実行すると、以下の出力が端末に表示される。
<stan.Fit>
Parameters:
p: ()
Draws: 4000
fit.pkl was saved.
mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail r_hat
p
0.667 0.129 0.436 0.9 0.003 0.002 1499.0 2073.0 1.0
(py312) yasuharu@PSY-PM-PC:/mnt/*****/files$
import stan
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, {'n':10,
'k':7})
fit = sm.sample()
print(fit)
dframe = fit.to_frame()
# MCMCサンプルをPandas
DataFrameにまとめる
with open('fit.pkl', 'wb') as f: # DataFrameをファイルfit.pklに保存
pickle.dump(dframe, f)
print('fit.pkl was saved.')
import pickle
import matplotlib.pyplot as plt
import seaborn as sb
with open('fit.pkl', 'rb') as f:
dframe = pickle.load(f)
sb.kdeplot(dframe['p']) # pの事後分布の描画
plt.show()
import stan
import pickle
import arviz as az
stan_code = """
data {
int
n;
int
k;
}
parameters {
real<lower=0, upper=1> p;
}
model {
k ~
binomial(n, p);
}
"""
sm = stan.build(stan_code, {'n':10,
'k':7})
fit = sm.sample()
print(fit)
dframe = fit.to_frame()
# MCMCサンプルをPandas
DataFrameにまとめる
with open('fit.pkl', 'wb') as f: # DataFrameをファイルfit.pklに保存
pickle.dump(dframe, f)
print('fit.pkl was saved.')
inf_data =
az.from_pystan(posterior=fit, posterior_model=sm)
print(az.summary(inf_data))