LIBSVMのMATLAB用ソースをoctaveで使う
Learning the Discriminative Power-Invariance Trade-Off
(http://research.microsoft.com/en-us/um/people/manik/projects/trade-off/trade-off.html)
のMATLAB用のコードがとりあえずcygwin上でoctaveで動いた。
手順を忘れないようにメモ。
<準備>
1.コードの取得
http://research.microsoft.com/en-us/um/people/manik/code/GMKL/libsvm-2.84.tgz
からダウンロード。
2.octave(version 3.2.4)のインストール
cygwinのstart.exeから
Math/octave, Math/octave-devel, Math/octave-doc, Math/octave-forge
をインストール。
3.fftw3のインストール
コードのコンパイルの際に必要になった。
cygwinのstart.exeからMath/libfftw3-develをインストール。
<コンパイル>
MEXファイルを作り, octaveからコードの関数を呼び出せるようにする。
MatlabとOctaveのファイルの位置関係が分からなかったのでMakefileの内容
を頼りに行った。
webで以下のような記述も見つけたが対応したLIBSVMのMakefileにoctaveのターゲットは見つからなかった。
http://www.google.co.jp/url?q=http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html%23f805&usg=AFQjCNGhpHLyyhhH6Sr0GGgT8wAE9g6gtg&sa=X&ei=Io4QTNHIFc_IcaG9lfwH&ved=0CBwQygQ
1.cygwinでA−1のCode/libsvm-2.84-1のディレクトリに移動
2.ソースの変更
以下をコメントアウトした。
read_sparse.c://typedef int mwIndex;
svm_model_matlab.c://typedef int mwIndex;
svmpredict.c://typedef int mwIndex;
svmtrain.c://typedef int mwIndex;
3.svm_model_matlab.oの作成
$gcc -I/usr/include/octave-3.2.4/octave -c svm_model_matlab.c
4.octaveの起動
$ octave --braindead
5.svmpredict.mex, svmtrain.mex, read_sparse.mexの作成
>> mex --mex svmpredict.c svm.o svm_model_matlab.o
>> mex --mex svmtrain.c svm.o svm_model_matlab.o
>> mex --mex read_sparse.c
<動作確認>
1.コードに付属しているREADMEのExamplesの一部を実行
>> load heart_scale.mat
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 2');
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 99.2593% (268/270) (classification)