11

事前計算されたカーネルで libsvm を使用しています。サンプル データ セット heart_scale の事前計算済みカーネル ファイルを生成し、関数を実行しましたsvmtrain()。これは正しく機能し、サポート ベクターは正しく識別されました。つまり、標準のカーネルと同様です。

ただし、 を実行しようとするとsvmpredict()、事前計算されたモデル ファイルに対して異なる結果が得られました。svm_predict_values()コードを掘り下げた後、関数には、事前計算モードでは使用できないサポート ベクターの実際の機能が必要であることに気付きました。事前計算モードでは、各サポート ベクターの係数とインデックスのみがあり、 によってその特徴と間違えられますsvmpredict()

これは問題ですか、それとも何か不足していますか。

svmpredict()(事前計算モードで実行する方法を教えてください。)

4

1 に答える 1

5

テスト セット ベクトル x と各トレーニング セット ベクトルの間のカーネル評価の値は、テスト セットの特徴ベクトルとして使用する必要があります。

libsvm readme からの関連行は次のとおりです。

xi の新しいトレーニング インスタンス:
<label> 0:i 1:K(xi,x1) ... L:K(xi,xL)

任意の x:
<label> 0:?の新しいテスト インスタンス 1:K(x,x1) ... L:K(x,xL)

libsvm の readme には、L 個のトレーニング セット ベクトルがある場合 (xi は [1..L] の i を含むトレーニング セット ベクトル) とテスト セット ベクトル x がある場合、x の特徴ベクトルは次のようになるはずです。

<xのラベル> 0:<任意の数値> 1:K(x^{test},x1^{train}), 2:K(x^{test},x2^{train}) ... L:K (x^{test},xL^{train})

ここで、K(u,v) は、ベクトル u および v を引数としてカーネル関数 on の出力を表すために使用されます。

以下に Python コードの例をいくつか示します。

元の特徴ベクトル表現と事前計算された (線形) カーネルの結果はまったく同じではありませんが、これはおそらく最適化アルゴリズムの違いによるものです。

from svmutil import *
import numpy as np

#original example
y, x = svm_read_problem('.../heart_scale')
m = svm_train(y[:200], x[:200], '-c 4')
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

##############
#train the SVM using a precomputed linear kernel

#create dense data
max_key=np.max([np.max(v.keys()) for v in x])
arr=np.zeros( (len(x),max_key) )

for row,vec in enumerate(x):
    for k,v in vec.iteritems():
        arr[row][k-1]=v
x=arr

#create a linear kernel matrix with the training data
K_train=np.zeros( (200,201) )
K_train[:,1:]=np.dot(x[:200],x[:200].T)
K_train[:,:1]=np.arange(200)[:,np.newaxis]+1

m = svm_train(y[:200], [list(row) for row in K_train], '-c 4 -t 4')

#create a linear kernel matrix for the test data
K_test=np.zeros( (len(x)-200,201) )
K_test[:,1:]=np.dot(x[200:],x[:200].T)
K_test[:,:1]=np.arange(len(x)-200)[:,np.newaxis]+1

p_label, p_acc, p_val = svm_predict(y[200:],[list(row) for row in K_test], m)
于 2012-06-23T21:36:29.297 に答える