2009-11-23 16 views

答えて

8

LibSVMには、SWIG経由で動作するpythonラッパーが含まれています。その分布から

例svm-test.py:

#!/usr/bin/env python 

from svm import * 

# a three-class problem 
labels = [0, 1, 1, 2] 
samples = [[0, 0], [0, 1], [1, 0], [1, 1]] 
problem = svm_problem(labels, samples); 
size = len(samples) 

kernels = [LINEAR, POLY, RBF] 
kname = ['linear','polynomial','rbf'] 

param = svm_parameter(C = 10,nr_weight = 2,weight_label = [1,0],weight = [10,1]) 
for k in kernels: 
    param.kernel_type = k; 
    model = svm_model(problem,param) 
    errors = 0 
    for i in range(size): 
     prediction = model.predict(samples[i]) 
     probability = model.predict_probability 
     if (labels[i] != prediction): 
      errors = errors + 1 
    print "##########################################" 
    print " kernel %s: error rate = %d/%d" % (kname[param.kernel_type], errors, size) 
    print "##########################################" 

param = svm_parameter(kernel_type = RBF, C=10) 
model = svm_model(problem, param) 
print "##########################################" 
print " Decision values of predicting %s" % (samples[0]) 
print "##########################################" 

print "Numer of Classes:", model.get_nr_class() 
d = model.predict_values(samples[0]) 
for i in model.get_labels(): 
    for j in model.get_labels(): 
     if j>i: 
      print "{%d, %d} = %9.5f" % (i, j, d[i,j]) 

param = svm_parameter(kernel_type = RBF, C=10, probability = 1) 
model = svm_model(problem, param) 
pred_label, pred_probability = model.predict_probability(samples[1]) 
print "##########################################" 
print " Probability estimate of predicting %s" % (samples[1]) 
print "##########################################" 
print "predicted class: %d" % (pred_label) 
for i in model.get_labels(): 
    print "prob(label=%d) = %f" % (i, pred_probability[i]) 

print "##########################################" 
print " Precomputed kernels" 
print "##########################################" 
samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]] 
problem = svm_problem(labels, samples); 
param = svm_parameter(kernel_type=PRECOMPUTED,C = 10,nr_weight = 2,weight_label = [1,0],weight = [10,1]) 
model = svm_model(problem, param) 
pred_label = model.predict(samples[0]) 
+0

LibSVMのウェブサイトやドキュメントに明示的に言及していないので、Chih-Jen Linに電子メールを送り、増分/オンライン学習のサポートについて質問しました。彼の反応は、「残念ながらそうではありません。なぜなら、増分/減分学習の標準設定はまだありません」。 – Cerin

+0

コード例がオンライン学習ではない例を示します。 – mrgloom

4

は1のことを聞いていないことがあります。しかし、本当にオンライン学習が必要ですか?私はかなり長い間SVMを使用しており、オンライン学習を使用しなければならない問題に遭遇したことはありません。通常、私は訓練の例の変更の数(おそらく100または1000)に閾値を設定し、すべてをバッチ・リトレインします。

問題がオンライン学習を絶対に必要とする規模にある場合は、vowpal wabbitをご覧ください。

Olivier GriselLaSVM周りのctypesラッパーを使用することが提案:コメントの後

は、以下の再編集します。私は以前LaSVMについて知らなかったので、それはかなりクールに見える、私は自分の問題でそれを試して興味を持っている:)。

Python-VM(組み込みデバイス、ロボット)のみを使用することに限定されている場合は、SVMの近くで実行する投票/平均パーセプトロンを使用することをお勧めしますが、デフォルトでは

ElefantにはオンラインSVMコードがいくつかあります。

+0

強化学習のために必要です。 –

+0

LinuxでVWを構築できた人は誰ですか?私はブーストがインストールされているが、VWはもっと古いバージョンを想定しているようだ。 – Cerin

+0

ここではLaSVMが勝者のようです。それは小さなコードベースを持っています。明示的にオンライン学習をサポートしています。簡単にコンパイルできます(Ubuntu 9.10でテスト済み)。直接のPython APIはありませんが、Pythonから簡単に呼び出してモデル(la_svm)を作成し、モデル(la_test)を使用する簡単なコマンドラインユーティリティを2つ作成します。 – Cerin

0

なぜオンラインでトレーニングするのですか?トレーニングインスタンスを追加すると、通常、SVMに関連する二次計画問題を再解決する必要があります。

これを処理する方法は、SVMをバッチモードで訓練することです。新しいデータが利用できる場合は、これらのデータポイントが超平面の[-1、+1]マージンにあるかどうかを確認します。そうであれば、すべての古いサポートベクトルとマージンに収まる新しいトレーニングデータを使用してSVMを再学習します。

もちろん、後でサポートベクターとなる点がいくつか破棄される可能性があるため、結果はすべてのデータのバッチトレーニングと比べて若干異なる場合があります。だから、なぜあなたはSVMのオンライントレーニングをしたいのですか?

+1

私はすでにあなたの最初の質問に疑問を呈しました。私はそれを強化学習のプロジェクトに使用しているので、オンラインで学ぶ必要があります。 –

+0

は、バッチモードが純粋に実装されていれば、ランダムよりも悪い可能性があることに注意してください。 – Davide

+0

この方法論はスケールされません。新しいレコードごとにデータセット全体を再訓練すると、最高で指数関数的なパフォーマンスが得られます。オンライン学習は、実装に応じて、一定または線形のパフォーマンスを持つことになります。 – Cerin

1

そこにはPythonバインディングはありませんが、 http://leon.bottou.org/projects/sgdに記載されているアルゴリズムはオンラインで訓練されており、簡単に再実装できます。数が少ない。

+1

確率勾配降下(SGD)は、scikit-learn(http://scikit-learn.sourceforge.net/)でも実装されています。 SGDベースの分類器のオンラインフィッティングはまだ公開されていませんが、今後6カ月以内に予定されています。 –

1

Pegasosは、非常にうまく動作するオンラインSVMアルゴリズムです。特定のPythonバインディングがなくても実装するのはかなり簡単です。著者のウェブサイトにはC implementationがあり、それは適応性も埋め込み性もあります。

関連する問題