2011年4月2日土曜日

PythonでLIBSVMを使う

導入方法
1.ここからLIBSVMのzipファイルもしくはtar.gzファイルをダウンロードし適当なディレクトリに解凍。(最新版3.1)
2.解凍したフォルダに移動し、makeコマンド実行。以下のファイルができるはず。
 svm.o
 svm-train.exe
 svm-predict.exe
 svm-scale.exe
3.解凍したフォルダの中のpythonフォルダに移動し、makeコマンド実行。以下のファイルができるはず。
 libsvm.so.2

使用例
適当に学習させてみる.
svmtest.py
from svm import *
from svmutil import *

prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]]) #訓練データ
param = svm_parameter('-t 1 -c 3') #SVMのパラメータ設定
m = svm_train(prob, param) #学習
#新しいクラスに対する予測
p_labels, p_acc, p_vals = svm_predict([1,-1], [[2,1,2],[-3,-2,-10]], m)
print p_labels #予測結果
実行.
>>> python svmtest.py
*
optimization finished, #iter = 1
nu = 0.166667
obj = -0.500000, rho = 0.000000
nSV = 2, nBSV = 0
Total nSV = 2
Accuracy = 100% (2/2) (classification)
[1.0, -1.0]

パラメタの設定
オプション説明デフォルト値
-s SVMの種類.以下を設定.
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
0
-t カーネルの種類.以下を設定.
0 -- 線形カーネル(ただの内積): K(u,v) = uTv
1 -- 多項式カーネル: K(u,v) = (&gamma uTv + r)d
2 -- 動径基底関数カーネル: K(u,v) = exp(-&gamma |u-v|2)
3 -- シグモイドカーネル: K(u,v) = tanh(&gamma uTv + r)
4 -- training_set_fileに記述したカーネル
2
-d 多項式カーネルのパラメタd. 3
-g 多項式,動径基底関数,シグモイドカーネルのパラメタ&gamma. 1/n
n:特徴ベクトルの次元
-r 多項式,シグモイドカーネルのパラメタr. 0
-c C-SVC,epsilon-SVR,nu-SVRで使用するパラメタC. 1
-n nu-SVC,one-class SVM,nu-SVRで使用するパラメタnu. 0.5
-p epsilon-SVRのパラメタ&epsilon. 0.1
-m 使用キャッシュサイズ.単位はMB. 100
-e 終了基準. 0.001
-h shrinking heuristicsを使う場合は1,使わない場合は0. 1
-b 確率推定付きのSVC/SVRモデルを作成する場合は1,しない場合は0. 0
-wi C-SVCにおけるクラスiのパラメタCの重み.(weight*C) 1
-v n-分割交差検定(n-fold cross validation)モード. -
-q quiet mode (no outputs) -