12
26
2012
3

从libsvm开始谈起

第一次接触libsvm,是在今年春节的时候,参加数模美赛,当时在并不太熟悉libsvm的情况下,一边参考着网上的libsvm教程,一边依照着自己的理解,利用libsvm进行了三维特征向量空间的分类,并按照自己的思考加简单测试写的决策函数,类似于http://www.matlabsky.com/thread-12649-1-1.html#346396-tsina-1-5117-284f7ead64dc6d44826e34b59e8e7b01 ,现在回想起来,当时还是用线性核的决策函数去处理RBF生成的model,或许是维度太低,(我们对数据预处理时将其降低了15维),美赛的时候分类结果很不错,由此也导致我一直以为此种做法的正确性。

 

受此影响,一个多月前,做眼睛检测的时候,同样采取了类似于上述的方法,结果出来的结果是非常不好,导师也很纳闷,为何出来的准确率曲线这么差,当时导师指出说最大可能的原因是程序问题,SVM结果不可能这么差。我也同样怀疑程序,反反复复调试运行了好几遍,都“没发现问题”,因为我的对照标准是我当时美赛时的做法。

直到这两周,对一篇ICCV的论文的实验验证,才发现了自己的问题,首先是在阅读他人源代码时,发现自己犯了一个特别大的错误,那就是用线性核的决策函数去处理RBF核生成的model。这么大的教训告诉我,一定要时刻抓紧其原理! 比如SVM的本质问题,还有相关数学式子一定要自己推导一遍,写程序一定不要脱离原理。改正了这一点,但是,准确率仍然跟论文上差距很远,上午的时候我反复运行,找到了问题的源头——那就是决策函数的问题,我发现,参照上面给出的决策函数方法,得到的结果与svmpredict相比,要不就完全相等,要不就完全相反,没有第三种情况,而且无论是线性核还是RBF核结果都一样。中午的时候,导师过来了,我跟他讲了我的情况,导师肯定了我原理上是没问题,然后就一起讨论了可能出现这种情况的原因,导师让我写个VC下的测试程序,看下其实现方式是否一致,整个下午,不断的单步运行、随机数测试,看到其实现实质上跟我的程序是一致的,而且大量随机数测试结果表明,仍然是要不完全相等,要不完全相反两种情况。最后,导师再次决定单步看其svmtrain实现原理,一路都发现一致,但是,在最后的时候,一个点吸引了我们:

 

源程序做预测时,返回的label是其概率最大的的label,导师指出,model.Labels的顺序不一定是+1,-1,如果相反,则会得出相反结果。测试发现,原因真在此地。


在二分类问题中,如果model.Label(1)=1,model.Label(2)=-1,那就OK,没问题,如果model.Label(1)=-1,model.Label(2)=1,那么,当W*X+b>0时,返回的是model.Label(1)的值-1,反之返回的是1,因此此时该值越大,是+1类的可能性越小。

如此做,果然性能大幅提升,与论文中的结果非常接近了(两个百分点以内)。同时值得注意的是,实际上,Libsvm已经给出了概率估计,只要在模型生成和测试样本预测时加上-b 1参数即可。 同样一个东西,自己用matlab写决策函数,和调用libsvm的C程序编译生成的mexw,两者结果几乎一致,但是前者花的时间是半个小时,而后者是几秒钟!不过前者可以让你更好地学习掌握SVM原理。

启发与自我反省:

1.时刻怀疑自己的程序。

不要想当然的觉得没问题就翘起二郎腿等结果了。在没出来正确结果之前,一定要反复看自己的程序,无论是在大脑里跑程序,还是用编译器,都要认真地去对待。

2.不要得过且过,一定要深究错误根源。

比如上面说那问题,我之前用人为的方法对其进行判断,如果结果完全相反,则对其进行相应处理,这种方法无异于饮鸩止渴,虽然可以一时解决问题,但是,一方面,程序的效率是大幅度降低,另一方面,这样做也是毫无意义的,并没有真正解决问题。如同用纸包住火一般。

3.不要过分相信"教程"

"教程"是否有自己真正试验过暂且不说,即使试验过,那对于他的实验正确,你的实验却是不一定的。因此所谓的"教程"一定要自己实际的去实验一下,弄懂其本质,而不要只似囫囵吞枣般得其结论。

Category: C/C++ | Tags: libsvm | Read Count: 4911
menglei 说:
Jun 15, 2013 04:01:28 PM

你好,请问“如果model.Label(1)=1,model.Label(2)=-1,”中的1和-1是什么值,是怎么计算出来的?谢谢

Avatar_small
buptlijun 说:
Jul 11, 2013 09:48:19 PM

层标签,一般是二分类的话,Label就分别是1和-1

seo service london 说:
Jan 15, 2024 07:50:49 PM

So it is interesting and very good written and see what they think about other peopl


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com