什么是SVM


SVM是Support Vector Machine(支持向量机)的英文缩写,是上世纪九十年代兴起的一种机器学习算法,在目前神经网络大行其道的情况下依然保持着生命力。有人说现在是神经网络深度学习的时代了,AI从业者可以不用了解像SVM这样的古董了。姑且不说SVM是否真的已经没有前途了,仅仅是SVM在数学上优美的推导就值得后来者好好欣赏一番,这也是笔者迄今为止见过机器学习领域最优美的数学推导。

和大多数二分类算法一样,SVM算法也是致力于在正例和反例之间找出一个超平面来将它们区分开来,如下图所示:

 
图1

如图所示,正例用“+”号表示,反例用“-”号表示。从图中可以看出,正例和反例是线性可分的。学习器的目的就是要学出一条如图所示的红色超平面将正例和反例区分开来。这也是其他非SVM分类器的共同目标,即:

 
 

而SVM与其它分类器所不同的是它引入了“支持向量”这一概念,反映到图中也就是红色的小点所代表的向量。(注:由于笔者作图时采用的SVM是软间隔的版本,因此支持向量不像是大多数教科书上采用硬间隔的SVM那样)由SVM的优化目标我们可以知道:样本空间中任意一个点x到该超平面的的距离可写为:

 
 

假设超平面可以完全正确地将所有样本分类,则对于任意一个样本(xi,yi)来说都有如下性质(注:样本的标签用+1代表正例,-1代表反例):

 
 

训练样本中使上式成立的样本称为支持向量,两个异类支持向量到超平面距离之和为:

 
 

上式被称为“间隔”。SVM的优化目标是为了找到这样一个划分超平面,该超平面能使间隔最大化,则SVM的优化目标可以表示为如下形式:

 
 

这就是SVM的基本数学表达,接下来就要对SVM问题进行求解。从上面的数学形式可以看出这是一个优化问题,可以使用拉格朗日乘子法求解其对偶问题。由于本文不是专门介绍SVM的,因此忽略掉具体的推导,直接给出SVM的对偶问题表达:

 
 

由于采用了拉格朗日乘子法,因此该对偶问题还有一个KKT条件约束,即要求:

 
 

以上,就是SVM的一些相关介绍。需要特别说明的是,以上的推导都是建立在“硬间隔”的基础上,“硬间隔”要求样本集中每一个样本都满足约束条件。在现实中往往很难确定合适的核函数使得训练样本在特征空间中是线性可分的,缓解该问题的一个办法是允许支持向量机在一些样本上出错,为此引入“软间隔”的概念。具体来说,“硬间隔”要求所有参与训练的样本都必须满足SVM的约束条件,而“软间隔”允许有部分样本不满足这样的约束。由于本文不是专门论述SVM的,因此就不展开讲“软间隔”所带来的一些新的问题,只说一下“软间隔”条件下新的优化目标:

 
 

KKT条件为:

 
 

其中,C为容忍度因子,可以理解为SVM对“软间隔”的支持度。若C为无穷大,则所有的训练样本均必须满足SVM的约束条件,C值越小就允许越多的样本不满足约束条件。

SMO算法思想


通过观察SVM的优化目标我们可以发现其最终的目的是要计算出一组最优的alpha和常数项b的值。SMO算法的中心思想就是每次选出两个alpha进行优化(之所以是两个是因为alpha的约束条件决定了其与标签乘积的累加等于0,因此必须一次同时优化两个,否则就会破坏约束条件),然后固定其他的alpha值。重复此过程,直到达到某个终止条件程序退出并得到我们需要的优化结果。接下来,就具体推导一下SMO算法的细节。

算法数学推导


由于SVM中有核函数的概念,因此我们用Kij来表示在核函数K下向量i和向量j的计算值。现在假定我们已经选出alpha1和alpha2两个待优化项,然后将原优化目标函数展开为与alpha1和alpha2有关的部分和无关的部分:

 
 

其中c是与alpha1和alpha2无关的部分,在本次优化中当做常数项处理。由SVM优化目标函数的约束条件:

 
 

可以得到:

 
 

将优化目标中所有的alpha1都替换为用alpha2表示的形式,得到如下式子:

 
 

此时,优化目标中仅含有alpha2一个待优化变量了,我们现在将待优化函数对alpha2求偏导得到如下结果:

 
 

已知:

 
 

将以上三个条件带入偏导式子中,得到如下结果:

 
 

化简后得:

 
 

记:

 
 

若n<=0则退出本次优化,若n>0则可得到alpha2的更新公式:

 
 

此时,我们已经得到了alpha2的更新公式。不过我们此时还需要考虑alpha2的取值范围问题。因为alpha2的取值范围应该是在0到C之间,但是在这里并不能简单地把取值范围限定在0至C之间,因为alpha2的取值不仅仅与其本身的范围有关,也与alpha1,y1和y2有关。设alpha1*y1+alpha2*y2=k,画出其约束,在这里要分两种情况,即y1是否等于y2。我们在这里先来考虑y1!=y2的情况:在这种情况下alpha1-alpha2=k:

 
图2

可以看出此时alpha2的取值范围为:

 
 

当y1=y2时,alpha1+alpha2=k:

 
图3

可以看出此时alpha2的取值范围为:

 
 

以上,可以总结出alpha2的取值上下界的规律:

 
 

故可得到alpha2的取值范围:

 
 

由alpha_old1y1+alpha_old2y2=alpha_new1y1+alpha_new2y2可得alpha1的更新公式:

 
 

接下来,需要确定常数b的更新公式,在这里首先需要根据“软间隔”下SVM优化目标函数的KKT条件推导出新的KKT条件,得到结果如下:

 
 

由于现在alpha的取值范围已经限定在0至C之间,也就是上面KKT条件的第三种情况。接下来我们将第三种KKT条件推广到任意核函数的情境下:

 
 

由此我们可以得到常数b的更新公式:

 
 

其中Ei是SVM的预测误差,计算式为:

 
 

以上,笔者就已经把SMO算法的大部分细节推导出来了。接下来,我们可以根据这些推导对SMO算法进行实现,并且用我们的算法训练一个SVM分类器。

SMO的算法实现


SMO算法的实现还是比较复杂的,有很多细节,我们不用一一关注,只用抓住其中两个特别重要的点就行了:1、如何选取每次迭代的alpha对;2、如何确定SVM优化程序的退出条件。笔者将就这两个主要问题进行论述。首先关注第一个问题:如何选取alpha对。

我们可以简化一下第一个问题:假定现在已经选取了第一个待优化的alpha,如何选取另一个alpha?在SMO算法中为了让迭代次数尽量少,收敛速度尽量快,算法要求我们选取的两个alpha有尽可能大的“差异”。在算法的实现中我们用预测的误差值来表征一个alpha的效果。那么两个aplha尽可能不同反映在算法上就是两个alpha所对应的预测误差值之差的绝对值最大,该思想用代码表现出来如下图所示:

 
图4

上面的代码反映出了这样一种思想:首先传入第一个alpha所对应的索引值“i”,然后搜索误差列表eCache,在其中找到与“i”所对应的误差值相差绝对值最大的那个索引值“j”,则另一个alpha的索引值就定为“j”。若误差值列表eCache还没有初始化则从所有的索引值中随机选取一个索引值作为另一个alpha的索引值。

那么第一个alpha如何选取呢?这个问题与另外两个问题是相关的:第一个问题是选取的alpha值是否违反KKT条件,如果该alpha值违反了KKT条件则该alpha是不能够作为优化对象的;第二个问题与SMO优化算法的优化终止条件有关,通常SMO算法会在一个死循环中反复执行两个过程,第一个过程是遍历所有的alpha值,每扫描到一个alpha就将其作为alpha对的第一个值传入内循环,同时根据上一段提出的选取准则选择另一个alpha。遍历完一次alpha值之后若alpha值被优化器改变的次数不为0则本次循环结束同时修改一些标志量然后进入下一次循环。下一次循环执行第二个过程:遍历alpha值列表中所有不为0的值,每扫描到一个不为0的alpha值之后就将其传入内循环,然后执行和上面相同的过程。重复执行上述过程,最终,当某次循环遍历优化所有alpha列表后却没有一个alpha值被优化器改变则程序认为优化任务完成了,程序退出。代码如下:

 
图5

以上,就是SMO算法在实现时的一些细节。完整的SMO实现还是比较复杂的,有很多的小细节需要注意,在这里就不一一论述了。

Sequential Minimal Optimization(SMO,序列最小优化算法)初探的更多相关文章

  1. 【机器学习】支持向量机(SVM)的优化算法——序列最小优化算法(SMO)概述

    SMO算法是一一种启发式算法,它的基本思路是如果所有变量的解的条件都满足最优化问题的KKT条件,那么这个最优化问题的解就得到了.因为KKT条件是该优化问题的充分必要条件. 整个SMO算法包括两个部分: ...

  2. sequential minimal optimization,SMO for SVM, (MATLAB code)

    function model = SMOforSVM(X, y, C ) %sequential minimal optimization,SMO tol = 0.001; maxIters = 30 ...

  3. Sequential Minimal Optimization (SMO) 算法

    SVM 最终关于 $a$ 目标函数为凸优化问题,该问题具有全局最优解,许多最优化算法都可以解决该问题,但当样本容量相对很大时,通常采用 SMO 算法(比如 LIBSVM),该算法为启发式算法,考虑在约 ...

  4. SMO序列最小最优化算法

    SMO例子: 1 from numpy import * 2 import matplotlib 3 import matplotlib.pyplot as plt 4 5 def loadDataS ...

  5. Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines 论文研读

    摘要 本文提出了一种用于训练支持向量机的新算法:序列最小优化算法(SMO).训练支持向量机需要解决非常大的二 次规划(QP)优化问题.SMO 将这个大的 QP 问题分解为一系列最小的 QP 问题.这些 ...

  6. SMO优化算法(Sequential minimal optimization)

    原文:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html SMO算法由Microsoft Research的John C. ...

  7. Jordan Lecture Note-8: The Sequential Minimal Optimization Algorithm (SMO).

    The Sequential Minimal Optimization Algorithm (SMO) 本文主要介绍用于解决SVM对偶模型的算法,它于1998年由John Platt在论文“Seque ...

  8. 序列最小最优化算法(SMO)-SVM的求解(续)

    在前一篇文章中,我们给出了感知器和逻辑回归的求解,还将SVM算法的求解推导到了最后一步,在这篇文章里面,我们将给出最后一步的求解.也就是我们接下来要介绍的序列最小最优化算法. 序列最小最优化算法(SM ...

  9. Support Vector Machine (2) : Sequential Minimal Optimization

    目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...

随机推荐

  1. yum 系列(一) yum 和 rpm 常用命令

    yum 系列(一) yum 和 rpm 常用命令 一.yum 常用命令 yum 命令:http://man.linuxde.net/yum yum 是在 Fedora 和 RedHat 以及 SUSE ...

  2. Caffe 议事(一):从零开始搭建 ResNet 之 残差网络结构介绍和数据准备

    声明:Caffe 系列文章是我们实验室 黄佳斌 大神所写的内部学习文档,已经获得他的授权允许. 本参考资料是在 Ubuntu14.04 版本下进行,并且默认 Caffe 所需的环境已经配置好,下面教大 ...

  3. Appium自动化测试-iOS

    Appium的哲学 我们相信,对原生应用的自动化测试,应当不必要包含其他的SDK组件或者特别编译您的App,并且应当可以选择任何您喜欢的测试方法,框架和工具.基于这些出发点我们开发了Appium.现在 ...

  4. express4.x Request对象获得参数方法小谈【原创】

    最近看完慕课网 “node.js 建站攻略”后, 对mongodb 操作有了进一步认识, 为了进一步巩固该数据库知识, 于是使用学到的知识搭建一个最简单的mongoDemo. 搭建完成后已放到Gith ...

  5. Hadoop各个组件与端口

    组件 Daemon 端口 配置 说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传输 HDFS DataNode 50075 ...

  6. ASP.NET Core学习指导

    ASP.NET Core 学习指导 "工欲善其事必先利其器".我们在做事情之前,总应该做好充分的准备,熟悉自己的工具.就像玩游戏有一些最低配置一样,学习一个新的框架,也需要有一些基 ...

  7. IIS服务器添加网站

    1.添加IIS服务:对“我的电脑”右键,管理,点击服务和应用程序,如果下面没有”Internet Information Services(IIS)管理器“,打开控制面板,点击程序,启用或者关闭Win ...

  8. FIM控制同步用户

     C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\UIShell 这个路径下,你如果懂FIM,可以进去看看 ...

  9. 数据库路由中间件MyCat - 源代码篇(4)

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2. 前端连接建立与认证 Title:MySql连接建立以及认证过程client->MySql:1.T ...

  10. shell脚本报错:-bash: xxx: /bin/bash^M: bad interpreter: No such file or directory

    当我们把文件从windows系统中编辑的文件拷贝到linux系统中,如果我们执行文件会保存如下的错: shell脚本报错:-bash: xxx: /bin/bash^M: bad interprete ...