Mavericksでpython環境構築ではまったメモ(2014年5月29日版)

OSをバージョンアップして、MacBook Pro(Late 2011)にOS X 10.9.3 Mavericksを入れてみました。これまでOSはバグなどもあまりなく安定しており使い慣れた古い版のままでいいやとずっと思っていましたが、走らせてみたい新しいソースコードの対応具合や使ってみたい新機能などの期待される利点などの方がようやく上回り、重い腰を上げました。クリーンインストールをしてから、タイムマシンからデータを戻しました。

さて、Maverickspythonの環境を構築するにあたっていろいろ調べたところ、最近はHomebrewが流行っているようだという印象を受けました。NumPy、SciPy、Matplotlibあたりを入れるのを目標にします。早速取りかかろうとしたところ、MacPortsが入っていると競合してしまいよくない(3.1節参照)ということが分かり、そちらを消してきれいにするところから始めました。タイムマシンからデータを移行して古い環境まで復旧されてしまうと、クリーンインストールの意味が無かったですね。しょぼん。Pythonをいじってみたのはもう何年も前なので、そもそもどんな環境で使っていたのか思い出せませんが、MacPortsで入れたpython2系をvirtualenvとvirtualenvwrapperで作った仮想環境で試していたようです。BeautifulSoupが便利だなと思った記憶があります。

MacPortsやそれに関連したフォルダやPATHを削除して、Xcodeコマンドラインツールを入れておきます。コマンドラインツールは

xcode-select --install

とするとインストールされます。そこで、Homebrewを入れます。

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
brew doctor

このbrew doctorでエラーや警告がなくなるまでがんばります。と書いてあるのをよく見かけますが、本当にその通りでした。どうしてもMacPortsの名残などがたくさん残っているので怒られっぱなしでした。やれ、writeできないディレクトリがあるから'chown'しろだの、Broken symlinksを`brew prune`しろだの、brew install gitでgitを入れろだの、MonoがあるとCMakeする邪魔だとか、Unexpected 〜〜 filesと言われたものはすべてrmする、など。言われた通りに順番に対処していくと、ようやく

Your system is ready to brew.

と表示されて、ほっと一息をつき、しばらく感動の余韻にひたりました。バージョンを確認すると、

brew -v

Homebrew 0.9.5が無事に入ったようです。

次に、コンパイルにgFortranが必要ということなので、入れます。「科学計算ライブラリscipyの中で動く」らしいです。

brew install gfortran

Error: No available formula for gfortran
GNU Fortran is now provided as part of GCC, and can be installed with:
brew install gcc
おかしいなあ。他のサイトではすんなりこれで行くと書いてあるのに。言われた通りgccを入れても、gfortranがないって怒られます。今、これを書きながら追加で調べたら、こうやると、

brew versions gfortran

Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
https://github.com/Homebrew/homebrew-versions
と出るので、バージョンを指定して"homebrew-versions"というのを入れればよかったのかもしれません。
また、ここを読む限り(2014/05/17のコメント参照)gccを入れておけば、gfortranをさらに追加で入れる必要はないのかもしれませんが、でもエラーが消えなかったし変なの。手元の環境が変なのかもしれません。実際に上手く行った手順としては、ここから対応するOSのgfortranのインストーラーをダウンロードして入れたら動きました。

その後の試行錯誤の結果のコマンドはこんな感じ。python3系を入れてみることにした。

brew install python3
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew linkapps
pip3 install numpy
brew install swig
pip3 install cython
pip3 install scipy
brew install freetype
brew link --overwrite --dry-run libpng
brew link --overwrite libpng
sudo ln -s /usr/local/include/freetype2 /usr/include/freetype
sudo pip3 install matplotlib

途中いろいろ意味が分からないけれど、とりあえずやっておくというのを入れた。でも、2行目か3行目でupgradeしたせいで、cythonをインストールするときにeasy_install3コマンドが使えなくなったのかもしれない、ということを後で知りました。matplotlibに必要なfreetypeとlibpngは、freetypeを入れたら、libpngも自動的に入るようだ。libpngをインストールしようとすると、もう入っていると怒られる。ただし、リンクが貼られてないということなので、brew linkするといいみたい。シンボリックリンクを貼るのが足りない気もする。どれが必要で、どれが冗長かあるいは余計で、どれが上手く行ったコマンドなのかすでによくわかりません。とりあえず動くようになったことを、matplotlibのギャラリーにある図が作れるかどうかで確かめました。

ここまでをまとめると、python3、numpy、scipy、matplotlibがようやう入りました。後は、scikit-leanやipythonなどを続々入れたいと思います。

参考にしたページ:

などを参照しました。どうもありがとうございました。

Homebrewでpython3系の計算機環境(の入り口。一部)が構築できたところで、いくつかコマンド

python --version
which python
pip freeze
python3 --version
which python3
pip3 freeze

を思い出してきたので試したところ、今回作った3系と独立に、昔作った2系の環境もまだ生きていることが分かり、matplotlibでプロットもできました。2系が消えてなかったのなら、今回こんなに苦労して3系を入れなくてもよかったんじゃない?という疑問は、とりあえず持たないでいようと思います。前回は、Scipy Superpackを使って入れたようなことを思い出しましたが、今回もそれを使えばよかったかもです。

Pythonのいくつかのバージョンを複数使い分ける場合は、pyenvを使うのが最近のトレンドのようです。さらに、pyenv, rbenv, plenvなど複数の言語の〜〜envを一括で扱うanyenvというのも作られているそうです。

また、使用目的にもよりますが、もっと一括で有用なパッケージを導入する方法として、Anacondaというのがよさそう。ということに後で気がつきました。

Anaconda
Completely free enterprise-ready Python distribution for large-scale data processing, predictive analytics, and scientific computing: 125+ of the most popular Python packages for science, math, engineering, data analysis. All Products are Free for Academic Use.
https://store.continuum.io/cshop/anaconda/

まだ試してませんが、このあたりのサイトが参考になりそうです。これからまたpyenvやAnacondaを入れるなら、今回構築した環境を消した方が無難なんでしょうか。それはちょっとつらいです。でも誰だっていつでもどこからでもまたゼロから何かを始められます。ツァラトゥストラが見た牧人がのど元に咬みついたヘビの頭を噛み切って次のステージへと階段を進んだように、ニシキヘビやアナコンダカナヘビとかとにかくなんでもいいけど、カナヘビはヘビじゃなくてトカゲだけど、ともかく語尾に-pyがつくようないろんな便利な道具を使いこなせるようになる日を目指して。

13番目の星座、あるいは空飛ぶcircus

日本語では空飛ぶモンティ・パイソンと訳されていますが、原語だと"Monty Python's Flying Circus"と言うそうです。この日本語では露に訳されなかったcircusというのは、もちろん、サーカスという意味もあるけれど、

circus:
愉快で騒がしいもの[出来事,人]; にぎやかなひと時; ばか騒ぎ.
『研究社 新英和中辞典』

というニュアンスもあるとか。それから、13番目の星座というのは、へびつかい座です。ここで言うへびつかいは、医者のことなんだって。あんまり関係なかったですね。これ以上引っ張っても仕方ないので、今回はpythonのお話です。

データから統計的手法(など)を使ってデータからoutcomeを予測する予測精度を競うKaggleというコンペティションがあるということで、どんなことをやっているのかちょっと覗きに行ってみました。データを見てみたかったというのと、どんな手法が上手く行っているのかを知りたかったからです。

毎日世界中いろんなところ(たぶん)からの参加者が自分の解析結果をアップして、スコアのランキングがLeaderboardに発表されます。たとえば、ゴルフの順位をギャラリーや視聴者に見せるテーブルのことも、leaderboardと呼ぶそうです。そのランキングの中にいくつかベンチマークと呼ばれる手法(アルゴリズム)が載っていて、主宰者側が入門用に公開している既存の手法なんかだとこれくらいの数値が出せるという目安になっています。また、Forumと呼ばれる掲示板で参加者や主宰者がいろんな議論や意見交換を行っており、こんなコードでこれくらいのスコアをたたき出せたよという情報開示(場合によっては自慢)を積極的に行っている参加者もいます。コンペのテーマごとに複数人でチームを組めるとか、データや解析結果についてconfidentialの義務があるとかいろいろなルールがあるようなので、参加される場合は競技規則を確認しましょう。

それで、岡 右里恵(2013)「R+pythonでKAGGLEの2値予測に挑戦!」というのを見てみたら、Rでgradient boosting machineをやるなら{gbm}パッケージが使えるということで、試してみました。パッケージ名はGeneralized Boosted Regression Modelsで、AdaBoostなど他のブースティングも選べるようです。動くのは動くけれど、欲張るとなにぶん計算時間がかかる上に、チューニングが結構大変です。扱い方がよくわからなくて最適化がうまくいかなかったせいもありますが、とりあえず、Random Forests {randomForest}に入れてみた場合と大して変わらない結果しか出ませんでした。そしてなにより、ベンチマークにすら遠く及ばないという有様。世界の壁は厚かった。

Rは大きなデータを扱うのが(今のところ、どちらかと言えば、まだ)不得意ということらしいので、そこで、pythonの出番ですよ。他の参加者の方がGitHubに公開されているpythonスクリプトを走らせたら、なんかめっちゃ速いんですけど、なんですかこれ。びっくりしたので、pythonをもっと使ってみたくなりました。

データ科学におけるMDS

大阪大学データ科学特論I 2013/08/29
今泉忠「モールスコードデータの分析 ー 中年男性の危機を乗る越えるためにー」
http://stat.tama.ac.jp/Lectures/npxlob/616aqv
データファイルなど
http://stat.tama.ac.jp/Lectures/npxlob/
クラスター分析の資料とともに、よくまとまった講義資料です。今回たくさんリンクを貼った中でどれかひとつだけしか開くくらいの時間しかない場合は、迷わずこの資料をご覧になることをお勧めします!

<参考図書>多次元尺度構成法関係

  • パソコン多次元尺度構成法、岡太 彬訓 、 今泉 忠 、共立出版
  • 関連性データの解析法―多次元尺度構成法とクラスター分析法 、齋藤 堯幸、宿久 洋 、共立出版
  • 3元データの分析―多次元尺度構成法とクラスター分析法 フィップス アラビ、J・ダグラス キャロル、ウェーン・S デサルボ、 岡太 彬訓

2番目の文献はMDSの結果を解釈する手助けとして、MDSとクラスター分析を併用する方法を推奨しています。

MDSへの入り口のおわりに

もともと、いろいろなRのパッケージの関数を使ってみようと思って計算していたら、stress1とstress2、Sammon stress、strainなどいろいろなstress("badness-of-fit"の指標)が出て来て、どう比較したり解釈したりすればいいのか迷ったので調べ始めました。力不足のため、数式などは適宜リンク先などをご参照ください。当初はRで計算してみる具体例やソースなども紹介する予定でした。それはまた次回のお楽しみということにします。

全力で迷子になれそうでしたか?

何か間違いの訂正や疑問、補足、コメントなどありましたら、遠慮せずにどうぞご教示よろしくお願いします。Twitterアカウントは @fronori です。最後に、{vegan}パッケージでNMDSを計算できるよと教えてくださったid:hoxo_mさんに心から感謝いたします。

おまけ。MatlabのStatistics ToolboxでMDS

古典的MDS:cmdscale()
http://www.mathworks.co.jp/jp/help/stats/examples/classical-multidimensional-scaling.html
非古典的MDS:mdscale()
http://www.mathworks.co.jp/jp/help/stats/examples/non-classical-multidimensional-scaling_ja_JP.html
多変量データ解析>MDS
http://www.mathworks.co.jp/jp/help/stats/multidimensional-scaling.html

RでMDSする方法のまとめ(予告編?)

パッケージ名を{}の中に記し、関数名にはその後に()をつけることにする。

  • MDS
    • {stats} cmdscale()
  • MDSの応用例
    • {randomForest} MDSplot():ランダムフォレストの結果求まった類似度(rf$proximity)を非類似度に変換(1 - rf$proximity)したものをMDS(cmdscale())でプロットする。RColorBrewerで色を付けてくれる。
  • NMDS
    1. {MASS} isoMDS(), sammon()
    2. {vegan} metaMDS()
    3. {labdsv} nmds() (isoMDS()のラッパー)
    4. {smacof} smacofSym():制約付きのMDSを実行できる。球面上の布置を求めるなどさまざまなモデルが選べる。
    5. {BiodiversityR} NMSrandom():ランダム初期値からNM(D)Sを計算。 isoMDS()、またはsammon()ストレスを最小化する。(追記:2014/5/20)
  • 文献[3]によればできる(ただし未調査)
    1. {ecodist}
    2. {ggobi}
    3. {SensoMineR} (個体差のモデル化ができる)

きっと探せば他にもいろいろな実装があると思われます。分野や用途によっていろいろな応用例があるでしょう。

MDSのいろいろな情報源と一言コメント

Edwards, J & Oman, P: "Dimensional Reduction for Data Mapping: A practical guide using R"
http://cran.r-project.org/doc/Rnews/Rnews_2003-3.pdf
下記の元ネタ論文でg54データの生成コードが付いている。prcomp(), cmdscale(), sammon(), isoMDS(), fastICA()の結果を比較。

mjin 「Rと多次元尺度法」
http://mjin.doshisha.ac.jp/R/27/27.html
言わずと知れた。

id:hoxo_m 「主座標分析について簡単に紹介するよ!」
http://d.hatena.ne.jp/hoxo_m/20120313/p1
距離行列からヨーロッパ都市の地図の再構成。

id:download_takeshi 「多次元尺度法で遊んでみる(オレ流 R入門)」
http://d.hatena.ne.jp/download_takeshi/20100410
MDSで山手線の地図の再構成とガンダムモビルスーツの分析。

千野直仁 「データ解析演習 C 1. 多次元尺度構成法」
http://www.aichi-gakuin.ac.jp/~chino/part-time/kan-gaku-mds.pdf
講義ノート(31ページ)数学的にかなり詳しい。

千野直仁 「多次元尺度構成法講義ノート補足資料」
http://www.aichi-gakuin.ac.jp/~chino/part-time/handai-suppliment.pdf
上の続き。ストレス1と2の区別と注釈。

「ストレス2 (Kruskal and Carroll, 1969) は、距離が均一化する方向の解に対してブレーキをかけるような分母を定義している」

千野直仁「非対称多次元尺度構成法」
http://www.aichi-gakuin.ac.jp/~chino/asym_contents.html
発展的な内容として。

岡田謙介「MULTISCALE による最尤多次元尺度構成法」
http://id.nii.ac.jp/1015/00004678/
心理統計からの最尤MDSの紹介。イントロが歴史的経緯が詳しい。

de Leeuw, J & Mair, P: "Multidimensional Scaling Using Majorization: SMACOF in R"
http://www.jstatsoft.org/v31/i03/paper
上記のスライド
http://carme2011.agrocampus-ouest.fr/slides/mair_tutorial.pdf
制約を入れたモデルなどかなりいろいろなMDSを行えるため自由度が高いパッケージのようです。たとえば、球面上の布置を求めることや個体差モデルなども実行できる。

田口 et al.(2001)「非計量多次元尺度構成法への期待と新しい視点」
http://www.ism.ac.jp/editsec/toukei/pdf/49-1-133.pdf
いろいろな分野の実データに適用例が紹介されている。「土壌微生物の炭素源利用能,脳のEEGデータ,植物の表現/塩基形質についてNMDSを使用した解析例」。個人的にはEEG時系列データへの応用例Zhang et al. (1995)が気になる。

上記は『統計数理』の特集「地図を描く・風景を眺める− 主成分分析・多次元尺度法とその周辺 −」
http://www.ism.ac.jp/editsec/toukei/abstract/49-1j.html
の一篇であったらしい。その巻頭言としての、
伊庭幸人「地図を描く・風景を眺める」
http://www.ism.ac.jp/editsec/toukei/tokeisuri-49j.html
がなかなかおもしろい視点を提供している。

id:graySpace 「【Rによるデータサイエンス】多次元尺度法(つづき)非軽量MDS」
http://d.hatena.ne.jp/graySpace/20140430/1398844109

Kohta Ishikawa 「Rでisomap(多様体学習のはなし)」
http://www.slideshare.net/kohta/risomap
計量MDSの拡張の1つであるIsomapを行う{vegan}のisomap()が出てくる。
en.wiki: Isomap
http://en.wikipedia.org/wiki/Isomap

Ito, K et al. (2011) PLoS One
http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0025953
SMACOF bonsai
インフルエンザウイルスの進化をMDSで'bonsai-like’ pathway図にした例。3次元のMDS布置を「盆栽風」の図と呼んでいるのが面白いです。