PyMC3の概要とインストール|PyMC3チュートリアルに学ぶ統計モデリング #1

f:id:lib-arts:20200828165053p:plain

当シリーズではPyMC3のチュートリアルを元に統計モデリングについて確認していきます。PyMC3はベイズ統計モデリングのためのPythonのパッケージで、Pythonにおいてベイズ統計を取り扱うにあたってはデファクトとみて良いパッケージだと思います。
#1では導入としてPyMC3の概要の確認とインストールに加え、簡単な動作確認を行います。
以下、目次になります。
1. PyMC3の概要
2. PyMC3のインストール
3. 動作確認
4. まとめ


1. PyMC3の概要
まず1節ではPyMC3の概要について、主にWikipediaを元に確認します(https://en.wikipedia.org/wiki/PyMC3)。冒頭の記載を簡単に確認してみます。

f:id:lib-arts:20200828165216p:plain

上記によると、PyMC3は「高度なMCMCや変分近似アルゴリズムに特化した、ベイズ統計モデリング(Bayesian statistical modeling)や確率的機械学習(probabilistic machine learning)のパッケージ」とされています。PyMC2のような従来のバージョンのリライト版で、Fortran拡張を用いていたPyMC2とは異なり、自動微分や計算最適化、動的なCのコンパイルを実現するために Theanoをバックエンドに用いたとされています。また、PyMC3はStanと並ぶ最もよく用いられている確率的プログラミングツール(probabilistic programming tools)であり、オープンソースプロジェクトとして開発されているとなっています。

f:id:lib-arts:20200828170408p:plain

また上記に記載があるように、PyMC3は多くの科学のドメインで利用されており、天文学(astronomy)、分子生物学(molecular biology)、結晶学(crystallography)、化学(chemistry)、生態学(ecology)、心理学(psychology)などが例として挙げられています。他にも気候科学(climate science)、公衆衛生(public health)、神経科学(neuroscience)などが例として挙げられています。また、Theanoが2017年に開発のストップをアナウンスしたのちに、開発チームは2018年に新しいバージョンのPyMC4はTensorFlow Probabilityを計算のバックエンドに用いて開発すると発表しています。

f:id:lib-arts:20200828171317p:plain

実装されている機能の内容としては、MCMCや変分推論(Variational inference)のアルゴリズムが挙げられています。MCMCについては従来的な手法として有名なMetropolis-Hastingsだけにとどまらず、近年用いられるようになってきているHamiltonian Monte Carloの一種であるNUTS(No-U-Turn Sampler)も実装していると記載されています。

大体の概要はつかめたのでPyMC3のドキュメントも簡単に確認してみます。

f:id:lib-arts:20200828171717p:plain

PyMC3 Documentation — PyMC3 3.9.3 documentation

上記がPyMC3のドキュメントになります。右下のようなシンプルな記法でベイズ統計モデリングが実現可能なライブラリとなっています。詳しい実装は#2以降で実装例を見ていくとして、#1の2節以降ではPyMC3のインストールと動作確認を行います。


2. PyMC3のインストール
2節ではPyMC3のインストールについて確認します。

f:id:lib-arts:20200828172027p:plain

PyMC3 Documentation — PyMC3 3.9.3 documentation

インストールについては上記のように実行すればインストールできます。

$ pip freeze | grep pymc
pymc3==3.9.3

PyPIを用いてpipでインストールした場合は上記のようにコマンド実行をすることで、PyMC3がインストールされているかどうかとそのバージョンについて確認することができます。

ここまででインストール自体は確認できたので、続く3節では動作確認を行なっていきます。


3. 動作確認
3節では動作確認について行っていきます。

f:id:lib-arts:20200828172630p:plain

PyMC3 Documentation — PyMC3 3.9.3 documentation

トップページ記載の上記を実行することにします。ここで一点注意が必要なのが、3行目の"linear_training_data()"はおそらくライブラリではないので、自前でなんらかを用意しなければならないということです。ということで、ここではあくまで簡単な確認なので簡単なサンプルを与えて実行してみることにします。

import numpy as np
import pymc3 as pm

X, y = np.array([1,2,3]), np.array([1,2,3])
with pm.Model() as linear_model:
    weights = pm.Normal('weights', mu=0, sigma=1)
    noise = pm.Gamma('noise', alpha=2, beta=1)
    y_observed = pm.Normal('y_observed',
            mu=X @ weights,
            sigma=noise,
            observed=y)

prior = pm.sample_prior_predictive()
posterior = pm.sample()
posterior_pred = pm.sample_posterior_predictive(posterior)

上記のように、NumPyをインポートしてサンプルとしてXに[1,2,3]、yにも[1,2,3]を与えてみました。これによって単回帰モデルの際と同様の問題設定ができていることがわかります。

f:id:lib-arts:20200828173237p:plain

実行結果は上記のようになります。NUTSを用いてサンプリングしていることや、パラメータの事前分布に正規分布(Normal)を与えて実行していることなどがざっくりわかれば動作確認としては十分かと思います。


4. まとめ
#1ではPyMC3の概要とインストールを行いました。#2以降ではチュートリアルの内容などを元に、PyMC3の実装例を確認していきます。