old school magic

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

Python 3.4.0でscikit-learnがインストールできない?

Python 3.4.0でscikit-learnをインストールしようとしたらこんなエラーが出ました。

sklearn/cluster/_k_means.c:7955:19: error: no member named 'f_tstate' in 'struct _frame'

        (*frame)->f_tstate = tstate;

        ~~~~~~~~  ^

調べてみたところCythonのエラー?っぽいです。
BUG/BLD 3.4 compatibility of cython c files #1311
https://github.com/statsmodels/statsmodels/issues/1311

とりあえず(pythonの)バージョン落として対処します。
分かり次第対策書きます。

変分ベイズについての資料まとめ(随時更新)

変分ベイズとは?

平均場近似、変分推論、ベイズ学習など様々な呼び方があります。

フリーで読める解説だとこれが一番わかりやすかったです。
自然言語処理のための変分ベイズ
http://www.ism.ac.jp/~daichi/paper/vb-nlp-tutorial.pdf

CiNiiユーザならこのシリーズがおすすめです。
ベイズ学習[I] : 統計的学習の基礎
http://ci.nii.ac.jp/naid/110003230932/

PRML関連のまとめ

PRMLの第10章が変分ベイズについての話です。
とても詳しく説明されているのですが、かなり難し目です。
なのでそこを解説した記事のまとめです。

PRML 読書会 #13 10章 近似推論法(変分ベイズ) - Mi manca qualche giovedi`? http://d.hatena.ne.jp/n_shuyo/20100412/prml
変分ベイズの定式化から近似事後分布の導出まで(1) | AKI LAB.
http://www.nejicolab.com/akip/?p=124
動く変分混合ガウス分布(実装編)- 動く PRML シリーズ(2) - Next MIDI Project
http://d.hatena.ne.jp/chrofieyue/20111202/1322832021
パターン認識機械学習」に挑戦 その1 ベイズ理論あたり(8章から11章まで)(自分のブログです...)
http://breakbee.hatenablog.jp/entry/2013/11/07/160817

統計物理との関連性

平均場近似(変分ベイズのこと)は「統計物理」という分野で育ってきた手法なので、統計物理を学ぶことが理解の助けになるかもしれません。
分かりやすかったのをいくつか。

統計学における平均場近似 - つれづれな学習帳
http://d.hatena.ne.jp/det/20121218
物理学者でない人にとって平衡統計力学とは
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/jnns-2007.pdf

最近の応用

グラフィカルモデルを変分ベイズによって計算すると、サンプリングするより計算量を大幅に削減できます。
そういった方向性の研究が多いようで、最近盛んに研究されているDeep Learning等にも変分ベイズが応用されているそうです。
(でもDeep Learningに関する資料は載せてません。見つかったら載せます。)

映像奮闘記: ノンパラメトリック平均場近似と確率伝播法の提案
http://mglab.blogspot.jp/2013/12/blog-post.html
変分ベイズ学習理論の研究動向 - IBIS2013 プログラム詳細
http://ibisml.org/ibis2013/details/#60
ディリクレ過程混合モデルへの変分推論適用について(これも自分のブログですが...)
http://breakbee.hatenablog.jp/entry/2013/11/30/222553

※追記 変分ガウス分布と、変分ディリクレ過程ガウス混合モデルですが、python機械学習ライブラリであるscikit-learnに実装されています。詳しくはドキュメントをご参照ください。
2.1. Gaussian mixture models - scikit-learn
http://scikit-learn.org/stable/modules/mixture.html


変分ベイズの理論的な部分について

変分ベイズ法は「自由エネルギー」と呼ばれるものを最小化しています。
これは「対数周辺尤度」や「確率的複雑さ」と呼ばれるものだそうです。

自由エネルギーを最小化することがどういうことなのか、ということについて知っておくと理解が深まるかもしれません。

東京工業大学の渡辺澄夫先生のホームページに多くの情報が掲載されています。

渡辺澄夫先生のホームページ
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/index-j.html
渡辺澄夫先生の講演などの記録
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/backnumber.html

いくつか参考になったページをリンクしますと、

最尤推定はいつなら大丈夫?
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/mlesafety.html
一般と特殊
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/general-special.html
初めてのベイズ学習
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/Bayestheory.html
変分ベイズ学習の理論
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/vbtheory.html
変分ベイズ学習理論入門
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/var-bay.pdf
初めてのWAICとWBIC
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/waicwbic_j.html

あたりがとても参考になりました。

Python環境をhomebrew + pipで構築した時の注意事項

私はMac(今はOS X Mavericks)でPython環境を構築する時、

  • Python本体はhomebrew
  • 各ライブラリ(numpy, scipy, matplotlib, scikit-learn等)をpip

で管理しています。
この方式だと、homebrewでpythonをアップグレードした時、各ライブラリが読み込めなくなることがあります
私の場合は特にmatplotlibで起こります。

そういう時はpipで各ライブラリを一旦アンインストールしてからインストールし直すと解決できます
参考:pipの使い方 (2014/1バージョン) — そこはかとなく書くよん。

感想

この構築の仕方は割りと気に入ってるのですが、アップデートの際にエラーが起こって困ったりもします。
Python環境、どうやって構築するのが一番なんでしょうか...

Windows/Macで英語論文(pdf)を読む時に便利なこと

私は英語が苦手です。勉強も極力日本語文献でしています。
しかし、どうしても英語論文を読まなければいけないときが多々あります。

理系の英語論文を読む時、一番やっかいに思うのは「専門用語が分からない」ことです。
いちいちコピペして辞書引くのが大変面倒です。
そんな時に便利な知識(とプラグイン)を紹介したいと思います。

Mac

今更気づいたのですが、Macだと分からない単語の上で3本指でタップすると分からない単語の意味がポップアップ表示されます。デフォルト機能です。
参考 : Mac の基本:マルチタッチジェスチャ
(※1:pdf以外で使えます。プレビュー以外でも使えます。英単語以外も調べてくれます。)
(※2:Mavericksは3本指でシングルタップですが、Lionの場合はダブルタップだそうです。)

Windows

Weblioが、Adobe Readerで使えるポップアップ辞書プラグインを公開しています
参考 : PDF文書で直接ポップアップ英語辞書が使える「Weblio英和辞典プラグイン」を公開しました。 | ウェブリオ株式会社 公式企業サイト

  • その場で発音を聞くことができる
  • その場で「Weblio単語帳」に追加できる(要アカウント、無料)

といった利点があります。単語帳がすごく便利です。(調べた単語、すぐに意味を忘れちゃうので。)

感想1

私は機械学習自然言語処理といった分野に興味があるのですが、専門用語の英語が分からず苦労しています。
でも、英語論文を読めるようになるためには、きっと数をこなすことが一番の近道なんだろう...と思います。
大変そうなので、こういったサービスを使って気楽に取り組んでいきたいと思います。
英文法とかも復習したほうがいい気がしてきますし...

感想2

各分野ごとの英単語リストとかあったら便利そうですね。
ネット上で公開されてる教科書や論文から専門用語抽出して英和辞書作るとか...?

MacのSublime Text 2でCtrl + Bでのビルドをpython3に変更する

homebrewでpython3をインストールして、コマンド名が"python3"になってくれてるとします。

1. 設定ファイルの表示

# メニューからPackageフォルダを(Finderで)表示する
"Preferences" -> "Browse Packages..."

# Finderから設定ファイルを開く
Python -> Python.sublime-build

2. 設定ファイルの変更
Python.sublime-buildを以下に変更

{
	"cmd": ["python3", "-u", "$file"],
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.python"
}

とりあえずPython3の設定はこれで完了...にします。
IPython Notebook とかはまた今度にします。

OS X Mavericksにpyreadlineがうまく入らない(けどよく考えたら必要なかった)話

python3でiPyhtonをインストールしようとした時に、適当にググって「windowsだとpyreadlineがいるのか、とりあえずmacでも入れよう」と思いインストールし、iPythonを入れたら起動時にエラーが出ました。

Traceback (most recent call last):
  File "/usr/local/bin/ipython3", line 9, in <module>
    load_entry_point('ipython==1.1.0', 'console_scripts', 'ipython3')()
  File "/usr/local/lib/python3.3/site-packages/IPython/__init__.py", line 118, in start_ipython
    return launch_new_instance(argv=argv, **kwargs)
  File "/usr/local/lib/python3.3/site-packages/IPython/config/application.py", line 544, in launch_instance
    app.initialize(argv)
  File "<string>", line 2, in initialize
  File "/usr/local/lib/python3.3/site-packages/IPython/config/application.py", line 89, in catch_config_error
    return method(app, *args, **kwargs)
  File "/usr/local/lib/python3.3/site-packages/IPython/terminal/ipapp.py", line 323, in initialize
    self.init_shell()
  File "/usr/local/lib/python3.3/site-packages/IPython/terminal/ipapp.py", line 339, in init_shell
    ipython_dir=self.ipython_dir, user_ns=self.user_ns)
  File "/usr/local/lib/python3.3/site-packages/IPython/config/configurable.py", line 349, in instance
    inst = cls(*args, **kwargs)
  File "/usr/local/lib/python3.3/site-packages/IPython/terminal/interactiveshell.py", line 320, in __init__
    **kwargs
  File "/usr/local/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 475, in __init__
    self.init_readline()
  File "/usr/local/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 1784, in init_readline
    import IPython.utils.rlineimpl as readline
  File "/usr/local/lib/python3.3/site-packages/IPython/utils/rlineimpl.py", line 28, in <module>
    from readline import *
  File "/usr/local/lib/python3.3/site-packages/readline.py", line 6, in <module>
    from pyreadline.rlmain import Readline
  File "/usr/local/lib/python3.3/site-packages/pyreadline/__init__.py", line 11, in <module>
    from . import unicode_helper, logger, clipboard, lineeditor, modes, console
  File "/usr/local/lib/python3.3/site-packages/pyreadline/clipboard/__init__.py", line 13, in <module>
    from .win32_clipboard import GetClipboardText, SetClipboardText
  File "/usr/local/lib/python3.3/site-packages/pyreadline/clipboard/win32_clipboard.py", line 37, in <module>
    from pyreadline.keysyms.winconstants import CF_UNICODETEXT, GHND
  File "/usr/local/lib/python3.3/site-packages/pyreadline/keysyms/__init__.py", line 23, in <module>
    raise ImportError("Could not import keysym for local pythonversion", x)
NameError: name 'x' is not defined

If you suspect this is an IPython bug, please report it at:
    https://github.com/ipython/ipython/issues
or send an email to the mailing list at ipython-dev@scipy.org

You can print a more detailed traceback right now with "%tb", or use "%debug"
to interactively debug it.

Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
    c.Application.verbose_crash=True 

pyreadlineのエラーっぽかったので再インストールしてみたら、

$pip3 install pyreadline
Downloading/unpacking pyreadline
  Downloading pyreadline-2.0.zip (108kB): 108kB downloaded
  Running setup.py egg_info for package pyreadline
    
    package init file 'pyreadline/configuration/__init__.py' not found (or not a regular file)
Installing collected packages: pyreadline
  Running setup.py install for pyreadline
    package init file 'pyreadline/configuration/__init__.py' not found (or not a regular file)

Successfully installed pyreadline

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

__init__.pyが見つかってないのにインストール成功ってでて、それが原因でiPythonの起動エラーが起きてる...?

対処のしようがなかったので、pyreadlineをアンインストールしてiPython起動してみたらちゃんと起動しました。

結論

mac(OS X Mavericks)でiPython使うのにpyreadlineは必要ない、というか入れたら起動しなくなる

iPythonのmacでの正しいインストール法

iPythonインストールするのにこちらの記事が参考になりました。
IPythonをインストールして使い始めた: 黄昏てなんかいられない
僕は何となくpyreadlineを入れてしまいこけましたが、この記事の通りやればうまく行くと思います。

OS X Mavericksにアップデートしたらhomebrewでインストールしたscipyがアップデートできなくなった話

問題

前までhomebrewを使ってpython2/numpy/scipyをインストールしていたのですが、Mavericksにしてからscipyのアップデートができなくなりました。

Error: scipy dependency tbb was built with the following
C++ standard library: libc++ (from clang)

This is incompatible with the standard library being used
to build scipy: libstdc++ (from clang)

Please reinstall tbb using a compatible compiler.
hint: Check https://github.com/mxcl/homebrew/wiki/C++-Standard-Libraries

scipyが依存しているtbbというパッケージのエラーです。
MavericksになってからC++コンパイラが変わったらしく、tbbを再インストールし直せとのことですが直らず...

調べてみたら同じ問題に直面した方もいらっしゃったみたいです。
Unable to brew scipy on os x mavericks · Issue #48 · samueljohn/homebrew-python · GitHub

直らないので

いっそのこと全部インストールし直そう!と思いhomebrewごと再インストールしたのですが、いつのまにかnumpy/scipyがbrewのパッケージから無くなってました...
というわけで、pythonだけbrewで、他はpipでインストールしたらうまく行きました。

# pythonはbrewでインストール
brew install python

# 科学技術計算環境はpipでインストール
pip install numpy
pip install scipy
pip install matplotlib
pip install scikit-learn

pipで入れられるものは極力pipで入れたほうがいいのかもしれません。