old school magic

機械学習に関する備忘録です。

OS X Mavericksにpython3.3/numpy/scipy/matplotlib/scikit-learnをインストールする

この記事は古くなっています。
最新版の記事はこちらになります。


MacでPythonの機械学習環境構築(2015年2月版) - old school magic


内容はタイトル通りです。
OS X Mavericksにアップデートしてpython関係のインストールがうまく行かなくなった方に参考になれば嬉しいです。(python3に関してはあんまりMavericks関係ないかも。)

pythonは2系と3系を両方使いたいので、Homebrewを使ってインストールします。

  • 公式

Homebrew — The missing package manager for OS X

  • インストール、使い方

MacOSX - パッケージ管理システム Homebrew - Qiita

  • アンインストール

Homebrewのアンインストールと再インストール: 黄昏てなんかいられない

Home · Homebrew/homebrew Wiki · GitHub

# python3のインストール
brew install python3

brewを使ってインストールすると、pipsetuptoolsも入ってきて大変楽です。
brewでインストールした場合python3系のコマンドは後ろに3が付きます。
(2系はそのまま)

scipygfortranに依存してるので先にインストールします

# gfortranのインストール
brew install gfortran

numpy/scipybrewにあるパッケージは2系なので
(訂正 : brew searchしてみたら2系のnumpy/scipyはHomebrewになかったです...あれー...?)


pipでnumpy/scipyをインストールします。

# numpyのインストール
pip3 install numpy

# scipyのインストール
pip3 install scipy

で次にmatplotlibをインストールするのですが、前はここでこけました。
macでPython3のmatplotlibを導入出来ませんでした - old school magic

とりあえずmatplotlibにはfreetypelibpngというパッケージが必要なのでインストール。

# freetypeのインストール
brew install freetype 

# libpngのインストール(おそらく上のコマンドですでにインストールされてる)
brew install libpng

ですがこのままmatplotlibをインストールしようとするとエラーが出ます。
(コンパイルしたけどfreetypeが見つからなかったよ!ってエラーです)

ピンポイントでStack Overflowに同じ質問ありました。
python - Unable to install matplotlib on Mac OS X - Stack Overflow

要するにfreetypeやlibpngがXCodeコマンドラインツールによって変なところにインストールされちゃってるのが原因みたいです。(何故か/usr/X11/以下にインストールされてます。)

というわけで(/usr/local/に)リンクします。

# 魔法の言葉
sudo mkdir -p /usr/local/include
sudo ln -s /usr/X11/include/freetype2/freetype /usr/local/include/freetype
sudo ln -s /usr/X11/include/ft2build.h /usr/local/include/ft2build.h
sudo ln -s /usr/X11/include/png.h /usr/local/include/png.h
sudo ln -s /usr/X11/include/pngconf.h /usr/local/include/pngconf.h
sudo ln -s /usr/X11/include/pnglibconf.h /usr/local/include/pnglibconf.h
sudo mkdir -p /usr/local/lib
sudo ln -s /usr/X11/lib/libfreetype.dylib /usr/local/lib/libfreetype.dylib
sudo ln -s /usr/X11/lib/libpng.dylib /usr/local/lib/libpng.dylib

そしてmatplotlibscikit-learnをインストールして完了!

# インストール成功!
pip3 install matplotlib

# scikit-learnのインストール
pip3 install scikit-learn 

補足

gfortran入れるの忘れると、

Library not loaded: /usr/local/Cellar/gfortran/4.8.2/gfortran/lib/libgfortran.3.dylib
  Referenced from: /usr/local/lib/python3.3/site-packages/scipy/special/_ufuncs.so
  Reason: image not found  

って感じのエラーが出ます。

あとbrewでpython3を入れると

Setuptools and Pip have been installed. To update them
  pip3 install --upgrade setuptools
  pip3 install --upgrade pip

To symlink "Idle 3" and the "Python Launcher 3" to ~/Applications
  `brew linkapps`

You can install Python packages with
  `pip3 install <your_favorite_package>`

They will install into the site-package directory
  /usr/local/lib/python3.3/site-packages

See: https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python

って感じでSetuptoolsとPipも入れたよ!ってメッセージが出ます。

感想

コンパイルエラーに対処できるようになりたいです...

ディリクレ過程混合モデルへの変分推論適用について

この記事について

ノンパラメトリックベイズは分かりやすいチュートリアルは良く見かけるのですが、そこから一歩進んだ(日本語の)資料に行きつけなかったので、色々と論文読んで簡単に(数式を出さないで)まとめてみます。
ぶっちゃけるとCollapsed Variational Dirichlet Process Mixture Modelsの簡単な要約です。

あまり自信がないのでもし間違ってたりしたらご指摘お願いします。

前の記事よりはまともな説明ができれば...と思います。


事前知識としてノンパラベイズと変分推論の知識が必要ですが、ノンパラベイズは持橋さんの分かりやすい解説があるのでご紹介します。

ディリクレ過程中華料理店過程棒折り過程交換可能性、そしてアルゴリズムについて説明しています。

変分推論についてですが、上田修功さんの解説がとても分かりやすいと思うので、読める環境がある方はぜひ。

変分推論だけでなく、周辺化変分推論ディリクレ過程への応用についても簡単に説明しています。

一応簡単に説明すると、変分推論はEMアルゴリズムの一般化(というかベイズ版)です。
「推定したい分布」が「独立な分布の積」に分解されると仮定し、各分布を「自分以外の全ての分布の期待値」で更新します。(厳密には平均場近似と言います。)

背景

ノンパラベイズの一種であるディリクレ過程(Dirichlet Process, DP)と、これを用いた混合モデル(Dirichlet Process Mixture Model, DPM)についてですが、これらは計算する際にサンプリングを用います。

サンプリングは色々な分布に適用できて便利なのですが、計算量がめちゃくちゃ多いです。

なのでDPMの計算量を減らすことが研究対象となったりするのですが、そのアプローチの一つが変分推論の適用です。
ベイズ理論に基づく方法だと、変分推論は理論的にもしっかりしていて、しかもサンプリングよりかなり速いので、計算量削減を考える時にはよく用いられるみたいです。

変分推論できる過程について

ディリクレ過程と等価な過程として、中華料理店過程(Chinese Restaurant Process, CRP)が用いられます。
が、CRPには変分推論を適用できないので、他のスキームを考える必要があり、

  • Truncated Stick Breaking Process (TSB, 切り捨て棒折り過程?)
  • Finite symmetric Dirichlet prior (FSD, 有限対象ディリクレ事前分布...?)

の二種類が提案されています。

TSBは、Stick Breaking Process(SBP, 棒折り過程)を十分な大きなクラスタ数Tで切り捨て(=truncate)したものです。
この過程は交換可能性が成り立たず、学習する順番によって確率分布が変わってしまいます。(対策あり)

FSDは、混合比の事前分布として、「十分大きなクラスタ数Kを持つ対象なディリクレ分布」を用います。
こっちは交換可能性が成り立ちます

この2つのスキームは、十分大きなTとKについてほぼ同精度になります。

この2つのスキームに対して、変分推論(Variational Bayes Inference, VB)または周辺化変分推論(Collapsed VB, CVB)を適用します。

周辺化変分推論について

CVBとは、考えている分布のパラメータが解析的に積分消去可能である時、「パラメータの分布」を「真のパラメータの事後分布」に置き換えることによって変分推論の目的関数を簡略化する手法です。
カルバックライブラー情報量(真の分布との距離)も計算量も小さくなるので、精度も効率も上がります

補足

  • TSBは交換可能性が成り立たないので適切な順序付けが必要なのですがクラスタのサイズで降順に順序付けると精度が良いみたいです(Ordered TSB)。でも証明とかはされてないです。
  • 変分近似してもクラスタ変数の計算がすごい大変みたいなので、中心極限定理とか使ってガウス分布で近似したりしてます。

ソフトウェア

先ほど紹介したCollapsed Variational Dirichlet Process Mixture Modelsの著者の一人である栗原さんによる実装が公開されてます。混合ガウス分布への適用です。
Variational Dirichlet Process Gaussian Mixture Model - Kenichi Kurihara's Site
matlabなので環境がある方はぜひ。

結果

精度的には従来のサンプリングを用いた手法とほぼ同じ精度を実現しています。

計算量は
CVB>VB>>>>>>>>>サンプリング
といった感じでしょうか。サンプリングだと終わらない実験も変分推論だと終わったりとかあるらしいです。

まとめや個人的な感想

  • 変分推論はどんなモデルにも適用できるわけではないのですが、適用できればサンプリングより遥かに少ない計算量で近似できます。ですが式の導出がすごい重いです。論文だとさらっと結果の式だけ書いてあるのですが、おそらくかなり複雑な計算があったんでしょうね...
  • 変分推論化はこの前IBIS(機械学習と学習理論のワークショップ)に参加させて頂いたのですが、Deep Learningもグラフィカルモデルとみなして変分推論やサンプリングすると知りびっくりしました。
  • 変分推論は多分一時収束だと思うんですが、今回の場合は計算量は「(クラスタ数が既知である場合の)EMアルゴリズム」で抑えらたりするのかな?とか考えました。
  • FSDって普通の変分混合分布と何が違うんだろう...まだ理解が追いつけてないです...
  • 変分推論じゃないけどサンプリングのIGMMやVB-GMMがpython機械学習ライブラリのscikit-learnで実装されててびっくりしました。(訂正:実装されてるIGMMはTSBPでした)

macでPython3のmatplotlibを導入出来ませんでした

タイトル通りです...

今まではインストールが簡単という理由でpython2をいじっていたのですが、やっぱり新しい言語に触れたいなと思い、python3に移行することを決意した...のですが...

インストールするのはpython3numpyscipymatplotlib(こけた)scikit-learnです。
管理が楽なので極力homebrewを使って行きます。

$ brew install python3 # python3のインストール
$ pip3 install numpy # numpy のインストール
$ pip3 install scipy # scipy のインストール

ここまでは(すごい警告でたけど)うまく行きました。

でmatplotlibなんですが、gitからクローンしてsetup.pyでインストールしようとしたのですが...

$ git clone git://github.com/matplotlib/matplotlib.git
$ cd matplotlib
$ python3 setup.py build # ここでこけました。
$ sudo python3 setup.py install

エラーを見た限りコンパイルエラーで、freetypeが入ってないよ!とのことなので

$ brew install freetype

したのですがすでにインストールされてたみたいで...
リンクされてないだけなのかなーと思い

brew unlink freetype
brew link freetype

とリンクし直したのですがそれでもうまく行かず...(インストールし直してもダメでした)

homebrewを使わないで(ソースから)freetypeインストールしてみたんですがそれでもダメで...

freetypeちゃんと入ってるはずなのに...

python3使ってみたいので何とか解決します。
MarvericksになってからC++コンパイラ変わったみたいでしょっちゅうエラー出るしいっその事OS再インストールするのもいいかも...

「パターン認識と機械学習」に挑戦 その1 ベイズ理論あたり(8章から11章まで)

前回までいくつか機械学習の入門書を読み、今なら多少読めるのではとPRMLに挑んでみました。
目標はPRML/course - 機械学習の「朱鷺の杜Wiki」で紹介されてる中間(修士)レベルです。

どこから読もうかと考えたのですが、上巻は以前読ん(で死ん)だので下巻、それも機械学習の入門書だと省かれることの多いベイズ理論あたりに挑戦しました。

PRMLの下巻は6章と7章がSVM関係、8章から11章までがベイズ理論関係、12章が主成分分析、13章が隠れマルコフモデル、14章が決定木と言った構成となっています。
(ちなみに上巻は1章が機械学習の基礎、2章が確率分布、3章と4章が線形回帰/識別モデルの基礎、5章がニューラルネットワークです。)

「はじめてのパターン認識」では、線形モデルを最小二乗法からニューラルネットワークSVMといった流れで説明し、後半でEMアルゴリズムや主成分分析、決定木を個別に扱っていました。
前半の線形モデルの説明の流れはとてもわかり易いのですが、ベイズ理論でこれにあたるのがPRML下巻の8章から11章だと思います。というわけでこの4章を通して読んだので、その時にどういった資料を参考にしたかを書いていきます。

全体の流れ

ベイズ理論の機械学習への応用例として、現在大きく分けて2つの手法に分けられます。変分推論(10章)とサンプリング法(11章)です。
入門書でも扱われることの多いk-Means法やEMアルゴリズム(9章)は、変分推論の特別なケースであると考えられます。
また、変分推論とサンプリング法は条件付き確率や同時分布を扱うのですが、これを視覚的に扱えるように考案されたのがグラフィカルモデル(8章)です。

まず8章で確率に対する感覚を養い、9章でk-MeansやEMアルゴリズムを学び、10章でこれらをベイズ的な枠組みで一般化します。この流れで変分推論に対する理解を深めるのがPRMLの目的だったんですね...

変分推論は決定論的なアプローチであり、解析的に計算可能な近似をすることで、大規模な問題にも適用可能な手法です(と言ってもEMアルゴリズムは1次収束ですが)。
これに対し、サンプリング法は数値的なアプローチで近似することを考えます。これは計算量こそ変分推論より多いですが、より一般的に分布の近似に用いることができます。ちょうど長所と短所が対照的になっている訳ですね。
11章では変分推論への対比を意識しつつサンプリングを学びます。

8章

この章は計算もほとんどなく、事前知識も必要ないため、頑張れば他の資料に頼らなくても読み進めることができると思います。
それでも細かい疑問が多かったのですが、sleepy_yoshiさんのPRML読書会での資料(PRML読書会10回: 第8章グラフィカルモデル (前半) - 睡眠不足?!,
第11回PRML読書会: 第8章グラフィカルモデル (後半) - 睡眠不足?!)が多いに参考になりました。素晴らしいです。

9章, 10章

k-MeansからEMアルゴリズム、変分推論と一般化させつつ学ぶのが理解の助けになると思います。
k-MeansやEMアルゴリズムは他の入門書でも紹介されることが多いのでなんとなく理解できていたのですが、それでも何度も諦めそうになるくらい式変形が鬼でした。PRML副読本が式変形を丁寧に追っかけてくれています。

パターン認識と機械学習の学習―ベイズ理論に挫折しないための数学

パターン認識と機械学習の学習―ベイズ理論に挫折しないための数学

(pdf版がgithubで公開されています。 -> herumi/prml · GitHub)
amazonだと品切れですが、他サイトでは注文できるみたいです。(詳しくは【PRML同人誌】パターン認識と機械学習の学習-ベイズ理論に挫折しないための数学(光成 滋生 著)を参照)
ジュンク堂紀伊国屋だと売ってたりします。

この辺りはちゃんと手計算で追えるようになりたいです。2週目で頑張ります。

また、上田修功先生が電子情報通信学会誌で連載されていたベイズ学習というシリーズが大変わかりやすかったのですが、有料(CiNiiに登録が必要)なので環境がある人は是非。

11章

サンプリングの話です。計算もさることながら概念が掴みにくいと思います。(僕もまだちゃんとわかってない...)
伊庭幸人先生が電子情報通信学会で執筆されたCiNii 論文 -  最近のベイズ理論の進展と応用[V・完] : モンテカルロ法の展開がとてもわかりやすかったのですが、これも有料ですね...

代わりに、伊庭先生の「ベイズ統計と統計物理」という本にサンプリングについてわかりやすい説明があったので紹介させて頂きます。

岩波講座 物理の世界 物理と情報〈3〉ベイズ統計と統計物理

岩波講座 物理の世界 物理と情報〈3〉ベイズ統計と統計物理

変分推論やサンプリング法は統計物理に起源があり、この本では統計物理の観点からサンプリング法について説明しています。100Pくらいの本で大変読みやすいので是非。
なお、変分推論は物理学の文脈だと「平均場近似」だと言うそうです。(この本には載っていませんが)

もう一歩進んで

変分推論やサンプリングの話が分かると、最近の手法であるCollapsed Variational Bayes(CVB, 崩壊変分推論?周辺化変分推論だそうです)やノンパラメトリックベイズも理解できるようになると思います。

CVBは上田先生のCiNii 論文 -  最近のベイズ理論の進展と応用[IV] : 変分ベイズ法(有料)に、
ノンパラメトリックベイズは持橋先生の最近のベイズ理論の進展と応用 (III) ノンパラメトリックベイズ(無料公開されてる!!)に説明があります。

電子情報通信学会の「最近のベイズ理論の進展と応用」は他にも階層ベイズ(8章に関係)や逐次推論の話もあり、かなり参考になりました。

他の資料

まだ読めていないのですが、さらに詳しく知りたい場合は以下の本が参考になりそうです。

計算統計 I―確率計算の新しい手法 (統計科学のフロンティア 11)

計算統計 I―確率計算の新しい手法 (統計科学のフロンティア 11)

計算統計 2 マルコフ連鎖モンテカルロ法とその周辺 (統計科学のフロンティア 12)

計算統計 2 マルコフ連鎖モンテカルロ法とその周辺 (統計科学のフロンティア 12)

計算統計学の方法―ブートストラップ・EMアルゴリズム・MCMC (シリーズ予測と発見の科学 5)

計算統計学の方法―ブートストラップ・EMアルゴリズム・MCMC (シリーズ予測と発見の科学 5)

絶版になってしまっているのもあるので、図書館で探してみるのもありだと思います。

今回はベイズ統計の中でも機械学習に関係する部分だけを拾ってきた形になるわけですが、ここまで勉強するとベイズ統計自体にも興味が湧いてきます。

ベイズ統計の理論と方法

ベイズ統計の理論と方法

渡辺先生はとてもわかり易く説明なさるので、この本にもぜひ挑戦してみたいと思います。

最後に

変分推論やサンプリングについて、なんとなくわかった気はするのですが...まだ実感がないのでしばらくはRで実装して理解を深めていこうと考えています。
来年にでも二周目に挑戦したいです。

「パターン認識と機械学習」への遠回り その3 「はじめてのパターン認識」

その1 フリーソフトで作る音声認識システム
その2 自然言語処理のための機械学習入門

前回までは音声認識だったり自然言語処理だったりとだいぶ範囲を狭めた本を読んで来ましたが、今回はパターン認識自体への入門書を読みます。

はじめてのパターン認識

はじめてのパターン認識

どんな本?

THE 入門書、まさしくPRMLの前に読むべき本だと思います。
PRMLの上巻と下巻の6、7、9、12、14章に該当する内容が初学者にも分かるように優しく説明されています。易しくはありません。
200P程の本にここまでの内容が詰まっているとは思いませんでした。
Rによる実行例が豊富で、視覚的にも理解を得やすいのではないでしょうか。
章末問題の演習も掲載しているので独学に向いていると思います。

いいところ

基礎的な事項への説明が熱いです。
あと線形識別器の導入からSVMに至るまでの説明の仕方が非常にわかりやすいと思います。

気になったところ

主成分分析がちょっとわかりづらかったかも。。。
もう一回読みなおしてみます

何が学べるか

基礎、k近傍法、線形識別器、主成分分析、クラスタリング(混合モデル)、決定木とブースティング

この三冊を読んでみて

PRMLでいうところの下巻の8章(グラフィカルモデル)、10章と11章(ベイズ的手法)、13章(系列データ)を除く全ての章について、基礎的な事項を学んだことになっている(はず)と思います。
次はベイズ的手法についての参考文献を読んでみようと思います。

「パターン認識と機械学習」への遠回り その2 「自然言語処理のための機械学習入門」

その1 フリーソフトで作る音声認識システム

前回入門書への入門書まで読み終えたので、今回は入門書を読みます。

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

どんな本?

自然言語処理を題材にした機械学習の入門書です。
200Pくらいと読みやすく、式展開も自力で追え、例題も豊富なので2冊目以降に読む本としてオススメです。

扱っている手法も、自然言語処理特有なものではなく、一般的に用いられているものばかりなので、「自然言語処理に興味ないしなあ...」という方にも参考になるのではないかと思います。

いいところ

最適化手法について最初の章でちゃんと説明してるところがいいと思います。
例題が多いので、「実際に使うとこんな感じなのか」というイメージも掴めるんじゃないでしょうか。
あと、自然言語処理特有のあれこれについて補足してくれているのがポイント高いです。

気になったところ

第3章でEMアルゴリズムについて説明しているのですが、他の章では全て最尤推定を用いてるのにどうして混合分布だけEMアルゴリズムなのか、というところに説明が欲しかったです。
東工大の杉山先生の講義スライドがそれについて分かりやすかったのでご一緒にどうぞ。

あと、第5章での説明がもう少し詳しいといいのになーと思います。
特にHMMに例題がなかったのが惜しいです。
第5章については、巻末で紹介されてる参考文献を読んだりして補完しようと思います。

何が学べるか

最適化手法、自然言語処理のための特徴抽出、最尤推定、MAP推定、k-Means、混合モデル、EMアルゴリズム、ナイーブベイズSVMカーネル法対数線形モデル、HMM、分類器を組み合わせた系列データへの応用、CRF、実験の仕方、評価手法

「パターン認識と機械学習」への遠回り その1 「フリーソフトでつくる音声認識システム」

機械学習の入門書として、代表的なのが「パターン認識と機械学習」という本です(通称PRML)。



先日、上巻を読み終わりました。



僕には少し早かったみたいです。。。
数式を追うのに必死になって、機械学習の概要がつかめなかったのが敗因かなーと思います。

というわけで、ちゃんと遠回りしてからPRMLに挑もうと思います。

機械学習ってこういうのだよ!」、「こんな感じの手順だよ!」、「こういうタスクがあるよ!」、「基本的な考え方はこんな感じだよ!」、「こんな手法があるよ!」といった感じのふわっとした概要に関する本から、ちょっとずつ詳しいところに踏み込んでいくような感じで勉強していきたいと思います。



というわけで「この本を読むぞ!」という意思表明として、読もうと考えている入門書を紹介したいと思います。
(いくつか読み終えた本もあります。)

フリーソフトでつくる音声認識システム - パターン認識・機械学習の初歩から対話システムまで

フリーソフトでつくる音声認識システム - パターン認識・機械学習の初歩から対話システムまで

どんな本?

全くのパターン認識/機械学習初心者が最初に本としておすすめなのがこの本です。
タイトルがタイトルなので、「フリーソフト...?」「音声認識はあんま興味ないなあ...」とスルーしてしまっていたのですが、手にとって見てあまりの分かりやすさに感動しました。


本の構成として「基礎編」と「実践編」に分かれています。第8章までが「基礎編」です。第9章からは実際にフリーソフトを動かして音声認識システムを構成する内容になってます。

概要

パターン認識とは何か」の説明から始まり、アナログデータの取り込み、前処理、特徴抽出、識別部といったパターン認識システムの構成を4ページ目で超わかりやすい図で述べ、識別部以外の説明を最初の3章しっかりしています。


4章から識別部の説明が始まるのですが、最近傍法パーセプトロンから始まり、SVMニューラルネットへと手取り足取り誘ってくれます。


7章で統計的(確率的)な方法について簡単に述べ(PRMLは統計的手法についての機械学習入門書)、第8章でシステムの評価方法について、交差確認法などの説明をしてくれます。


第9章からは「実践編」なのですが、第9章と第10章で系列データを扱う方法や、隠れマルコフモデルについて説明しているので、実践にまだ興味がなくてもここまで読むことをおすすめします。


第10章まで130ページ足らずで、パターン認識の基本的な考え方をしっかり説明し、SVMや系列データまで誘ってくれる素晴らしい本です。


この本で「フリーソフト」と読んでいるのは、実際に広く使われているWekaなどといった機械学習の統合環境なので、それらへの入門としても役に立ちます。

メリット

一番最初に読む本として大事なのは、分かりやすさももちろんですが、「こんなことができるんだよ!」と読者の興味と意欲を掻き立ててくれることだと思います。この本はそれをバッチリみたしています。超おすすめです!


思ったより長文になってしまったので今回はここまでにします。
5冊ほど紹介しようと考えています。(5冊目はPRMLですが。。。)