この記事ではMCMCを実装するmoduleの一つPyMC3について書く.
下に示したコードでやったことは,
1. statsmodelsでLR (Logistic Regression)
2. GLMを使わずにpmが提供する機能を用いてNUTSを実装.
グラフ機能で有用そうなものを列挙.
3. 関数とtheano.tensorを用いて,自前でLRを実装し,NUTSを適用.
4. PyMC3のsamplingの結果を保存,再利用するコード. pickleを用いた.
5. クラスを用いた自前のLRの実装.(pm.Potential)
6. WAICを計算するためにクラスをpm.DensityDistを用いて自前のLRを実装.
< コメント >
3. についてはクラスを用いて実装(cythonなど)しようとすると,Wrapperクラスの用意をする必要がある.
4. pickleで上手くいかないときは,dillを考慮する.
5. クラスを用いた実装は, https://docs.pymc.io/notebooks/blackbox_external_likelihood.html を参考にして,Wrapperクラスの中に必要な関数を詰め込む形を取った.
注意すべき点は,pythonの基本的な関数,クラスとnumpyモジュール以外を用いて関数の実装を行うと,gradientを用意しなければ Metropolis-Hastings methodかSlice Samplingの方法しか使えなくなってしまうことだ.
6. pm.Potentialはモデルをgraphvizで表現出来る代わりにwaicを計算出来ないので,pm.DensityDistを持ちいて実装する.lambdaを用いて簡略化しても良いのだが,pickleはlambdaを拾ってくれないのでdefで関数を定義した.
以下にGithub gistにあげたコードを示す.
コードをダウンロードするには,git clone https://github.com/akitoshiblog/blogsite
でpymc3 の下にある..
また,1~4までをまとめたコードは”pymc3_routine.ipynb”にまとめてあり,以下のようになる.
以上.
参考文献
一番良いのは,PyMC3の official document のtutorial とexmaples でした.
・Using PyMC3, http://people.duke.edu/~ccc14/sta-663-2018/notebooks/S11A_PyMC3.html
・Math, PyMC3 official document, https://docs.pymc.io/api/math.html
・pickle — Python object serialization, https://docs.python.org/3/library/pickle.html
・Saving and Loading GP model in PYMC3, https://discourse.pymc.io/t/saving-and-loading-gp-model-in-pymc3/1801
・PyMC3 Examples: GLM with Custom Likelihood for Outlier Classification, https://sedar.co/posts/glm-robust-regression-using-custom-likelihood-for-outlier-classification/
・What is pm.Potential in PyMC3? , https://stats.stackexchange.com/questions/251280/what-is-pm-potential-in-pymc3
・I can “pickle local objects” if I use a derived class? ,https://stackoverflow.com/questions/36994839/i-can-pickle-local-objects-if-i-use-a-derived-class
コメント