SVM支持向量机(SMO算法)的R实现

来源:互联网 发布:编程入门教材 编辑:程序博客网 时间:2024/05/21 06:36

    最近一段时间想好好把支持向量机学习下,从网上看到有很多讲的很好的博客。对于SVM里面的许多原理都讲的很透彻,确实很是佩服这些大牛,膜拜。

   但是苦恼的一点在于,在网上找不到关于SVM的R语言版本的编程实现,虽说有包的实现,但个人还是喜欢自己通过编程来深入了解SVM,所以这也是我写这篇博客的目的。网上倒有一个Python,但个人对Python是一无所知。这里还是把链接打出来,想要看的朋友自己去看看,写的很详细,很好。http://blog.csdn.net/zouxy09/article/details/17292011;不过听说统计之都的那些大牛们正在编写关于十大算法的R语言实现,真的是非常的期待。也非常感谢统计之都,他们对于R语言的推广做出了很多贡献。

   好了,话不多说,进入正题。我这篇文章主要是基于platte.A Fast Algorithm for Training Support Vector Machines这篇文献写的。主要也就是SVM算法中最关键的SMO算法的R实现。在进入算法之前也还是先热热身,慢慢引入SMO算法步骤粗去,也让这文章不会显得那么突兀。但我也不会去介绍的很详细,想要先要理解原理的你们,推荐先去看看July的博客,写的很棒。http://blog.csdn.net/v_july_v/article/details/7624837;OK,那我们就开始咯。下面的文章主要分为两个部分:  

                             1.大致按逻辑引出支持向量机的公式表达

                             2.详细介绍SMO算法的介绍,主要参考Platte的那篇文献

                             3.关于SMO算法的R实现代码,并上一个实例验证

第一节 :支持向量机介绍

  支持向量机是由Vapnik《Estimation of Dependences Based on Empirical Data》在1979发明的。简单来讲SVM就是一个超平面分类器,通过最大间隔将正负样本点分离.如下图所示。在线性的情况下,间隔就是离超平面最近的正负样本点到超平面的距离。

标准的线性SVM的表示为:                      

                                                                                              

其中W是超平面的参数向量,x是输入值向量,也就是我们以后要输入的值所组成的向量 。分类的超平面也就是u=0的平面。当u=1时,就为正样本点。当u=-1时为负样本点。

间隔m等于:

                                                                                       

所以依据SVM的最大间隔分离的原理(出处看上面我给的博客地址),我们可以将它转化为优化问题: 

                                                                                

其中x表示输入的训练样本,y代表与x对应的样本点的确定的类别:-1和1。1代表正样本的,相反-1代表负样本点。

通过Lagrand进行对偶变换,我们可以将上述的优化问题转变为只含有Lagrand算子“锕法”这一个未知量的优化问题:

                                                                                   

约束条件为:

                                                                                   

                                                                                    

对于每个样本点对应一个Lagrand算子“锕法”。一旦算法确定之后,参数向量w与临界值b也就确定了,它们之间的关系为:

                                                                                        

上述情况是对于测试集数据是线性可分的情况。但在现实情况中,有很多的数据是不满足这一情况的,也就是不存在这样一个线性的超平面可以正确的将正负样本分离开来。

所以这就回出现分类错误的问题,将负样本划分进入了正样本下。针对这种情况Vapnik建议将原始的约束加入一个松弛变量,允许错误分类的样本点加入,但是得对松弛变量加上一个惩罚变量C:对于偏差越大的样本点给予更大的C值,以作惩罚:

                                                                                   

ξi表示为松弛变量;C的值随ξi值的增大而增大。同样将这个新的约束问题转化为对偶问题,相比上面的问题,只是多了一个约束条件:

                                                                                        

    SVM也可以延伸到线性不可分的情况。


(时间太晚,明天继续更新)

                                                                             

                                            









































0 0