zoukankan      html  css  js  c++  java
  • 支持向量机(SVM)——原理篇

    SVM简介

    支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

     

    SVM算法原理

    SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示, [公式] 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

    在推导之前,先给出一些定义。假设给定一个特征空间上的训练数据集

    [公式]

    其中, [公式] , [公式] , [公式] 为第 [公式] 个特征向量, [公式] 为类标记,当它等于+1时为正例;为-1时为负例。再假设训练数据集是线性可分的。

    几何间隔:对于给定的数据集 [公式] 和超平面 [公式] ,定义超平面关于样本点 [公式]的几何间隔为

    [公式]

    超平面关于所有样本点的几何间隔的最小值为

    [公式]

    实际上这个距离就是我们所谓的支持向量到超平面的距离。

    根据以上定义,SVM模型的求解最大分割超平面问题可以表示为以下约束最优化问题

    [公式]

    [公式]

    将约束条件两边同时除以 [公式] ,得到

    [公式]

    因为 [公式] 都是标量,所以为了表达式简洁起见,令

    [公式]

    [公式]

    得到

    [公式]

    又因为最大化 [公式] ,等价于最大化 [公式] ,也就等价于最小化 [公式] ( [公式] 是为了后面求导以后形式简洁,不影响结果),因此SVM模型的求解最大分割超平面问题又可以表示为以下约束最优化问题

    [公式]

    [公式]

    这是一个含有不等式约束的凸二次规划问题,可以对其使用拉格朗日乘子法得到其对偶问题(dual problem)。

    首先,我们将有约束的原始目标函数转换为无约束的新构造的拉格朗日目标函数

    [公式]

    其中 [公式] 为拉格朗日乘子,且 [公式] 。现在我们令

    [公式]

    当样本点不满足约束条件时,即在可行解区域外:

    [公式]

    此时,将 [公式] 设置为无穷大,则 [公式] 也为无穷大。

    当满本点满足约束条件时,即在可行解区域内:

    [公式]

    此时, [公式] 为原函数本身。于是,将两种情况合并起来就可以得到我们新的目标函数

    [公式]

    于是原约束问题就等价于

    [公式]

    看一下我们的新目标函数,先求最大值,再求最小值。这样的话,我们首先就要面对带有需要求解的参数 [公式] 和 [公式] 的方程,而 [公式] 又是不等式约束,这个求解过程不好做。所以,我们需要使用拉格朗日函数对偶性,将最小和最大的位置交换一下,这样就变成了:

    [公式]

    要有 [公式] ,需要满足两个条件:

    ① 优化问题是凸优化问题

    ② 满足KKT条件

    首先,本优化问题显然是一个凸优化问题,所以条件一满足,而要满足条件二,即要求

    [公式]

    为了得到求解对偶问题的具体形式,令 [公式] 对 [公式] 和 [公式] 的偏导为0,可得

    [公式]

    [公式]

    将以上两个等式带入拉格朗日目标函数,消去 [公式] 和 [公式] , 得

    [公式]

    [公式]


    [公式]

    求 [公式] 对 [公式] 的极大,即是对偶问题

    [公式]

    [公式]

    [公式]

    把目标式子加一个负号,将求解极大转换为求解极小

    [公式]

    [公式]

    [公式]

    现在我们的优化问题变成了如上的形式。对于这个问题,我们有更高效的优化算法,即序列最小优化(SMO)算法。这里暂时不展开关于使用SMO算法求解以上优化问题的细节,下一篇文章再加以详细推导。

    我们通过这个优化算法能得到 [公式] ,再根据 [公式] ,我们就可以求解出 [公式] 和 [公式] ,进而求得我们最初的目的:找到超平面,即”决策平面”。

    前面的推导都是假设满足KKT条件下成立的,KKT条件如下

    [公式]

    另外,根据前面的推导,还有下面两个式子成立

    [公式]

    [公式]

    由此可知在 [公式] 中,至少存在一个 [公式] (反证法可以证明,若全为0,则 [公式] ,矛盾),对此 [公式] 有

    [公式]

    因此可以得到

    [公式]

    [公式]

    对于任意训练样本 [公式] ,总有 [公式] 或者 [公式] 。若 [公式] ,则该样本不会在最后求解模型参数的式子中出现。若 [公式] ,则必有 [公式] ,所对应的样本点位于最大间隔边界上,是一个支持向量。这显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。

    到这里都是基于训练集数据线性可分的假设下进行的,但是实际情况下几乎不存在完全线性可分的数据,为了解决这个问题,引入了“软间隔”的概念,即允许某些点不满足约束

    [公式]

    采用hinge损失,将原优化问题改写为

    [公式]

    [公式]

    [公式]

    其中 [公式] 为“松弛变量”, [公式] ,即一个hinge损失函数。每一个样本都有一个对应的松弛变量,表征该样本不满足约束的程度。 [公式] 称为惩罚参数, [公式] 值越大,对分类的惩罚越大。跟线性可分求解的思路一致,同样这里先用拉格朗日乘子法得到拉格朗日函数,再求其对偶问题。

    综合以上讨论,我们可以得到线性支持向量机学习算法如下:

    输入:训练数据集 [公式] 其中,[公式], [公式] ;

    输出:分离超平面和分类决策函数

    (1)选择惩罚参数 [公式] ,构造并求解凸二次规划问题

    [公式]

    [公式]

    [公式]

    得到最优解 [公式]

    (2)计算

    [公式]

    选择 [公式] 的一个分量 [公式] 满足条件 [公式] ,计算

    [公式]

    (3)求分离超平面

    [公式]

    分类决策函数:

    [公式]

     

    非线性SVM算法原理

    对于输入空间中的非线性分类问题,可以通过非线性变换将它转化为某个维特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。由于在线性支持向量机学习的对偶问题里,目标函数和分类决策函数都只涉及实例和实例之间的内积,所以不需要显式地指定非线性变换,而是用核函数替换当中的内积。核函数表示,通过一个非线性转换后的两个实例间的内积。具体地, [公式] 是一个函数,或正定核,意味着存在一个从输入空间到特征空间的映射 [公式] ,对任意输入空间中的 [公式] ,有

    [公式]

    在线性支持向量机学习的对偶问题中,用核函数 [公式] 替代内积,求解得到的就是非线性支持向量机

    [公式]

    综合以上讨论,我们可以得到非线性支持向量机学习算法如下:

    输入:训练数据集 [公式] 其中,[公式], [公式] ;

    输出:分离超平面和分类决策函数

    (1)选取适当的核函数 [公式] 和惩罚参数 [公式] ,构造并求解凸二次规划问题

    [公式]

    [公式]

    [公式]

    得到最优解 [公式]

    (2)计算

    选择 [公式] 的一个分量 [公式] 满足条件 [公式] ,计算

    [公式]

    (3)分类决策函数:

    [公式]

     

    介绍一个常用的核函数——高斯核函数

    [公式]

    对应的SVM是高斯径向基函数分类器,在此情况下,分类决策函数为

    [公式]

     

    参考

    [1]《统计学习方法》 李航

    [2]《机器学习》周志华

    [3]Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM Jack-Cui

    [4]深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    [5]支持向量机通俗导论(理解SVM的三层境界)

    [6]Support Vector Machines for Classification

  • 相关阅读:
    罗马数字转整数
    对称的二叉树
    python中列表,元组,字符串 互相转换
    python django 批量上传文件并绑定对应文件的描述
    python django mkdir和makedirs的用法
    python 获取两位的月份(09)和天数(09)
    django 注册后台管理 在debug=true能行,在debug=false不能显示出管理标签
    django OperationalError: unable to open database file 创建数据库
    网站安全保证设置及网站认证
    动态的有序分类导航:每个一级标题下都有多个二级标题。
  • 原文地址:https://www.cnblogs.com/klausage/p/12575064.html
Copyright © 2011-2022 走看看