初试LIBSVM

在做Kinect手势识别项目的时候用到了SVM这个东西。原理上不甚了解,但是用起来感觉还是很神奇的。

度娘百科:支持向量机SVM(Support Vector Machine)作为一种可训练的机器学习方法。

具体实施时,归纳一下大概是下面这几个步骤:

1. 获得样本数据,按SVM训练函数的传入参数格式要求,进行整理;
2. 利用训练函数train,根据样本进行训练,获得预测模型model;
3. 利用预测函数predict和模型model,对测试数据进行预测,取得结果;

当然了SVM的整个一套系统我们不用自己写,可以直接拿开源的来用。台湾大学的林智仁教授弄的这个LIBSVM效果是相当好的!他提供了MatLab和Java两种形式的封装。但是我们的项目是用C#写的,所以为了方便就用了一个C#封装版的。版本不是很新但是够用就行。作者是袋鼠国Andrew Poh,在林智仁教授的LIBSVM上也提供了其他各种语言封装的LIBSVM。

不过这个C#封装版的LIBSVM的源码,看起来有些不够“面向对象”(当然深受“u can u up no can no bb”思想毒害的我是不会继续吐槽的。能封装而且用起来稳定,这就很好了)。

扯了这么多我想说LIBSVM在调用的时候最值得注意的部分就是样本数据的格式(同理测试数据的的格式也同样重要),这个让我一开始蛋疼了很久而且一度找不到办法。后来发现LIBSVM的官网上居然就有范例……虽然不针对C#封装版,但只要源码一样,调用参数的格式就应该差别不大对吧(想当然,但值得一试)。

样本数据这样写:

<类别1> <空格> <1:><数据> <空格> <2:><数据> <空格> <3:><数据> ……
<类别1> <空格> <1:><数据> <空格> <2:><数据> <空格> <3:><数据> ……
<类别2> <空格> <1:><数据> <空格> <2:><数据> <空格> <3:><数据> ……
……

类别只能是整数。建议取0、1、2、3……因为建立string数组存放类别名的时候,从0开始的整数刚好可以作为数组索引。

数据必须用科学计数法表示。保留小数点后6位,比如0.1要写成:

0.010000e+01   或   0.010000e+001

e+后面不能是00

测试数据用同样的格式写。最终由predict函数返回的结果是这样的:

<STX(ASCII里面的一个值)><测试数据1结果的类别>
<STX(ASCII里面的一个值)><测试数据2结果的类别>
<STX(ASCII里面的一个值)><测试数据3结果的类别>
……

就是这样。注意以上都用由Andrew Poh编写C#封装版的LIVSVM得到的测试结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-02-05 18:43  tyusr  阅读(436)  评论(0编辑  收藏  举报