zoukankan      html  css  js  c++  java
  • 机器学习支持向量机SVM笔记

    SVM简述:

    SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机。SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后的变化SVM可能就不起作用了。

    SVM的思想

    下面举个简单的例子。如下图所示,现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是-1 ,另一边所对应的y全是1。

     

    这个超平面可以用分类函数表示,如果用进行分类,当f(x) 等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点,这里面的wT就是的法向量,如下图所示:

     

      在进行分类的时候,遇到一个新的数据点x,将x代入f(x) 中,如果f(x)小于0则将x的类别赋为-1,如果f(x)大于0则将x的类别赋为1。

      接下来的问题是,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。而决定这个超平面的方向要取决于它的法向量wT,我们若要分类数据点就必须通过二类数据点的相关边界点来确定这个法向量wT,这就是支持向量机的来由。

     SVM的推导过程

    1)函数间隔Functional margin与几何间隔Geometrical margin

    在超平面w*x+b=0确定的情况下,|w*x+b|能够表示点x到距离超平面的远近,而通过观察w*x+b的符号与类标记y的符号是否一致可判断分类是否正确,所以,可以用(y*(w*x+b))的正负性来判定或表示分类的正确性。于此,我们便引出了函数间隔(functional margin)的概念。
    定义函数间隔(用表示)为:

     而超平面(w,b)关于T中所有样本点(xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:

      = mini  (i=1,...n)

    但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还远远不够。事实上,我们可以对法向量w加些约束条件,从而引出真正定义点到超平面的距离--几何间隔(geometrical margin)的概念。

    假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量,为样本x到超平面的距离,如下图所示:

     

    根据平面几何知识,有

    其中||w||为w的二阶范数(范数是一个类似于模的表示长度的概念),是单位向量(一个向量除以它的模称之为单位向量)。

    又由于x0 是超平面上的点,满足 f(x0)=0,代入超平面的方程,可得,即

        随即让此式的两边同时乘以,再根据,即可算出γ: 

    为了得到γ的绝对值,令γ乘上对应的类别 y,即可得出几何间隔(用表示)的定义:

     

      从上述函数间隔和几何间隔的定义可以看出:几何间隔就是函数间隔除以||w||,而且函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。

    2)最大间隔分类器Maximum Margin Classifier的定义

     对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。

    通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放w的长度和b的值,这样可以使得的值任意大,亦即函数间隔可以在超平面保持不变的情况下被取得任意大。但几何间隔因为除上了,使得在缩放w和b的时候几何间隔的值是不会改变的,它只随着超平面的变动而变动,因此,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。

    于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为:

     同时需满足一些条件,根据间隔的定义,有

     其中,s.t.,即subject to的意思,它导出的是约束条件。

    回顾下几何间隔的定义,可知:如果令函数间隔等于1(之所以令等于1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),则有 = 1 / ||w||且,从而上述目标函数转化成了

     相当于在相应的约束条件下,最大化这个1/||w||值,而1/||w||便是几何间隔。   

        如下图所示,中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),其到两条虚线边界的距离相等,这个距离便是几何间隔,两条虚线间隔边界之间的距离等于2,而虚线间隔边界上的点则是支持向量。由于这些支持向量刚好在虚线间隔边界上,所以它们满足(还记得我们把 functional margin 定为 1 了吗?上节中:处于方便推导和优化的目的,我们可以令

     =1),而对于所有不是支持向量的点,则显然有

     

    3)从线性可分到线性不可分

    从原始问题到对偶问题的求解

    接着考虑之前得到的目标函数:

    由于求的最大值相当于求的最小值,所以上述目标函数等价于(w由分母变成分子,从而也有原来的max问题变为min问题,很明显,两者问题等价):

      因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。

        此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。

         那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):

     然后令 容易验证,当某个约束条件不满足时,例如,那么显然有θ(ω)=∞,(只要令αi=∞即可)。而当所有约束条件都满足时,则最优值为,亦即最初要最小化的量。

    因此,在要求约束条件得到满足的情况下最小化,实际上等价于直接最小化(当然,这里也有约束条件,就是αi≥0,i=1,…,n)   ,因为如果约束条件没有得到满足,θ(ω)会等于无穷大,自然不会是我们所要求的最小值。

        具体写出来,目标函数变成了:

     

        这里用p*表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而αi又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:

        交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用d*来表示。而且有d*≤p*,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。

        换言之,之所以从minmax的原始问题p*,转化为maxmin的对偶问题d*,一者因为d*是p*的近似解,二者,转化为对偶问题后,更容易求解。

        下面可以先求L 对w、b的极小,再求L 对α的极大。

     KKT条件

     上文中提到“在满足某些条件的情况下,两者等价”,这所谓的“满足某些条件”就是要满足KKT条件。

     KKT条件的成立要满足constraint qualifications,而constraint qualifications之一就是Slater条件。所谓Slater 条件,即指:凸优化问题,如果存在一个点x,使得所有等式约束都成立,并且所有不等式约束都严格成立(即取严格不等号,而非等号),则满足Slater 条件。对于此处,Slater 条件成立,所以d*≤p*可以取等号。

        一般地,一个最优化数学模型能够表示成下列标准形式:

     

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

        同时,得明白以下两点:

      1.凸优化的概念: 为一凸集,  为一凸函数。凸优化就是要找出一点  ,使得每一 满足 

      2.KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。
        而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:

     

        经过论证,我们这里的问题是满足 KKT 条件的(首先已经满足Slater条件,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。

        也就是说,原始问题通过满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对α的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。

    对偶问题求解的3个步骤

    1)首先固定α要让 L 关于 w 和 b 最小化,我们分别对w,b求偏导数,即令 ∂L/∂w 和 ∂L/∂b 等于零:

     

    将以上结果代入之前的L:

     

     得到:

     具体推导过程如下:

    2) 求对α的极大即是关于对偶问题的最优化问题。经过上面第一个步骤的求w和b,得到的拉格朗日函数式子已经没有了变量w,b,只有α。从上面的式子得到:

     

     这样,求出了αi,根据 ,可求出w,然后通过

    ,即可求出b,最终得出分离超平面和分类决策函数。

    3) 在求得L(w, b, a) 关于 w 和 b 最小化,以及对的极大之后,最后一步则可以利用SMO算法求解对偶问题中的拉格朗日乘子α

    SMO算法https://blog.csdn.net/v_JULY_v/article/details/7624837

     等价于求解:

     SVM核函数的引入

     为了分类那些线性不可分的情况,我们采取了引入核函数的办法。

    具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:

     而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:

    这里ϕ:X->F是从输入空间到某个特征空间的映射,这意味着建立非线性学习器分为两步:

    1.首先使用一个非线性映射将数据变换到一个特征空间F,
    2.然后在特征空间使用线性学习器分类。
        而由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:
     

    如果有一种方式可以在特征空间中直接计算内积〈φ(xi · φ(x)〉,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:

      核是一个函数K,对所有x,z(-X,满足,这里φ是从X到内积特征空间F的映射。

    如果原始空间是三维(一阶、二阶和三阶的组合),那么我们会得到:3(一次)+3(二次交叉)+3(平方)+3(立方)+1(x1*x2*x3)+2*3(交叉,一个一次一个二次,类似x1*x2^2) = 19维的新空间,这个数目是呈指数级爆炸性增长的,从而势必这给的计算带来非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。
    不妨还是从最开始的简单例子出发,设两个向量

      映射过后的内积为:

     另外,我们又注意到:

     二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射

     之后的内积的结果是相等的,那么区别在于什么地方呢?

    一个是映射到高维空间中,然后再根据内积的公式进行计算;

    而另一个则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果。

    (公式说明:上面之中,最后的两个式子,第一个算式,是带内积的完全平方式,可以拆开,然后,通过凑一个得到,第二个算式,也是根据第一个算式凑出来的)

        回忆刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。

        我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:

     核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里需要计算的地方数据向量总是以内积的形式出现的。对比刚才我们上面写出来的式子,现在我们的分类函数为:

     其中α由如下 dual 问题计算而得:

      这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!

    几个核函数

    通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:

    1.多项式核,显然刚才我们举的例子是这里多项式核的一个特例(R = 1,d = 2)。虽然比较麻烦,而且没有必要,不过这个核所对应的映射实际上是可以写出来的,该空间的维度是,其中 m 是原始空间的维度。

    2.高斯核,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果σ选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果σ选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数σ,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。

    3.线性核,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

    核函数的本质

    把样例特征映射到高维空间、将高维空间的计算转为在低维空间的计算避免了直接在高维空间中的复杂计算,但是分类效果确表现在高维空间上。

    SVM处理线性不可分

    如果在分类任务中遇到如下情况

    蓝色类的其中一个点倾向于红色类的区域,这就需要SVM具有一定的泛化能力了

    这时候约束条件变成了

     其中ξi≥0称为松弛变量 (slack variable) ,对应数据点xi允许偏离的 functional margin 的量。当然,如果我们运行ξi任意大的话,那任意的超平面都是符合条件的了。所以,我们在原来的目标函数后面加上一项,使得这些ξi的总和也要最小:

     

    其中  是一个参数,用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。注意,其中  是需要优化的变量(之一),而  是一个事先确定好的常量。完整地写出来是这个样子:

     用之前的方法将限制或约束条件加入到目标函数中,得到新的拉格朗日函数,如下所示:

     分析方法和前面一样,转换为另一个问题之后,我们先让针对、b最小化:

     将  带回  并化简,得到和原来一样的目标函数:

     不过,由于我们得到而又有(作为 Lagrange multiplier 的条件),因此有,所以整个 dual 问题现在写作:

    把前后的结果对比一下:

     可以看到唯一的区别就是现在 dual variable  多了一个上限  。而 Kernel 化的非线性形式也是一样的,只要把换成即可。

    以上只是做了部分改动其余均参照:https://blog.csdn.net/v_JULY_v/article/details/7624837

     声明:针对SVM原理的理解的相关博客以及文章不胜枚举,本人特选一些有缘博客阅读并copy来加深理解方便回顾,所以出现相同的地方还请谅解,我一般会在文章中说明出处的。

  • 相关阅读:
    三元表达式 列表和字典推导式 函数对象 名称空间 作用域 global和nonlocal 函数装饰器 枚举对象
    函数参数 打散机制 字符串比较 返回值
    函数简介
    三种字符串的介绍 文件的读写
    字符编码
    数据类型及其常用方法 数据类型转换 可变与不可变 值拷贝与深浅拷贝
    流程控制 while和for循环
    变量命名规范 常量 输入和输出 注释 数据类型 运算符 逻辑运算符
    语言分类 编译型和解释型语言分析 环境变量 代码执行的方式 pip介绍 变量
    Python django tests
  • 原文地址:https://www.cnblogs.com/yang901112/p/11606723.html
Copyright © 2011-2022 走看看