支持向量机SVM
支持向量机学习
支持向量机(Support Vector Machine,SVM):是统计学习理论的重要组成部分,也是最实用部分。支持向量机是一种基于结构风险最小化原理的机器学习算法,它具有很好的泛化能力,能够有效地解决小样本、非线性、高维数、局部极小等问题。
阅读参考:
- SVM入门精品系列讲解目录:http://www.matlabsky.com/thread-10309-1-1.html
- 支持向量机:http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html
- 核函数:http://www.doc88.com/p-218659120134.html
- 如何解决分类中的样本倾斜问题:http://blog.csdn.net/zhzhl202/article/details/7583464
- 使用MapReduce对svm模型进行训练:http://blog.csdn.net/zhzhl202/article/details/7438908
说明:
- 支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力)。
- 所谓VC维是对函数类的一种度量,可以简单的理解为问题的复杂程度,VC维越高,一个问题就越复杂。
- 这个与问题真实解之间的误差,就叫做风险(更严格的说,误差的累积叫做风险)。
- 统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小,即结构风险最小。SVM正是这样一种努力最小化结构风险的算法。
- 什么叫线性函数呢?在一维空间里就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,可以如此想象下去,如果不关注空间的维数,这种线性函数还有一个统一的名称——超平面(Hyper Plane)!
- 寻优问题,也叫规划问题——Programming。当目标函数是二次函数,所有的约束条件都是线性函数时,这种规划问题有个很有名气的称呼——二次规划(Quadratic Programming,QP),而且可以更进一步的说,由于它的可行域是一个凸集,因此它是一个凸二次规划。
- 在问题求解之前,我们必须先问自己:这个问题是不是有解?如果有解,是否能找到?对于一般意义上的规划问题,两个问题的答案都是不一定。但是凸二次规划让人喜欢的地方就在于,它有解(教科书里面为了严谨,常常加限定成分,说它有全局最优解,由于我们想找的本来就是全局最优的解,所以不加也罢),而且可以找到!(当然,依据你使用的算法不同,找到这个解的速度,行话叫收敛速度,会有所不同)。
- 一个线性不可分的问题,向高维空间转化,使其变得线性可分。是的,有这样一种函数K(w,x),他接受低维空间的输入值,却能算出高维空间的内积值<w’,x’>?,这样的函数就是核函数,使得一个线性不可分的问题变成线性可分的。
- 松弛变量也是解决线性不可分问题的方法,但是回想一下,核函数的引入不也是为了解决线性不可分的问题么?为什么要为了一个问题使用两种方法呢?
其实,两者还有微妙的不同。一般的过程应该是这样,还以文本分类为例。在原始的低维空间中,样本相当的不可分,无论你怎么找分类平面,总会有大量的离群点,此时用核函数向高维空间映射一下,虽然结果仍然是不可分的(也就是说绝大部分点是线性可分的,只有极少数点是线性不可分的),但比原始空间里的要更加接近线性可分的状态(就是达到了近似线性可分的状态),此时再用松弛变量处理那些少数“冥顽不化”的离群点,就简单有效得多啦。 - 我们想求得这样一个线性函数(在n维空间中的线性函数):
g(x)=wx+b
求这样的g(x)的过程就是求w(一个n维向量)和b(一个实数)两个参数的过程(但实际上只需要求w,求得以后找某些样本点代入就可以求得b)。因此在求g(x)的时候,w才是变量。
你肯定能看出来,一旦求出了w(也就求出了b),那么中间的直线H就知道了(因为它就是wx+b=0嘛,哈哈),那么H1和H2也就知道了(因为三者是平行的,而且相隔的距离还是||w||决定的)。那么w是谁决定的?显然是你给的样本决定的,一旦你在空间中给出了那些个样本点,三条直线的位置实际上就唯一确定了(因为我们求的是最优的那三条,当然是唯一的),我们解优化问题的过程也只不过是把这个确定了的东西算出来而已。
样本确定了w,用数学的语言描述,就是w可以表示为样本的某种组合:
w=α1x1+α2x2+…+αnxn
式子中的αi是一个一个的数(在严格的证明过程中,这些α被称为拉格朗日乘子),而xi是样本点,因而是向量,n就是总样本点的个数。为了方便描述,以下开始严格区别数字与向量的乘积和向量间的乘积,我会用α1x1表示数字和向量的乘积,而用<x1,x2>表示向量x1,x2的内积(也叫点积,注意与向量叉积的区别)。因此g(x)的表达式严格的形式应该是:
g(x)=<w,x>+b
但是上面的式子还不够好,你回头看看图中正样本和负样本的位置,想像一下,我不动所有点的位置,而只是把其中一个正样本点定为负样本点(也就是把一个点的形状从圆形变为方形),结果怎么样?三条直线都必须移动(因为对这三条直线的要求是必须把方形和圆形的点正确分开)!这说明w不仅跟样本点的位置有关,还跟样本的类别有关(也就是和样本的“标签”有关)。因此用下面这个式子表示才算完整:
w=α1y1x1+α2y2x2+…+αnynxn (式1)
其中的yi就是第i个样本的标签,它等于1或者-1。其实以上式子的那一堆拉格朗日乘子中,只有很少的一部分不等于0(不等于0才对w起决定作用),这部分不等于0的拉格朗日乘子后面所乘的样本点,其实都落在H1和H2上,也正是这部分样本(而不需要全部样本)唯一的确定了分类函数,当然,更严格的说,这些样本的一部分就可以确定,因为例如确定一条直线,只需要两个点就可以,即便有三五个都落在上面,我们也不是全都需要。这部分我们真正需要的样本点,就叫做支持(撑)向量!(名字还挺形象吧,他们“撑”起了分界线)
式子也可以用求和符号简写一下:
\[ w=\sum_{i=1}^n \left(\alpha_i y_i x_i\right) \]
因此原来的g(x)表达式可以写为:
\[ g(x)=\langle w,x \rangle +b = \sum_{i=1}^n \left(\alpha_i y_i \langle x_i,x \rangle \right)+b \]
注意式子中x才是变量,也就是你要分类哪篇文档,就把该文档的向量表示代入到 x的位置,而所有的xi统统都是已知的样本。还注意到式子中只有xi和x是向量,因此一部分可以从内积符号中拿出来,得到g(x)的式子为:
\[ g(x)=\sum_{i=1}^n \left(\alpha_i y_i \langle x_i,x \rangle \right)+b \] (式2)
问题:
- 对于大样本数据和小样本数据,预测的时候怎么区分?希望高手指点一二!