Pythonでベイズ統計を行う場合、PyStanがその選択肢となります。
この記事では、PyStanについて基本的なことから説明しています。
本記事の内容
- PyStanとは?
- PyStanのシステム要件
- PyStanのインストール
- PyStanの動作確認
それでは上記に沿って解説します。
PyStanとは?
PyStanは、StanのPythonインターフェースとなります。
Stan
https://mc-stan.org/
Stanは、統計モデリングと高性能統計計算のための最先端のプラットフォームです。
C++で書かれた統計的推論のための確率的プログラミング言語でもあります。
つまり、統計専門のソフトウェアということですね。
そして、そのStanをPythonから操作するためにPyStanが必要となります。
以上、PyStanについての説明でした。
次は、PyStanのシステム要件を確認します。
PyStanのシステム要件
現時点(2021年7月末)でのPyStanの最新バージョンは、3.2.0となります。
この最新バージョンは、2021年6月3日にリリースされています。
次の4点が、システム要件として注意すべき点となります。
- OS
- CPU
- Python
- C++ compiler(コンパイラ)
それぞれを下記で説明します。
OS
サポートOSに関しては、以下となります。
- Linux
- macOS
そして、公式にサポートしているLinuxディストリビューションは次の二つです。
- Debian 11
- Ubuntu 20.04
これら以外でも、PyStanは動くはずですけどね。
あくまで、公式にサポートしているモノということになります。
なお、今回の検証では以下のOSを利用しています。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
CPU
CPUは、x86-64のみに対応ということです。
基本的には、64bitのみサポートという形になります。
マシンのアーキテクチャを確認する場合は、以下のコマンドでOK。
$ arch x86_64
一般的には、IntelかAMDのCPUを利用していることでしょう。
そのため、64bitであれば、それほど問題にはならないはずです。
Python
Pythonのバージョンが指定されています。
サポート対応は、Python 3.7以降ということです。
もしかしたら、対応範囲が狭いと思う方がいるかもしれません。
でも、これは適切な対応と言えます。
以下は、Pythonの公式開発サイクルとなります。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月 |
3.7 | 2018年6月27日 | 2023年6月 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
PyStanは、この公式開発サイクルに準じています。
このことは、メンテナンスが行き届いているライブラリの証拠でもあります。
つまり、安心して利用できるライブラリだと言えます。
C++ compiler(コンパイラ)
pipによるインストールの際に必要となります。
そして、次の2つのコンパイラがサポートされています。
- gcc ≥9.0
- clang ≥10.0
Ubuntuであれば、すでにgccがインストール済みかもしれません。
確認方法は、以下。
$ gcc --version gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
インストール済みなら、上記のようにバージョンが表示されます。
これであれば、バージョン的にも問題はありませんね。
まとめ
上記のように、PyStanのシステム要件にはいろいろと書かれています。
ただ、普通にLinuxを利用していれば、それほど複雑なことではありません。
Pythonのバージョンが、少し古いというぐらいでしょうか。
その場合は、これを機会に最新版のPythonにアップグレードすることをおススメします。
あとは、サポート対象のOSにWindowsがありません。
公式に未対応という以上、とりあえずは諦めておきましょう。
以上、PyStanのシステム要件を説明しました。
次は、PyStanをインストールしていきます。
PyStanのインストール
まず、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 21.1.3 setuptools 57.4.0
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、PyStanのインストールです。
PyStanのインストールは、以下のコマンドとなります。
pip install pystan
インストールは、少しだけ時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。
$ pip list Package Version ----------------- ----------- aiohttp 3.7.4.post0 appdirs 1.4.4 async-timeout 3.0.1 attrs 21.2.0 chardet 4.0.0 clikit 0.6.2 crashtest 0.3.1 httpstan 4.5.0 idna 3.2 lz4 3.1.3 marshmallow 3.13.0 multidict 5.1.0 numpy 1.21.1 pastel 0.2.1 pip 21.1.3 pylev 1.4.0 pysimdjson 3.2.0 pystan 3.2.0 setuptools 57.4.0 typing-extensions 3.10.0.0 webargs 7.0.1 yarl 1.6.3
結構いろいろとインストールされました。
これだけ依存するパッケージがあるなら、仮想環境の利用を考えた方がよいでしょうね。
Pythonでの仮想環境については、次の記事で解説しています。
以上、PyStanのインストールの説明でした。
最後は、PyStanの動作確認を行います。
PyStanの動作確認
PyStanの動作確認を行います。
公式に載っているサンプルコードそのままです。
コード中の階層モデルは、「eight schools」モデルと言われています。
機械学習の分野では、頻繁に使われるモデルです。
詳細は、以下のページが参考となります。
8つの学校(TensorFlow公式)
https://www.tensorflow.org/probability/examples/Eight_Schools
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, random_seed=1) fit = posterior.sample(num_chains=4, num_samples=1000) eta = fit["eta"] # array with shape (8, 4000)
上記コードを実行します。
PyStanが正常にインストールされていれば、以下のような結果が表示されます。
Building: 19.4s, done. Messages from stanc: Warning: The parameter tau has no priors. Warning: The parameter mu has no priors. Sampling: 100% (8000/8000), done. Messages received during sampling: Gradient evaluation took 1e-05 seconds 1000 transitions using 10 leapfrog steps per transition would take 0.1 seconds. Adjust your expectations accordingly! Gradient evaluation took 4e-06 seconds 1000 transitions using 10 leapfrog steps per transition would take 0.04 seconds. Adjust your expectations accordingly! Gradient evaluation took 2e-06 seconds 1000 transitions using 10 leapfrog steps per transition would take 0.02 seconds. Adjust your expectations accordingly! Gradient evaluation took 5e-06 seconds 1000 transitions using 10 leapfrog steps per transition would take 0.05 seconds. Adjust your expectations accordingly! [[ 0.53606666 0.33755233 0.00701432 ... -0.22086682 0.5604009 1.4257925 ] [ 0.70766537 0.63386659 0.81540488 ... 0.74674264 0.47102348 -0.86889421] [-0.3073485 -0.16924122 -0.03105647 ... 1.13179125 0.22300389 0.83051411] ... [ 2.19356357 0.22176668 0.86417621 ... -0.4613619 0.45582401 -1.25968505] [-0.33412975 -0.640529 0.01854885 ... 0.45013038 0.7371855 -2.00362289] [ 1.29667823 -1.56515245 0.45822987 ... -0.53607507 0.63662982 -1.52049788]]
初回実行時は、約20秒かかりました。
2回目以降は、すぐに同じ結果が表示されます。
どうやら、キャッシュを利用しているようです。
とりあえず、今回はここまで行えば十分でしょう。
PyStanが動作していることは、確認できました。
以上、PyStanの動作確認を説明しました。