libsvm 准确吗?
Posted
技术标签:
【中文标题】libsvm 准确吗?【英文标题】:Is libsvm accurate? 【发布时间】:2011-04-10 22:13:10 【问题描述】:通过 StompChicken 的更正(我错误地计算了一个点积,呃!)答案似乎是肯定的。此后,我使用具有相同正确结果的预计算内核测试了相同的问题。如果你清楚地使用 libsvm StompChickens,有组织的计算是一个非常好的检查。
原问题: 我即将开始在 libSVM 中使用预计算内核。我注意到了 Vlad's answer 回答一个问题,我认为确认 libsvm 给出了正确的答案是明智的。我从非预计算内核开始,只是一个简单的线性内核,在 3 维空间中有 2 个类和三个数据点。我用了数据
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
、a2
、a3
应该是make的值
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
a1
、a2
、a3
中的每一个都必须介于 0 和 1 之间(C 的默认值)。
上面的模型文件说答案是
a1 = .412665...
a2 = .444410...
a3 = .031745...
但只需将a2 = a1 + a3
代入上面的大公式并确认两个偏导数都为零以查看此解决方案是否正确(因为a1
、a2
、a3
都不是 0 或 1 ) 但它们不为零。
是我做错了什么,还是 libsvm 给出了不好的结果? (我希望我做错了什么。)
【问题讨论】:
【参考方案1】: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
【讨论】:
以上是关于libsvm 准确吗?的主要内容,如果未能解决你的问题,请参考以下文章