2010-09-10 40 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