支持向量机(SVM)简介

主要内容

一:SVM简介

二:线性分类

三:分类间隔

四:核函数

五:松弛变量

SVM简介


  支持向量机(support vector Machine)是由Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

  支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模式的复杂性(即对特定训练样本的学习精度,Accurary)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力。

  SVM实质上是一个类分类器,是一个能够将不同类样本在样本空间分隔的超平面。
  换句话说,给定一些标记(label)号的训练样本,SVM算法输出一个最优化的分隔超平面。


     ------------------------------------分割线------------------------------------


线性分类

  线性分类器(一定意义上,也可以叫做感知机)是简单也很有效的分类器形式。
  这里我们考虑的是一个两类的分类问题,如图所示;C1和C2是要区分的两个类别,中间的直线就是一个
分类函数,它可以将两类样本完全分开。

  一般地,如果一个线性函数能够将样本完全正确的分开,就称这些数据是线性可分的,否则称为非线性可分。

  数据点用xi来表示,则判别函数(超平面)为:

  判别规则:

  当有一个样本xi需要判别的时候,我们就看f(xi)的值。

  若f(xi) >0,就判别为正类

  若f(xi) <0,则判别为负类

  等于0的时候拒绝判断


关于这个表达式要注意三点:
  一、式中的x不是二维坐标系中的横轴,而是样本的向量表示,例如一个样本点的坐标是(3,8),则xT=(3,8) ,而不是x=3;

  二、这个形式并不局限于二维的情况,在n维空间中仍然可以使用这个表达式,只是式中的ω成为了n维向量;

  三、f(x)不是中间那条直线的表达式,中间那条直线的表达式是f(x)=0,即ωx+b=0,我们也把这个函数叫做分类面。
 
    很容易看出来,中间那条分界线并不是唯一的,我们把它稍微旋转一下,只要不把两类数据分错,仍然可以达到分类的效果。
    此时就牵涉到一个问题,对同一个问题存在多个分类函数的时候,哪一个函数更好呢?显然必须要先找一个指标来量化“好”的程度,通常使用叫做“分类间隔”的指标。

      --------------------------------------分割线--------------------------

分类间隔

    在进行文本分类的时候,我们可以让计算机这样来看待我们提供给它的训练样本,每一个样本由一个向量和一个标记组成。如下:
Di=(xi,yi),xi就是文本向量,yi就是分类标记;
    在二元的线性分类中,这个表示分类的标记只有两个值,1和-1(用来表示属于还是不属于这个类)。有了这种表示法,我们就可以定义一个样本点到某个超平面的间隔:
    上述定义的函数间隔,只是一个人为定义的间隔度量,虽然可以表示分类预测的正确性,但却不能表示实际的距离。

    现在把ω和b进行一下归一化,即用ω/||ω||和b/||ω||分别代替原来的ω和b,那么间隔就可以写成:
    当用归一化的ω和b代替原值之后的间隔有一个专门的名称,叫做几何间隔,几何间隔所表示的正是点到超平面的欧氏距离。
    同样可以定义一个点的集合(就是一组样本)到某个超平面的距离为此集合中离超平面最近的点的距离。
 
    下面这张图更加直观的展示出了几何间隔的现实含义:

    目标:最大化几何间隔:

    注意到几何间隔与||ω||是成反比的,因此最大化几何间隔可以转化为最小化||ω||,则目标函数用数学形式表达为:min||ω||
    为了形式简化,常用该如下式子代替:

    同时为了方便推导和优化,把几何间隔固定为1,即让下面的式子总是成立:
 

    因此我们的二分类问题转化成了它的数学形式:
 
    这是一个带约束的二次规划(quadratic programming,QP)问题,且由于它的可行域是一个凸集,因此它是一个凸二次规划;凸二次规划问题不会有局部最优解,只有全局最优解。
我们要求得这样一个线性函数:

    使得所有属于正类的点x+代入以后有f(x+)≥1,而所有属于负类的点x-代入后有f(x-)≤-1,代入f(x)后的值如果在1和-1之间,我们就拒绝判断。
    样本点x已知,参数b可由ω导出;所以求这样的f(x)的过程就是求ω(一个n维向量)的过程。
求出ω后,中间那条直线H的表达式即为:<ω.x>+b=0


    那么ω由谁决定呢?
    显然是由空间中给定的样本决定的,一旦在空间中给出了那些样本点,最优的三条直线的位置就唯一确定了。
    样本确定了ω,用数学的语言描述,就是ω可以表示为样本的某种组合:

 
    式中的α是一个一个的数(在严格的证明过程中,这些α被称为拉格朗日乘子)
    显然ω还和样本的类别有关,因此更完整的式子如下:
 
    其中的yi就是第i个样本的标签,它等于1或者-1。
 

      -----------------------------------分割线-----------------------------------------

拉格朗日乘子法和KKT条件

  在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值;如果含有不等式约束,可以应用KKT条件去求取。当然,这两个方法求得的结果只是必要条件,只有当是凸函数的情况下,才能保证是充分必要条件。KKT条件是拉格朗日乘子法的泛化。

KKT条件
    对于含有不等式约束的优化问题:

 
    把所有的不等式约束、等式约束和目标函数全部写为一个式子:

 
    其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。 

    KKT条件是指最优值必须满足以下条件:

 
    KKT条件的意义:它是一个非线性规划问题能有最优化解法的必要和充分条件。
    对于我们要求解的问题,


    将约束条件融入到目标函数:


    令:

    当所有约束条件满足时
    则目标函数转换为

    交换max与min的位置,用对偶式子表达为:

    由于我们的优化是满足强对偶的(强对偶是指对偶式子的最优值等于原问题的最优值)
    则所求问题转变为:
    1:先求L 对ω、b的极小;
    2:再求L 对α的极大;

    首先求对ω,b的偏导

    将以上结果分别代回函数L ,得到结果

    因为:
 
    所以式子可化简为:

    从这个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量α
 
    然后求L对α的极大,即(smo算法)

    当求出α之后,则可利用前边的关系求出ω

    然后通过公式求b

    则分类函数就可以表示出来了
    已知
    则

    可以看出对于新点 x的预测,只需要计算它与训练数据点的内积即可判别并分类。

        -----------------------------分割线-------------------------------

核函数

    之前一直在讨论的线性分类器,只能对线性可分的样本做处理。如果提供的样本线性不可分,则线性分类器的求解程序会无限循环,永远也解不出来。
    那么对于非线性情况SVM将如何处理呢?是否有某种方法,让线性不可分的数据变得线性可分呢?
    下面,由一个二维平面中的分类作例子引出核函数的概念。

    例子是下边这幅图,我们把横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类。显然找不到符合条件的线性函数将其分类。

    但我们可以找到一条曲线,例如下边这一条:通过点在这条曲线的上方还是下方就可以判断点所属的类别。

    曲线的函数表达式为:

    它不是一个线性函数;我们做如下映射,新建一个向量y和a:


    这样g(x)就可以转化为f(y)=向量a与向量y的内积,即g(x)=f(y)=ay
    如此一来,原来在二维空间中一个线性不可分的问题,映射到四维空间后,变成了线性可分的! 因此这也形成了解决线性不可分问题的基本思路——向高维空间转化,使其变得线性可分。
    假设某个问题在维度N上是线性不可分的;
另设在更高维M空间上有一线性函数f(x')=<ω',x'>+b,它能够将原问题变得可分。
    现在我们输入一个N维的向量x,分类的过程是先把x变换为M维的x',然后求这个变换后的向量x'与向量w'的内积,再把这个内积的值和b相加,就得到了结果。
 
    实际上,我们只关心高维空间里内积的值,那个值算出来后,分类结果也随即出来了。而从理论上说, x'是经由x变换来的,因此广义上可以把它叫做x的函数,而ω'是常量,它是一个低维空间里的常量ω经过变换得到的,所以给了一个ω 和x的值,就有一个确定的f(x')值与其对应。
    这让我们幻想,是否能有这样一种函数K(ω,x),他接受低维空间的输入值,却能算出高维空间的内积值<ω',x'>
 
    事实上这样的K(ω,x)确实存在,它被称为核函数。其基本作用是接受两个低维空间里的向量,能够计算出经过变换后在高维空间里的向量内积值。
定义一个函数K,对所有x,z,满足:

    这里φ是从X到内积特征空间F的映射。
 
    这样一个高维空间里的线性函数:

    就可以用一个低维空间里的函数来代替。


    举例说明核函数的作用:设有两个向量

    φ定义为输入变量到高维特征空间的映射:

则映射过后的内积为:

我们再看一式子:
将两向量
代入,得:

即说明

    从上面的现象可以看到两者的区别:
    1.一个是映射到高维空间中,然后再根据内积的公式进行计算;
    2.核函数则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果。
 
    前面的二次曲线分类的例子中提到,在二维空间中一个线性不可分的问题,映射到四维空间后,变成了线性可分。但当原始空间的维数上升,在向高维空间作映射时,数目将呈爆炸性增长,这给φ的计算带来了非常大的困难。而核函数能从容地解决维数爆炸的难题。
 
    因为我们这里的例子非常简单,所以我可以手工构造出对应于φ的核函数,如果对于任意一个映射,想要构造出对应的核函数是很困难的。
    通常人们会从一些常用的核函数中选择。
    例如:多项式核函数 

    显然刚才我们举的例子是这里多项式核的一个特例(R = 1,d = 2)。
 
    例如:高斯核函数

    这时,如果x1和x2很相近(||x1-x2||^2≈0),那么核函数值为1,如果x1和x2相差很大(||x1-x2||^2>>0),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。
 
    下图说明在低维线性不可分时,映射到高维后就可分了,使用的是高斯核函数。


       --------------------------------分割线-----------------------
 
核函数有效性的判断

    给定m个训练样本

    每一个X(i)对应一个特征向量。那么,我们将任意两个X(i)X(j)代入K中,计算得到

    i,j可以从1到m,这样可以计算出m*m的核函数矩阵(Kernel Matrix)。为了方便,我们将核函数矩阵和K(x,z)都使用K来表示。
    如果假设K是有效的核函数,那么根据核函数定义:
可见,矩阵K应该是个对称阵。

    让我们得出一个更强的结论,首先使用Φk(x)来表示映射Φ(x)的第K维属性值。
那么对于任意非零向量z,得

    从上式可以看出,如果K是个有效的核函数(即K(x,z)和Φ(x)TΦ(z)等价,那么,在训练集上得到的核函数矩阵K应该是半正定的(K≥0)
    这样,得到一个核函数的必要条件:
K是有效的核函数==>核函数矩阵K是对称半正定的。
另外,这个条件也是充分的,由Mercer定理来表达。
 
Mercer定理:
    如果函数K是RR→R上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数,当且仅当对于训练样例{x(1),x(2),...,x(m)},其相应的核函数矩阵是对称半正定的。
    Mercer定理表明为了证明K是有效的核函数,不用去寻找映射Φ,而只需要在训练集上求出各个Kij,然后判断矩阵K是否是半正定即可。


     -------------------------------分割线-------------------------------

松弛变量

    在最开始讨论支持向量机的时候,我们就假定,数据是线性可分的,亦即我们可以找到一个可行的超平面将数据完全分开。后来为了处理非线性数据, 使用 Kernel 方法对原来的线性 SVM 进行了推广,使得非线性的的情况也能处理。虽然通过此方法,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理。 
    例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音,产生了很多的离群点。如下图

    由于我们原本的优化问题的表达式中,确实要考虑所有的样本点,在此基础上寻找正负类之间的最大间隔,而非负的,像图中这种有噪声的情况会使得整个问题无解。这种解法也叫做“硬间隔”分类法,因为它硬性要求所有样本点都满足与分类平面间的距离必须大于某个值。

    为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。 
把原约束条件
    变为

    其中,ξi称为松弛变量 (slack variable) ,对应数据点xi允许偏离的函数间隔(functional margin)的量。
    因为松弛变量是非负的,因此最终的结果要求间隔可以比1小。但是当某些点出现这种间隔比1小的情况时(这些点也叫离群点),意味着我们放弃了对这些点的精确分类,这对分类器来说是种损失。
 
    因此,原来的优化问题就变为

    这时,求出的目标称作软间隔分类器;该式子需要注意以下几点:
    1.并非所有的样本点都有一个松弛变量与其对应,实际上只有“离群点”才有。
    2.松弛变量的值实际上标示出了对应的点到底离群有多远,值越大,点就越远。
    3.惩罚因子C决定了你有多重视离群点带来的损失,显然当所有离群点的松弛变量的和一定时,  你定的C越大,对目标函数的损失也越大,暗示着你非常不愿意放弃这些离群点。
    4.惩罚因子C不是一个变量,整个优化问题在解的时候,C是一个你必须事先指定的值。
 
    再次建立lagrange函数,简化约束条件

    我们先让L针对ω 、b和 ξ最小化

    将这些条件带回 L并化简

    整理约束条件有:(smo算法求解)

    可以看到唯一的区别就是现在此处多了一个上限C。而 Kernel 化的非线性形式也是一样的,所以可以用相同的方法求解α。
 
    再利用相关公式求出ω,b,建立分类函数
 
    松弛变量实际上是个解决线性不可分问题的方法;而核函数的引入也是为了解决线性不可分。
    在实际的应用中,一般的过程是这样的:在原始的低维空间中,样本相当的不可分,无论你怎么找分类平面,总会有大量的离群点,此时用核函数向高维空间映射一下,虽然结果仍然是不可分的,但比原始空间里的要更加接近线性可分的状态(就是达到了近似线性可分的状态),此时再用松弛变量处理那些少数“冥顽不化”的离群点。
    至此一个比较完整的支持向量机框架就有了,简单说来,支持向量机就是使用了核函数的软间隔线性分类法。

Thank you!

 

原文地址:https://www.cnblogs.com/codingmengmeng/p/5415087.html