techqs blog

关键字(keywords):SVM支持向量机 SMO算法 实现机器学习

下面是SVM的简化版SMO算法,我将结合Java代码来解释一下整个SVM的学习训练过程,即所谓的train训练过程。那么什么是SMO算法呢?

SMO算法的目的无非是找出一个函数f(x),这个函数能让我们把输入的数据x进行分类。既然是分类肯定需要一个评判的标准,比如分出来有两种情况A和B,那么怎么样才能说x是属于A类的,或不是B类的呢?就是需要有个边界,就好像两个国家一样有边界,如果边界越明显,则就越容易区分,因此,我们的目标是最大化边界的宽度,使得非常容易的区分是A类还是B类。

在SVM中,要最大化边界则需要最小化这个数值:

w:是参量,值越大边界越明显 C代表惩罚系数,即如果某个x是属于某一类,但是它偏离了该类,跑到边界上后者其他类的地方去了,C越大表明越不想放弃这个点,边界就会缩小代表:松散变量但问题似乎还不好解,又因为SVM是一个凸二次规划问题,凸二次规划问题有最优解,于是问题转换成下列形式(KKT条件):

…………(1)

这里的ai是拉格朗日乘子(问题通过拉格朗日乘法数来求解)对于(a)的情况,表明ai是正常分类,在边界内部(我们知道正确分类的点yi*f(xi)>=0)对于(b)的情况,表明了ai是支持向量,在边界上对于(c)的情况,表明了ai是在两条边界之间而最优解需要满足KKT条件,即满足(a)(b)(c)条件都满足以下几种情况出现将会出现不满足:

yiui<=1但是ai<C则是不满足的,而原本ai=Cyiui>=1但是ai>0则是不满足的而原本ai=0yiui=1但是ai=0或者ai=C则表明不满足的,而原本应该是0<ai<C所以要找出不满足KKT的这些ai,并更新这些ai,但这些ai又受到另外一个约束,即

因此,我们通过另一个方法,即同时更新ai和aj,满足以下等式

就能保证和为0的约束。

利用yiai+yjaj=常数,消去ai,可得到一个关于单变量aj的一个凸二次规划问题,不考虑其约束0<=aj<=C,可以得其解为:

………………………………………(2)

这里………………(3)

表示旧值,然后考虑约束0<=aj<=C可得到a的解析解为:

…………(4)

对于

那么如何求得ai和aj呢?

对于ai,即第一个乘子,,可以通过刚刚说的那几种不满足KKT的条件来找,第二个乘子aj可以找满足条件

…………………………………………………………………………(5)

b的更新:

在满足条件:下更新b。……………(6)

最后更新所有ai,y和b,这样模型就出来了,然后通过函数:

……………………………………………………(7)

输入是x,是一个数组,组中每一个值表示一个特征。

输出是A类还是B类。(正类还是负类)

以下是主要的代码段:

运行后的结果还算可以吧,测试数据主要是用了libsvm的heart_scale的数据。

预测的正确率达到73%以上。

如果我把核函数从线性的改为基于RBF将会更好点。

最后,说到SVM算法实现包,应该有很多,包括svm light,libsvm,有matlab本身自带的svm工具包等。

另外,完整的代码,我将上传到CSDN下载地址上提供下载。

点击这里下载。

如理解有误敬请指正!谢谢!

我的邮箱:chen-hongqin@163.com

我的其他博客:

百度:

javaeye:

CSDN:

把自己当傻瓜,不懂就问,你会学的更多

techqs blog

相关文章:

你感兴趣的文章:

标签云: