Installing libsvm-3.1 for Python on Mac OS X 10.6
libsvmをコンパイルして「その場で動かす」だけなら README に書いてある手順で進められますが、実用的には好きな場所で実行できるようにしたい。ということでその手順です。
【蛇足コラム】
svm-trainとかの場所をos.path.exists()で確認するようなスクリプトになっているので絶対パスで指定せざるを得ないのだけど、cdll.LoadLibrary()のように環境変数か何かで指定されたPATHを参照して対象ファイルが存在するかを判断するようなライブラリって無いんだろうか。
ConfigParserあたりで変更箇所を一括管理する形で書くのも良いかもしれないけど。
環境構築手順
- libsvm本家サイトからソースをダウンロード。
- コンパイル。
- 実行ファイルを ~/bin/libsvm/ に、ツールを ~/bin/libsvm/tools/ にコピー。(要PATH設定)
- スクリプトのパスを修正。
- バイナリの動作確認
- Python用 shared libraryのインストール
- Python用ライブラリ(スクリプト)の編集
- Python用ライブラリ(スクリプト)のインストール。
- Python用ライブラリの動作確認。
> tar xvfz libsvm-3.1.tar.gz
> cd libsvm-3.1
> make
> mkdir -p ~/bin/libsvm/tools
> cp svm-predict svm-scale svm-train ~/bin/libsvm/
> cp tools/*.py ~/bin/libsvm/tools/
> emacs ~/bin/libsvm/tools/easy.py
is_win32でWindowsか否かに分けてパスをしている箇所で、
svmscale_exe 等のパスを絶対パスで指定。下記は記入例。
=====begin(easy.py)=====
svmscale_exe = "/Users/tnal/bin/libsvm/svm-scale"
svmtrain_exe = "/Users/tnal/bin/libsvm/svm-train"
svmpredict_exe = "/Users/tnal/bin/libsvm/svm-predict"
grid_py = "/Users/tnal/bin/libsvm/tools/grid.py"
gnuplot_exe = "/usr/local/bin/gnuplot"
=====end=====
> svm-train
等と引数無しで実行した時にエラーが出なければ
(使い方が出力されるだけなら)OK。
> cd python
> make #../libsvm.so.2 が作成される
> sudo cp ../libsvm.so.2 /usr/local/lib/
# ライブラリをインストールする場所の確認。
> python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
# 以下は「/Library/Python/2.6/site-packages」と出力された場合の例。
> emacs svm.py
「if sys.platform == 'win32':」後でパスを指定している箇所にて、
以下のように変更。元のインデントを保つように注意。
=====begin(svm.py)=====
#libsvm = CDLL(os.path.join(os.path.dirname(__file__),\
# '../libsvm.so.2'))
cdll.LoadLibrary("libsvm.so.2")
libsvm = CDLL("libsvm.so.2")
=====end=====
> mkdir /Library/Python/2.6/site-packages/libsvm
> cp svm.py svmutil.py /Library/Python/2.6/site-packages/libsvm/
> touch /Library/Python/2.6/site-packages/libsvm/__init__.py
> python
>> from libsvm import svm
でエラーが出なければOK。