pyStan スライド ベイズ・確率プログラミング

pyStan

確率プログラミング言語・ベイズ推論パッケージStanのPythonインターフェイスです。

  • コンパイル済みStanモデルの自動キャッシング
  • Stanモデルのサンプルの自動キャッシング

pyStanのインストール

pyStanはLinuxとMacOS上で走ります。C++コンパイラが必要になります。(バージョンは gcc >= 9.0 または clang >= 10.0)

pip install pystan

クイックスタート

以下のコードは、8つのスクール間の指導効果を考えたモデルにpyStanの使い方を示したものです。この階層モデルは8スクールモデルと呼ばれます。

StanモデルはStanのプログラムコードから始まります。プログラムコードを変数 schools_codeにアサインして開始します。

import stan

schools_code = """
data {
  int<lower=0> J;         // number of schools
  real y[J];              // estimated treatment effects
  real<lower=0> sigma[J]; // standard error of effect estimates
}
parameters {
  real mu;                // population treatment effect
  real<lower=0> tau;      // standard deviation in treatment effects
  vector[J] eta;          // unscaled deviation from mu by school
}
transformed parameters {
  vector[J] theta = mu + tau * eta;        // school treatment effects
}
model {
  target += normal_lpdf(eta | 0, 1);       // prior log-density
  target += normal_lpdf(y | theta, sigma); // log-likelihood
}
"""

schools_data = {"J": 8,
                "y": [28,  8, -3,  7, -1,  1, 18, 12],
                "sigma": [15, 10, 16, 11,  9, 11, 10, 18]}

posterior = stan.build(schools_code, data=schools_data)
fit = posterior.sample(num_chains=4, num_samples=1000)
eta = fit["eta"]  # array with shape (8, 4000)
df = fit.to_frame()  # pandas `DataFrame`

 モデルをfitsさせるには二つのステップを踏みます。まずモデルをビルドします(stan.build)。この関数はビルドの結果としてモデルのインスタンスを返します。(stan.model.Model).

 次にメソッド stan.model.Model.sample()を使ってサンプルを出力します。この関数はインスタンスstan.fit.Fitを返します。このインスタンスには、Stanのサンプラーが出力した全てが含まれています。

 この出力のすべての変数を抽出してPandasデータフレームを生成することもできます。fit.to_frame()

上記サンプルコードはpyStanからの引用です。

Riddell, A., Hartikainen, A., & Carter, M. (2021). PyStan (3.0.0). https://pypi.org/project/pystan

 8スクールのモデルは、以下にnumpyroを使った実装例も、サンプルコードを上げています。

-pyStan, スライド, ベイズ・確率プログラミング
-, ,