libsvm准确吗?

时间:2010-09-10 20:22:41

标签: opencv machine-learning computer-vision libsvm

随着StompChicken的更正(我错误地计算了一个点数产品,呃!)答案似乎是肯定的。我已经使用具有相同正确结果的预先计算的内核测试了相同的问题。如果你使用libsvm StompChickens清楚,有组织的计算是一个非常好的检查。

原始问题: 我即将开始在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相同?

libsvm返回的系数a1a2a3应该是值

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替换为上面的大公式并确认两个偏导数都为零,以确定此解是否正确(因为a1a2,{ {1}}为0或1)但它们不为零。

我做错了什么,或者libsvm给出了不好的结果? (我希望我做错了。)

1 个答案:

答案 0 :(得分: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