2010-09-10 91 views
7

隨着StompChicken的更正(我錯誤地計算了一個點積,呃!)答案似乎是肯定的。我自從使用預先計算的內核測試了相同的問題並得到了相同的正確結果。如果你清楚地使用libsvm StompChickens,有組織的計算是一個很好的檢查。libsvm是否準確?

原問題: 我即將開始在libSVM中使用預先計算的內核。我注意到 Vlad's answer有問題,我認爲確認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呢?

係數a1a2a3通過LIBSVM返回是應該是使

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 並且每個a1a2a3需要介於0和1之間(C的默認值)。

上述模型文件說,答案是

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

但一個只是有上述替代a2 = a1 + a3進入大公式,並確認這兩個偏導數爲零,看看這個解決方案是正確的(沒有的a1自,a2,a3是0或1),但它們不是零。

我做錯了什麼,或者是libsvm給結果不好? (我希望我做錯了什麼。)

回答

9

LibSVM是一個使用非常廣泛的庫,我非常懷疑代碼中的任何錯誤。也就是說,我認爲有些人偏執到能夠檢查正確性是很了不起的 - 做得很好!

根據我在下面給出的工作,該解決方案似乎是正確的。我的意思是它滿足KKT conditions(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