PRMLの機械学習アルゴリズムを実装して理解する



PRMLこと、「パターン認識と機械学習」 のアルゴリズムをPython (numpyと必要に応じてscipy)でほぼスクラッチで実装する方法を解説した記事です。

対応するjupyter notebookは[筆者のgithubのリポジトリ](https://github.com/amber-kshz/PRML) からご覧いただけます。

# 各記事へのリンク

※随時リンク先が増えていきます。

* 第3章 線型回帰モデル:  [ベイジアン線型回帰/エビデンス近似](https://qiita.com/amber_kshz/items/35bf3ef761e4d3b248b3)
* 第4章 線型識別モデル: [ロジスティック回帰](https://qiita.com/amber_kshz/items/98adc9cb4033489736c0)
* 第5章 ニューラルネットワーク: [全結合ニューラルネットワーク](https://qiita.com/amber_kshz/items/2b2dd25e07229c6293df)
* 第6章 カーネル法: [ガウス過程回帰](https://qiita.com/amber_kshz/items/e385e985fddf78d21f71)
* 第7章 疎な解を持つカーネルマシン: [サポートベクターマシン(SVM)による2値分類](https://qiita.com/amber_kshz/items/6a9f8b6dd857edffce58)
* 第8章 グラフィカルモデル →　きちんと理解できていないので、当面保留。。。
* 第9章 混合モデルとEM: [混合ガウスモデルに対するEM algorithm](https://qiita.com/amber_kshz/items/be07ceeaf3dd43201c74)
* 第10章 近似推論法: [ベイズ混合ガウスモデルに対する変分推論](https://qiita.com/amber_kshz/items/be0036d8249a2729572c)
* 第11章 サンプリング法: [マルコフ連鎖モンテカルロ](https://qiita.com/amber_kshz/items/3049ab54385e2ce76b29)
* 第12章 連続潜在変数: [確率的主成分分析](https://qiita.com/amber_kshz/items/e47fa606863aa97c7bd7)
* 第13章 系列データ: [隠れマルコフモデル](https://qiita.com/amber_kshz/items/dadc6cfe67d3b80edeb1)
* 第14章 モデルの結合: [BaggingとAdaBoost](https://qiita.com/amber_kshz/items/8869d8ef7f9743b16d8d)

# 方針
* この連載では、機械学習アルゴリズムの実装を通して、**それらのアルゴリズムの動作を理解することを目標とします。** 従って、用いるデータはあくまでtoy dataです。また、アルゴリズムを実データに適用するときのテクニックのような話はほとんど扱わない予定です。
* なるべく分かりやすい書き方を目指してはいますが、基本的には自分の勉強(炎上ラーニング)用の記事です。**「これ誤植では?」「そもそも理解が間違ってる」「これは誤解を招く」「コードのこの部分はこう書いたほうが綺麗」などなど、マサカリ大歓迎です。**
* 数式部分はPRMLを読んで理解しているものと仮定します。ですので、この記事ではあまり数式の詳細は解説しません。
* その代わり、数式をコードに落とし込む部分について事細かに解説します。(e.g.) 数式のどの変数がコード内のどの変数に対応していて、どういう形のarrayにしているか、など。
* なお、PRMLとは異なり、添え字は1からではなく0から始まる記法を採用します。これは、Pythonのindexingと整合させるためです。
* python3を用います(3.5以上を仮定しています)。
* numpyと、必要に応じてscipyを利用します。scipyを利用するのは主に特殊函数や線型代数の部分の予定です。scikit-learnはデータセットを持ってくるときに使用することもあります。

# 参考文献

* C.M.ビショップ「パターン認識と機械学習 ベイズ理論による統計的予測」丸善出版(2012)

PRMLこと、言わずと知れた機械学習の名著です[^1]。この連載は、PRMLの各章から1つずつアルゴリズムを実装していきます。
英語版のPDFは[著者の公式webページ](https://www.microsoft.com/en-us/research/people/cmbishop/)から無料でダウンロードできます。日本語版のamazonのページは上巻は[こちら](https://www.amazon.co.jp/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E8%AA%8D%E8%AD%98%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E4%B8%8A-C-M-%E3%83%93%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/dp/4621061224)、下巻は[こちら](https://www.amazon.co.jp/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E8%AA%8D%E8%AD%98%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E4%B8%8B-%E3%83%99%E3%82%A4%E3%82%BA%E7%90%86%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E8%A8%88%E7%9A%84%E4%BA%88%E6%B8%AC-C-M-%E3%83%93%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/dp/4621061240)


* [加藤公一「機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム」SBクリエイティブ (2018)](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E3%82%A8%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B9-%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6Python-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-Machine-Learning/dp/4797393963)

タイトルの通り、数学とPythonの基礎からみっちり鍛えて、機械学習のアルゴリズムと実装を学ぶことができる本です[^2]。**基礎から実装まできちんと機械学習を学びたい方は、私の記事なんぞではなく、このような本で学ばれることをお勧めします。**


* [PRMLのアルゴリズムをPython(ほぼNumpyだけ)で実装](https://qiita.com/ctgk/items/fc83b224ded1c0059a61)

既に同じ趣旨の記事として@ctgk さんのこちらの人気記事があります。
ただ、扱うアルゴリズムに違いがあったり、アプローチも異なったりしますので、今回筆者が新しく書く価値はゼロじゃないかなと思います。
筆者の記事に興味を持った方は、ぜひ@ctgkさんの記事もご覧いただければと思います!


# この記事を書き始めた理由

以下、与太話。

実はこの記事の中身は、既にだいぶ前に自分の勉強用にjupyter notebookとして書き、公開してありました。ただ、見返してみるといくつか不満もありました：

* 端的に言って、コードが汚い。
* 完成形のコードだけが書かれているので、どういう思考でコードにしていったのか見て取れない。
* 英語で書いてあるので、日本の方の役に立ちにくい[^3]。
* 
綺麗に書き直したいなーと思っていたところに同僚の勧めもあり、コードを手直しするついでに、Qiitaでもう少し詳しい解説をゆるふわっと日本語で書いてみようと思った次第です。


[^1]: 万人に薦められる教科書ではないかもしれませんが、物理系出身者には自信を持ってお薦めできる本かと思います。著者は元は物理の出身のようで、そのせいか私を含めて物理出身者は口を揃えて「読みやすい」と言っていました(中途半端に自然言語で説明するよりも数式をきちんと書くところが良い。)。ただし、実装についての言及はあまりありません。実装しないと分かった気にならなかったのが、この記事(の元になるjupyter notebook)を書き始めた理由です。
[^2]: 私は立ち読みしかしていないのですが、恐らく日本語で読める本の中では最も懇切丁寧に深いところまで学べる本なのではないかと思います。
[^3]: でもその代わり, 海外の方からスターをいただいたときは嬉しかった...!