读书笔记│支持向量机(SVM)算法及应用

Posted 老薛带你学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读书笔记│支持向量机(SVM)算法及应用相关的知识,希望对你有一定的参考价值。

1、简介

本期所介绍的支持向量机模型是截止到目前为止我们介绍的第三个分类算法。在进入正题之前,我们首先回忆一下前两个分类算法:第一期的k-近邻(kNN,k-Nearest Neighbors)算法与第二期的决策树(decision tree)算法。

① kNN:找出与未知样本x距离最近的k个训练样本,看这k个样本中多数属于哪一类,就把x归为那一类。

其模型的重要参数有:K值及距离的定义;

优点:易于理解和实现;

缺点:计算量大,复杂度高,不适合实时场景。

② 决策树:是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。

模型重要参数:树的高度;

优点:超强的学习能力和泛化能力,训练速度快;

缺点:易过拟合,改进为随机森林(Random Forest, RF)。


本期所介绍的支持向量机,是通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。由简至繁的模型包括:

① 当训练样本线性可分时,通过硬间隔最大化,学习线性可分支持向量机;

② 当训练样本线性不可分时,通过核技巧和软间隔最大化,学习非线性支持向量机

③ 当训练样本近似线性可分时,通过软间隔最大化,学习线性支持向量机;

接下来我们按照这样的顺序对支持向量机的原理进行简单介绍:


2. 原理

2.1 线性可分支持向量机

首先考虑线性可分支持向量机。给定训练样本集D=(x1,y1),(x2,y2),⋯,(xm,ym),其中yi∈{−1,+1}。分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开。直观看上去,能将训练样本分开的划分超平面有很多,但应该去找位于两类训练样本“正中间”的划分超平面(间隔最大),即下图中红线,因为该划分超平面对训练样本局部扰动的“容忍”性最好。例如,由于训练集的局限性或者噪声的因素,训练集外的样本可能比训练样本更接近两个类的分隔界,这将使许多划分超平面出现错误;而红色超平面的影响最小,简言之,这个划分超平面所产生的结果是鲁棒性的。

如果一个线性函数能够将样本分开,称这些数据样本是线性可分的。那么什么是线性函数呢?其实很简单,在二维空间中就是一条直线,在三维空间中就是一个平面,以此类推,如果不考虑空间维数,这样的线性函数统称为超平面。我们看下图一个简单的二维空间的例子,O代表正类,X代表负类,样本是线性可分的,但是很显然不只有一条直线可以将样本分开,而是有无数条,我们所说的线性可分支持向量机就对应着能将数据正确划分并且间隔最大的直线。

读书笔记(9)│支持向量机(SVM)算法及应用

在样本空间中,划分超平面可通过如下线性方程来描述:WTx+b=0。其中w为法向量,决定了超平面的方向,b为位移量,决定了超平面与原点的距离。 如下图所示,距离超平面最近的这几个样本点被称为“支持向量”。两条虚线间的距离称为间隔。(具体推导过程参见https://blog.csdn.net/qq_35992440/article/details/80987664)

读书笔记(9)│支持向量机(SVM)算法及应用

SVM的思想是使得间隔最大化,也就是

读书笔记(9)│支持向量机(SVM)算法及应用

等价于

读书笔记(9)│支持向量机(SVM)算法及应用

该基本型是一个凸二次规划问题,可以采用拉格朗日乘子法对其对偶问题求解求解,拉格朗日函数:

读书笔记(9)│支持向量机(SVM)算法及应用

对W,b求导并带回此方程,原问题就转换为如下关于alpha的问题:


读书笔记(9)│支持向量机(SVM)算法及应用

解出 alpha 之后,可以求得 w, 进而求得b,可以得到:

读书笔记(9)│支持向量机(SVM)算法及应用

该过程的KTT条件为:

读书笔记(9)│支持向量机(SVM)算法及应用

对于任意的训练样本 (xi,yi),

① 若 alphai=0,则其不会在公式(13)中的求和项中出现,也就是说,它不影响模型的训练;

② 若 alphai>0,则yif(xi)−1=0,即该样本一定在边界上,是一个支持向量。

这里显示出了支持向量机的重要特征:当训练完成后,大部分样本都不需要保留,最终模型只与支持向量有关。


2.2 非线性支持向量机和核函数

事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM如何处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。

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

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用

线性不可分映射到高维空间,可能会导致维度大小高到可怕的(19维乃至无穷维的例子),导致计算复杂。核函数的价值在于它虽然也是讲特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。

与上述的推导过程类似,通过使用核函数的概念,目标函数和约束可以写成:


读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用

这里的函数 κ(xi,xj)就是核函数,我们可以把核函数想象成一个包装器(wrapper)或者接口(interface),它能把数据从某个特征空间映射到另一个特征空间,在新的特征空间,我们可以很容易地利用已有的工具对数据进行处理。经过空间转换之后,我们可以在高维空间中解决线性问题,这也就等价于在低维空间中解决非线性问题。SVM优化中一个特别好的地方就是,所有的运算都可以写成内积(inner product,也称点积)的形式。向量的内积指的是两个向量相乘,之后得到单个标量或者数值。我们可以把内积运算替换成核函数,而不必做简化处理。将内积替换成核函数的方式被称为核技巧(kernel trick)或者核“变电”(kernel substation)。径向基函数是SVM中常用的一个核函数。径向基函数是一个采用向量作为自变量的函数,能够基于向量距离运算输出一个标量。这个距离可以是从<0,0>向量或者其它向量开始计算的距离。我们会使用到径向基函数的高斯版本,其具体公式为:

读书笔记(9)│支持向量机(SVM)算法及应用

其中σ是用户定义的用于确定到达率(reach)或者说函数值跌落到0的速度参数。上述高斯核函数将数据从其特征空间映射到更高维的空间,具体来说这里是映射到一个无穷维的空间。支持向量的数目存在一个最优值。SVM的优点在于它能对数据进行高效分类。如果支持向量太少,就可能会得到一个很差的决策边界;如果支持向量太多,也就相当于每次都利用整个数据集进行分类,也就退化成了我们第一期所介绍的k近邻。


2.3 线性支持向量机(软间隔支持向量机)与松弛变量

在前面的讨论中,我们假设训练样本在样本空间或者特征空间中是线性可分的,但在现实任务中往往很难确定合适的核函数使训练集在特征空间中线性可分,退一步说,即使恰好找到了这样的核函数使得样本在特征空间中线性可分,也很难判断是不是由于过拟合造成。例如下图:

读书笔记(9)│支持向量机(SVM)算法及应用


用黑圈圈起来的那个蓝点是一个噪音点,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的,但是由于这个点的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时间隔也相应变小了。当然,更严重的情况是,如果这个点再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。

为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该点偏离的距离,如果把它移动回来,就刚好落在原来的 超平面 蓝色间隔边界上,而不会使得超平面发生变形了。这时我们就可以通过引人松弛变量,来允许有些数据点可以处于分隔面的错误一侧,此时优化目标和新约束条件为

读书笔记(9)│支持向量机(SVM)算法及应用

与上述介绍类似,此处不再进行赘述,有兴趣的同学可自行前往:https://blog.csdn.net/v_july_v/article/details/7624837


3.SMO高效优化算法

1996年,John Platt开发了一个称为SMO的强大算法,用于训练SVM。SMO全称序列最小优化(Sequential Minimal Optimization ),目标是求出一系列α和b, 一旦求出了这些α, 就很容易计算出w,并得到分隔超平面。受篇幅限制,关于SMO算法的基本思想可参考:http://blog.sina.com.cn/s/blog_62970c250102xfok.html


4.算法实现及函数说明

4.1 简化版SMO算法

在介绍完整版的SMO算法之前,我们首先来了解一下代码较少的简化版SMO算法,在完整版的算法中,外循环算法要确定要优化的最佳alpha对,但是简化版通过遍历每一个alpha与随机选择另一个alpha,从而跳过了这一步骤,使得其执行速度比较慢。首先我们构建三个辅助函数,第一个用于打开文件;第二个用于在某个区间范围内随机选择一个整数;第三个用于在数值太大时对其进行调整。

读书笔记(9)│支持向量机(SVM)算法及应用

上述工作完成后,就可以使用SMO的简化版算法了,该函数的伪代码大致如下:

创建一个alpha向量并将其初始化为0向量

当迭代次数小于最大迭代次数时(外循环):

    对数据集中的每个数据向量(内循环):

        如果该数据向量可以被优化:

            随机选择另外一个数据向量

            同时优化这两个向量

        如果两个向量都不能被优化,退出内循环

如果所有向量都没被优化,增加迭代数目,继续下一次循环

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用

为了解实际效果,可以运行如下命令,运行后将输出类似如下的结果:

读书笔记(9)│支持向量机(SVM)算法及应用

运行结束后,可对结果进行观察,我们可以得到b的值、alphas中非零元素以及支持向量的具体信息。

读书笔记(9)│支持向量机(SVM)算法及应用

4.2 完整版SMO算法

在几百个点组成的小规模数据及上,简化版SMO算法的运行时没有什么问题的,但是在更大的数据及上的运行速度就会变得很慢,接下来我们讨论完整版的platt SMO算法。在这两个版本中,实现alpha的更改和代数优化的环节一模一样。在优化过程中,唯一的不同点在于选择alpha的方式。完整版的platt SMO算法应用了一些能够加快提速的启发式方法。Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替:一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描。而所谓非边界alpha指的就是那些不等于边界0或C的alpha值。对整个数据集的扫描相当容易,而实现非边界alpha值的扫描时,首先需要建立这些alpha值的列表,然后再对这个表进行遍历。同时,该步骤会跳过那些已知的不会改变的alpha值。在选择第一个alpha值后,算法会通过一个内循环来选择第二个alpha值。在优化过程中,会通过最大化步长的方式来获得第二个alpha值。在简化版SMO算法中,我们会在选择j之后计算错误率Ej。但在完整版SMO算法中,我们会建立一个全局的缓存用于保存误差值,并从中选择使得步长或者说Ei-Ej最大的alpha值。常数C给出的是不同优化问题的权重。常数C一方面要保障所有样例的间隔不小于1.0,另一方面又要使得分类间隔尽可能地大,并且要在这两方面之间平衡。如果C很大,那么分类器将力图通过分隔超平面对所有的样例都正确。如果数据集非线性可分,就会发现支持向量会在超平面附近聚集成团。计算得到的alpha大部分为0,而非0alpha所对应的向量就是支持向量。

同样的,我们首先要对给出几个支持函数,包含一个用于清理代码数据结构的辅助函数和三个用于对E进行缓存的辅助函数。

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用


接下来介绍一下用于寻找决策便捷的优化例程。这里的代码与简易版的函数几乎一模一样,但是这里的代码使用了自己的数据结构,在结构在oS中传递。

读书笔记(9)│支持向量机(SVM)算法及应用

接下来是将上述过程打包在一起的算法,也就是选择第一个alpha值的外循环。此外,计算出alpha的值之后,如何利用他们进行分类呢?接下里的calcWs函数实现了基于alpha得到超平面(包括w的计算)的任务。

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用

4.3 在复杂数据上应用核函数

下面我们介绍核函数的概念以及他们在支持向量机中的使用方法。然后介绍一种最流行的核函数——径向基函数(radial bias function),并将该核函数应用于前面得到的分类器。

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用


5、应用举例

考虑这样一个场景。你的老板过来对你说:“之前基于KNN的那个手写数字识别程序非常好,但是占用的内存太大了,顾客不能通过无线的方式下载我们的应用。我们必须在保持其性能不变的同时,使用更少的内存,你能不能赶紧解决下这个问题?”如果你还在纠结如果改进时,我们推荐你试试支持向量机算法。利用k-近邻算法(kNN)实现的手写数字识别系统,虽然数字识别效果不错,但是需要保留所有的训练样本。而对于支持向量机来说,其需要保留的样本少了很多(实际上只需要保留支持向量),但能获得可比的效果。那么,如何用SVM来实现手写数字识别呢?简化起见,这里我们只考虑SVM的二分类问题,所以我们只使用手写数字识别数据集中的1和9数据:如果为9,则输出-1;为1,则输出+1。

读书笔记(9)│支持向量机(SVM)算法及应用
读书笔记(9)│支持向量机(SVM)算法及应用

输入命令testDigits(('rbf',20)),可得到类似于以下的结果:


责编 | 薛 申 栾

以上是关于读书笔记│支持向量机(SVM)算法及应用的主要内容,如果未能解决你的问题,请参考以下文章

支持向量机(SVM):超平面及最大间隔化支持向量机的数学模型软间隔与硬间隔线性可分支持向量机线性支持向量机非线性支持向量机核函数核函数选择SMO算法SVM vs LR优缺点

[笔记]关于支持向量机(SVM)中 SMO算法的学习理论总结

机器学习算法笔记4. 支持向量机(SVM)

机器学习笔记支持向量机(SVM)

class-支持向量机SVM全析笔记

支持向量机算法