7

StompChickenの修正(私は1つのドット積を誤算しました、うーん!)で、答えはイエスのように見えます。それ以来、事前に計算されたカーネルを使用して同じ問題をテストし、同じ正しい結果が得られました。libsvm StompChickens clearを使用している場合、整理された計算は非常に優れたチェックです。

元の質問: libSVMで事前計算されたカーネルの使用を開始しようとしています。質問に対するVladの答えに気づい たので、libsvmが正しい答えを出したことを確認するのが賢明だと思いました。私は、事前に計算されていないカーネルから始めました。これは、3次元空間に2つのクラスと3つのデータポイントを持つ単純な線形カーネルです。データを使用しました

1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9

の呼び出しによって生成されたモデルファイルにsvm-train -s 0 - t 0は、

svm_type c_svc
kernel_type linear
nr_class 2
total_sv 3
rho -1.53951
label 1 2
nr_sv 2 1
SV
0.4126650675419768 1:3 2:1 3:0 
0.03174528241667363 1:7 3:9 
-0.4444103499586504 1:3 2:3 3:1 

しかし、私が手で解を計算するとき、それは私が得るものではありません。libsvmにエラーが発生するかどうかを知っている人はいますか、それともノートを比較してlibsvmと同じものが得られるかどうかを確認できますか?

libsvmによって返される係数a1、、はa2a3

a1 + a2 + a3 - 5*a1*a1 + 12*a1*a2 - 21*a1*a3 - 19*a2*a2/2 + 21*a2*a3 - 65*a3*a3 

a1 + a3 = a2 、、のそれぞれが0と1(Cのデフォルト値)の間にある必要がa1あるという制限付きでa2、可能な限り大きくし ます。a3

上記のモデルファイルは答えが

a1 = .412665...
a2 = .444410...
a3 = .031745...

しかしa2 = a1 + a3、上記の大きな式に代入し、両方の偏導関数がゼロであることを確認して、この解が正しいかどうかを確認する必要があります(、、のいずれもa10a2またはa31ではないため)が、ゼロではありません。

私は何か間違ったことをしていますか、それともlibsvmが悪い結果を出しているのですか?(私は何か間違ったことをしていることを望んでいます。)

4

1 に答える 1

9

LibSVMは非常に広く使用されているライブラリであり、コードに大幅な問題があるのではないかと私は強く疑っています。そうは言っても、実際にそれが正しいかどうかをチェックするのに十分な妄想を持っている人々がいるのは素晴らしいことだと思います-よくやった!

私が以下に与える作業によれば、解決策は正しいようです。つまり、KKT条件(15.29)を満たしているということです。二重の偏導関数が解で消えることも事実です。

これが私の仕事です...

x1 = (3,1,0)  x2 = (3,3,1)  x3 = (7,0,9)
y1 = -1       y2 = 1        y3 = -1

K = [10   12   21]
    [12   19   30]
    [21   30  130]

L_dual = a1 + a2 + a3 -5a1^2 + 12a1a2 - 21a1a3 - (19/2)a2^2 + 30a2a3 - 65a3^2)

a1 = 0.412  a2 = 0.4444  a3 = 0.0317

Checking KKT:
y1.f(x1) = y1 * (y1*a1*K(x1,x1) + y2*a2*K(x1,x2) + y3*a3*k(x1,x3) - rho)
         = rho + 10*a1 + 21*a3 - 12*a2
         ~= 1
(Similar for the x2 and x3)

Substituting a2 = a1 + a3 into L_dual:
L_dual = 2a1 + 2a3 - 2.5a1^2 + 2a1a3 - 44.5a3^2
dL/da1 = 2 - 5a1 + 2a3 = 0
dL/da3 = 2 + 2a1 - 89a3 = 0
于 2010-09-13T09:25:39.250 に答える