libsvm的准确性如何?

在StompChicken的修正下(我之前计算了一个点积时出错了,唉!),答案似乎是肯定的。我随后使用预计算的内核测试了相同的问题,得到了相同的结果。如果你正在使用libsvm,StompChicken清晰、有条理的计算是一个非常好的检查方法。

原始问题:我即将开始在libSVM中使用预计算的内核。我注意到Vlad的回答,我认为确认libsvm给出的答案是正确的会比较明智。我从非预计算的内核开始,只是一个简单的线性内核,包含2个类别和3个数据点在三维空间中。我使用的数据是

1 1:3 2:1 3:02 1:3 2:3 3:11 1:7 3:9

通过调用svm-train -s 0 - t 0生成的模型文件包含

svm_type c_svckernel_type linearnr_class 2total_sv 3rho -1.53951label 1 2nr_sv 2 1SV0.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代入上面的公式,并确认两个偏导数都为零,就可以验证这个解是否正确(因为a1a2a3都不是0或1),但它们并不是零。

是我做错了什么,还是libsvm给出了错误的结果?(我希望是我做错了什么。)


回答:

LibSVM是一个非常广泛使用的库,我非常怀疑代码中有什么严重的问题。话虽如此,我认为那些足够谨慎去实际检查其正确性的人做得很好 – 干得好!

根据我下面的工作,解决方案似乎是正确的。我的意思是它满足了KKT条件(15.29)。在解处,双变量的偏导数也确实消失了。

这是我的工作…

x1 = (3,1,0)  x2 = (3,3,1)  x3 = (7,0,9)y1 = -1       y2 = 1        y3 = -1K = [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.0317Checking 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^2dL/da1 = 2 - 5a1 + 2a3 = 0dL/da3 = 2 + 2a1 - 89a3 = 0

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注