【Python】ベイズ統計を実践できるPyStanのインストール

【Python】ベイズ統計を実践できるPyStanのインストール データ分析

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.62016年12月23日2021年12月
3.72018年6月27日2023年6月
3.82019年10月14日2024年10月
3.92020年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の動作確認を説明しました。

タイトルとURLをコピーしました