• 机器学习之支持向量机(Support Vector Machine)


      转载请注明出处:http://www.cnblogs.com/Peyton-Li/

    支持向量机

      支持向量机(support vector machines,SVMs)是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使它成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划(convex quadratic programming)的问题。

      支持向量机学习方法包含构建由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly separable case)、线性支持向量机(linear support vector machine)及非线性支持向量机(non-linear support vector machine)。简单模型是复杂模型的基础,也是复杂模型的特殊情况。当训练数据线性可分时,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机,又称为硬间隔支持向量机;当训练数据近似线性可分时,通过软间隔最大化(soft margin maximization),也学习一个线性的分类器,即线性支持向量机,又称为软间隔支持向量机;当训练数据线性不可分时,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性支持向量机。通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。核方法(kernel method)是比支持向量机更为一般的机器学习方法。

    线性可分支持向量机与硬间隔最大化

      支持向量机的学习是在特征空间进行的。假设给定一个特征空间上的训练数据集,其中,为第i个特征向量,也称为实例,的类标记,当=+1时,称为正例;当=-1时,称为负例,称为样本点。再假设训练数据集是线性可分的。

      学习的目标实在特征空间中寻找一个分离超平面,能将实例分到不同的类。分离超平面对应于方程,它由法向量和截距决定,可用来表示。

      一般地,当训练数据集线性可分时,存在无穷个分离超平面可将两类数据正确分开。线性可分支持向量机利用间隔最大化求最优分离超平面,这时,解是唯一的。

      定义线性可分支持向量机)给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为:

          (1)

    以及相应的分类决策函数

        (2)

    称为线性可分支持向量机。

      算法线性可分支持向量机学习算法——最大间隔法

        输入:线性可分训练数据集,其中,

        输出:最大间隔分离超平面和分类决策函数。

        (1)构造并求解约束最优化问题:

              

                

        求得最优解

        (2)由此得到分离超平面:

              

        分类决策函数

              

      在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量(support vector)。支持向量是使约束条件等号成立的点,即

              

      对的正例点,支持向量在超平面上,

      对的负例点,支持向量在超平面上。

      称为间隔边界。

      在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。

     

      那么,上述算法中的是怎么得到的呢?

      想要求解线性可分支持向量机的最优化问题,将它作为原始最优化问题,应用拉格朗日对偶性,通过求解对偶问题(dual problem)得到原始问题(primal problem)的最优解,这就是线性可分支持向量机的对偶算法(dual problem)。这样做的有点,一是对偶问题往往更容易求解;二是自然引入核函数,进而推广到非线性分类问题。

      首先构建拉格朗日函数(Lagrange function)。为此,对每一个不等式约束引进拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数:

                (3)

      其中,为拉格朗日乘子向量。

      根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:

            

      所以,为了得到对偶问题的解,需要先求对w,b的极小,再求对的极大。

      (1)求

        将拉格朗日函数分别对w,b求偏导数并令其等于0。

            

            

        得

                (4)

                (5)

        将(4)(5)两式带入拉格朗日函数,即得

     

             

                 

        即

            

      (2)求的极大,即是对偶问题

                (6)

              

     

                ,i=1,2,...,N

       将上述目标函数由极大转换成极小,就得到下面与之等价的对偶最优化问题:

                (7)

                  (8)

     

                       ,i=1,2,...,N    (9)

      设是对偶最优化问题的解,则存在下标j,使得,并可按下式求得原始最优化问题的解

                (10)  

                (11)

     

     线性支持向量机与软间隔最大化

      线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,因为这时上述方法中的不等式约束并不能都成立。怎么才能将它扩展到线性不可分问题呢?这就需要修改硬间隔最大化,使其成为软间隔最大化。

      线性不可分意味着某些样本点不能满足函数间隔大于等于1的约束条件。为了解决这个问题,可以对每个样本点引进一个松弛变量,使函数间隔加上松弛变量大于等于1。这样,约束条件变为

        

    同时,对每个松弛变量,支付一个代价。目标函数由原来的变为

            (12)

    这里,C>0称为惩罚参数,一般由应用问题决定,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小。最小化目标函数包含两层含义:使尽量小即间隔尽量大,同时使误分类点的个数尽量小,C是调和二者的系数。

      有了上面的思路,可以和训练数据集线性可分时一样来考虑训练数据集线性不可分时的线性支持向量机学习问题。相应于硬间隔最大化,它称为软间隔最大化。

      线性不可分的线性支持向量机的学习问题变成如下凸二次规划(convex quadratic programming)问题(原始问题):

                 (13)                                     

                     (14)

                           (15)

       原始最优化问题的拉格朗日函数是

            (16)

    其中,

      对偶问题是拉格朗日函数的极大极小问题。首先求的极小,由

        

        

        

            (17)

            (18)

            (19)

    将(17)(18)(19)三式代入拉格朗日函数,得

        

    再对的极大,即得对偶问题:

            (20)

                   (21)

                   (22)

                   (23)

               ,             (24)

    将对偶最优化问题进行变换,可得:

        

             

             , 

    是问题的一个解,若存在的一个分量,原始问题的解可按下式求得:

            (25)

            (26)

     非线性支持向量机与核函数

      对解线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,有时分类问题是非线性的,这是可以采用非线性支持向量机。非线性支持向量机的主要特点是核技巧(kernel trick)。核技巧不仅应用于支持向量机,而且应用于其他统计学习问题。

    1、非线性分类问题

      一般来说,对给定的一个训练数据集,其中,实例属于输入空间,,对应的标记有两类,i=1,2,...,N。如果能用中的一个超平面将正负例正确分开,则称这个问题为非线性可分问题。

      非线性问题往往不好求解,所以希望能用解决线性分类问题的方法解决这个问题。所采取的方法是进行一个非线性变换,将非线性问题变换为线性问题,通过解变换后的线性问题的方法求解原来的非线性问题。

      设原空间为,新空间为,定义从原空间到新空间的变换(映射):

        

    经过变换,原空间变换为新空间,原空间中的点相应地变换为新空间中的点,原空间中的椭圆

        

    变换称为新空间中的直线

        

    在变换后的新空间里,直线可以将变换后的正负实例点正确分开。这样,原空间的非线性可分问题就变成了新空间的线性可分问题。

      用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原空间的数据映射到新空间;然后在新空间里用线性分类学习方法从训练数据中学习分类模型。核技巧就属于这样的方法。

      核技巧应用到支持向量机,其基本想法就是通过一个非线性变换将输入空间(欧式空间或离散集合)对应于一个特征空间(希尔伯特空间),使得在输入空间中的超曲面模型对应于特征空间中的超平面模型(支持向量机)。这样,分类问题的学习任务通过在特征空间中求解线性支持向量机就可以完成。

    2、核函数的定义

      定义(核函数)  是输入空间(欧式空间的子集或离散集合),又设为特征空间(希尔伯特空间),如果存在一个从的映射

        

    使得对所有,函数满足条件

        

    则称为核函数,为映射函数,式中的内积。

      核技巧的想法是,在学习与预测中只定义核函数,而不显式地定义映射函数。通常,直接计算比较容易,而通过计算并不容易。注意,是输入空间到特征空间的映射,特征空间和映射函数的取法并不唯一,可以取不同的特征空间,即便是在同一特征空间里也可以取不同的映射。

    3、核技巧在支持向量机中的应用

      我们注意到在线性支持向量机的对偶问题中,无论是目标函数还是决策函数(分离超平面)都涉及输入实例与实例之间的内积。在对偶问题的目标函数中的内积可以用核函数来代替。此时对偶问题的目标函数称为

        

    同样,分类决策函数中的内积也可以用核函数代替,而分类决策函数式成为

        

      这等价于经过映射函数将原来的输入空间变换到一个新的特征空间,将输入空间中的内积变换为特征空间中的内积,在新的特征空间里从训练样本中学习线性支持向量机。当映射函数是非线性函数时,学习到的含有核函数的支持向量机是非线性分类模型。

      也就是说,在核函数给定的条件下,可以利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行的,不需要显式地定义特征空间和映射函数。这样的技巧称为核函数,它是巧妙地利用线性分类学习方法和核函数解决非线性问题的技术。在实际应用中,往往依赖领域知识直接选择核函数,核函数选择的有效性需要通过实验验证。

      常用核函数

      1、线性核函数(linear kernel function)

        

    如果已经知道问题是线性可分的,就可以使用线性核,参数少,速度快,对于一般数据,分类效果已经很理想,不必选用非线性核。

     

      2、多项式核函数(polynomial kernel function)

        

    多项式核函数具有良好的全局性质,局部性较差

      3、高斯核函数(Gaussian kernel function)

        

    高斯核函数则是局部性强的核函数,其外推能力随着参数σ的增大而减弱。主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。与多项式核函数相比,高斯核函数需要确定的参数要少,核函数参数的多少直接影响函数的复杂程度。另外,当多项式的阶数比较高时,核矩阵的元素值将趋于无穷大或无穷小,而高斯核函数则会减少数值的计算困难。

      4、sigmoid核函数(sigmoid kernel function)

        

      5、字符串核函数(string kernel function)

      核函数不仅可以定义在欧氏空间上,还可以定义在离散数据的集合上。比如,字符串核是定义在字符串集合上的核函数。字符串核函数在文本分类、信息检索、生物信息学等方面都有应用。

       关于核函数,平时用的最多的是线性核函数和高斯核函数。

      如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM。如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel。如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况。

     

    序列最小最优化算法

      上述硬间隔最大化和软间隔最大化的解中我们都假设已经求出,然后得出w和b的解。而这个具体怎么求解呢?就要用到序列最小最优化(sequential minimal optimization, SMO)算法。

      SMO算法要解决如下凸二次规划的对偶问题:

            (27)

               (28)

           ,      (29)

    在这个问题中,变量是拉格朗日乘子,一个变量对应于一个样本点;变量的总数等于训练样本容量N。

      SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此最优问题的KKT条件(Karush-Kuhn-Tucker conditions),那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这是子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反KKT条件最严重的那一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。

      注意,子问题的两个变量中只有一个是自由变量。假设为两个变量,固定,那么由等式约束(28)可知

        

    如果确定,那么也随之确定。所以子问题中同时更新两个变量。

      整个SMO算法包括两个部分:求解两个变量二次规划的解析方法和选择变量的启发式方法。

    1、两个变量二次规划的求解方法

      假设选择的两个变量是,其他变量是固定的。于是SMO的最优化问题的子问题可以写成:

            (30)

              (31)

                (32)

    其中,是常数,目标函数式中省略了不含的常数项。

      为了求解两个变量的二次规划问题,首先分析约束条件,然后在此约束条件下求极小。

      由于只有两个变量,约束可以用二维空间中的图形表示:

                 

      不等式约束使得在盒子内,等式约束使在平行于盒子的对角线的直线上。因此要求的是目标函数在一条平行于对角线的线段上的最优值。这使得两个变量的最优化问题成为实质上的单变量的最优化问题,不妨考虑为变量的最优化问题。

      假设问题的初始可行解为,最优解为,并且假设在沿着约束方向未经剪辑时的最优解为

      由于需满足不等式约束,所以最优值的取值范围必须满足条件

        

    其中,L与H是所在的对角线段端点的界。如果,则

        

    如果,则

        

      下面,首先求沿着约束方向未经剪辑即未考虑不等式约束时的最优解;然后再求剪辑后的解。我们用定理来叙述这个结果。为了叙述简单,记

            (33)

        ,     (34)

    时,为函数对输入的预测值与真实输出之差。

    定理    最优化问题沿着约束方向未经剪辑的解是

            (35)

    其中,

            (36)

    是输入空间到特征空间的映射,,上面已经给出

      经剪辑后的解是

            (37)

    求得

            (38)

     

    2、变量的选择方法

      1)、第一个变量的选择

      SMO称选择第一个变量的过程为外层循环。外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量。具体地,检验训练样本点是否满足KKT条件,即

                (39)

              (40)

                  (41)

    其中,

      该检验是在范围内进行的。在检验过程中,外层循环首先遍历所有满足条件的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。如果这些样本都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。 

      2)、第二个变量的选择

      SMO称选择第二个变量的过程为内层循环。假设在外层循环中已经找到第一个变量,现在要在内层循环中找第二个变量。第二个变量选择的标准是希望能使有足够大的变化。

      由(35)、(37)可知,是依赖于的,为了加快计算速度,一种简单的做法是选择,使其对应的最大。因为已定,也确定了。如果是正的,那么选择最小的作为;如果是负的,那么选择最大的作为。为了节省计算时间,将所有的值保存在一个列表中。

      在特殊的情况下,如果内层循环通过以上方法选择的不能使目标函数有足够的下降,那么采用以下启发式规则继续选择。遍历在间隔边界上的支持向量点,依次将其对应的变量作为试用,直到目标函数有足够的下降。若找不到合适的,那么遍历训练数据集;若仍找不到合适的,则放弃第一个,再通过外层循环寻求另外的

      3)、计算阈值和差值

      在每次完成两个变量的优化后,都要重新计算阈值。当时,由KKT条件可知:

            

    于是,

                (42)

    的定义式(34)有

            

    式(42)的前两项可写成

            

    带入式(42),可得

                (45)

    同样,如果,那么,

                (46)

      如果同时满足条件,i=1,2,那么。如果是0或者C,那么以及它们之间的数都是符合KKT条件的阈值,这是选择它们的中点作为

      在每次完成两个变量的优化之后,还必须更新对应的值,并将它们保存在列表中。值的更新要用到值,以及所有支持向量对应的

                (47)

    其中,S是所有支持向量的集合。

      特点:将低维空间映射到高维空间,实现线性可分

      优点:可实现非线性分类,可用于分类与回归,低泛化误差,易解释。

      缺点:对核函数以及参数敏感。

  • 相关阅读:
    接口和抽象类
    JNI
    Serializable Parcelable
    android keystore 生成以及作用
    svn 服务器搭建
    java 8种基本数据类型
    Android NDK
    android adb命令行
    对称加密AES和DES加密、解密
    .net中的数据库连接字符串
  • 原文地址:https://www.cnblogs.com/Peyton-Li/p/7536927.html
Copyright © 2020-2023  润新知