鸣谢

本文引用了下列文章或书籍
1.《机器学习》俗称西瓜书,作者:周志华
2.用讲故事的办法帮你理解SMO算法
3.吴恩达CS299课堂资料


说到支持向量机,首先得介绍一些基础知识,现在开始。


凸集

凸集定义:集合C内任意两点连成的线段(注意和仿射集的区别)都在集合C内,则C为凸集。
举个例子:
支持向量机详解(SVM)

显然上图中,左图是凸集,右边那个像肾一样的肯定不是凸集~

凸包

凸包定义:包含集合C的最小凸集,为集合C的凸包。
支持向量机详解(SVM)

仿射集

定义:通过集合内中任意两不同点的直线,该直线仍在集合内,则该集合为仿射集
感性认识:即这个集合是“平的”是“直的”,换句话说即它是“线性的”
仿射集的例子:直线,平面,超平面
显然仿射集都是凸集,凸集不一定是仿射集。

拉格朗日乘数法

假设有优化问题:
min f(x)
s.t. Fi(x)<=0 i=1,2,…,n
上述优化问题的意思是,我要求f(x)的最小值,并且有如下约数条件
1. F1(x)<=0
2. F2(x)<=0
……..
n. Fn(x)<=0
我们要求解上述优化问题,可以使用拉格朗日乘数法,即构造一个函数L,其中:
L = f(x) + ni=1λiFi(x)
然后将L对λ,x求导,使导数都为0,联立方程组可以求出原解析问题的解。

超平面

什么是超平面?听上去好像很牛逼的样子?其实是一个很简单的概念,简单点说就是:二维空间的超平面为一维直线,三维空间的超平面为二维平面…….以此类推,n维空间的n-1维仿射集为n为空间的超平面。
举个例子:
支持向量机详解(SVM)


上图就是一个二维空间的超平面,什么?这TM不是一根直线么?
支持向量机详解(SVM)


可不就是在骗你…….啊呸!可不就是一条直线么?这就是伟大的数学家的定义啊!


三维空间中的超平面就是一个空间里的平面,就像这样:
支持向量机详解(SVM)


是不是有点感觉了?没错:二维空间的超平面为一维直线,三维空间的超平面为二维平面…….以此类推,n维空间的n-1维仿射集为n为空间的超平面。


下面给出超平面的数学公式:
wTx+b=0

其中W(W1,W2,W3,W4,…..,Wn)为法向量,决定了超平面的方向。
b为位移项,决定了超平面在方向上的“位置”。
是不是有一点抽象,不用怕,我们继续用二维空间来举例子。
支持向量机详解(SVM)
图中的两条直线分别为:
X1+X2+1=0和X1+X2+2=0
对照上面的公式,发现:
W1=W2=(1,1)
b1=1
b2=2
按照定义,W为法向量,我们来画一画试试:
支持向量机详解(SVM)


哎哟卧槽?还真是法向量!怎么样?老夫没有忽悠你吧?


接下来看b,很容易发现这两条直线是平行的,唯一不同的就是这两条直线在它们的法向量的方向的“位置”不同,没错,这个b就是直线在它的法向量上的“位置”。


先导知识介绍完毕了,现在开始正戏。


支持向量机(SVM)基本模型

老规矩,没有图我说个J8,先来看一张图:
支持向量机详解(SVM)
先忽略掉图中绿色的两根线,暂时不管它。
很明显图中有+和-两种类别的样本,我们现在要想一个办法,找一个超平面,来把它分成两个类别,图中划了好多个超平面,都能达到我们的目的。
但是,有这么多超平面,只有一个才是我们要选择的,其实大家心里都有一杆秤,只要你不是太奇葩,总会觉得那根“最粗最大”的超平面才是我们想要的。
但是为啥我们要选择那个超平面呢?难道是因为它“最粗最大”?放肆! 老夫是那么肤浅的人吗?
没错,那个“最粗最大”的超平面看起来最顺眼,为啥最顺眼,因为它正好在两个类别的“中间”啊!它划分的最平均啊,选择他的话能够尽量减少划分错误的可能性,因为它不会偏向两边任何一个类,用它来分类最“公正”。换而言之,用它来划分结果是最鲁棒的。


好!就决定是你了!“粗大君”!我们设这个“粗大”的超平面为:
wTx+b=0
它可以将空间分成两类:
1.wTx+b>0
2.wTx+b<0
是不是被老夫精妙的操作给震慑住了?
支持向量机详解(SVM)
我来解释一下,如图所示(该图只是举个例子,具体数值没有意义),超平面将二维空间分成了红色和蓝色两类:
支持向量机详解(SVM)


好了,这下总算有个如何分类的方针了,可是最重要的事情还没讲呢!那就是这个划分类型的超平面该如何确定呢?回到这张图:
支持向量机详解(SVM)


生成两个样本集合的凸包,然后在凸包的支持向量上做切线,找到其中两个切线平行方向相反距离最大的那对切线,就是图中这两条虚线。然后找到这两个虚线“中间”的那个超平面(也就是这两条直线的垂线的垂直平分线)就是图中的实线。


那么问题来了,如何保证存在平行切线?
答:使数据集线性可分。
如何使数据线性可分呢?答案就是核函数。
核函数在后面提。


现在我们已经找到了,两条虚线(凸包的切线):

{wTxi+b>=+1,yi=+1wTxi+b<=1,yi=1

归纳一下就是:
yi(wTxi+b)>=+1
这个公式的意思就是:
当第i个样本的特征xi带入公式大于等于1的时候分为正类,也就是图中的“+”类
当第i个样本的特征xi带入公式小于等于-1的时候分为负类,也就是图中的“-”类


那么为什么一定是1呢?这个1和-1是缩放得到的,其实原式应该写为:
wTxi+b>=+δδR
wTxi+b<=δδR
由于wTx+b=0是垂直平分线,所以两边的距离是相等的,所以等式右边可以保证绝对值相等。又因为等式右边为0,所以可以任意缩放。


如图所示,距离超平面最近的几个点正好在虚线对应的超平面上,也就是样本中可以让这两个不等式取“等号”的点。
于是数学家们给这几个点取了一个牛逼的名字,即“支持向量”,而这两条虚线的距离为
γ=2||w||
我知道肯定有的同学不知道这个分数下面的||w||是啥意思,不要着急,容老夫慢慢道来。
想必各位高中都学过平行直线距离公式吧,什么?忘了?没关系,让老夫来帮你回忆回忆。
设两条直线公式分别为:
Ax1+Bx2+C1=0
Ax1+Bx2+C2=0
那么这两条直线的距离公式为:
|C1C2|A2+B2
带入上面这个公式:γ=2||w||
是不是发现了|C1-C2|=2,而下面的||w||=A2+B2
好了,现在来解释这个||w||就轻松多了,假设w为一个向量(w1,w2,….,wn)那么||w||=w21+w22+...+w2n,称为w的范数。


言归正传,这两个虚线的距离被称作“间隔”,很直观的理解就是把两个划分开的“间隔”,显然要分类效果尽可能的好的话,这个“间隔”就要尽可能的大!而要让这个“间隔”尽可能的大,就要让这个γ尽可能的大,换而言之就是要让处于分母位置的||w||尽可能的小,也就是让||w||²尽可能的小。于是我们得到了支持向量机的基本模型:
min 12||w||2
s.t. yi(wTxi+b>=1) ,i=1,2,….,m


求解支持向量机基本模型

看到这个优化问题的样子,我们是不是第一反应就是拉格朗日乘数法!!
没有错!对支持向量机基本模型使用拉格朗日乘数法,得到如下式子:

L(w,b,α)=12||w||2+mi=1αi(1yi(wTxi+b))

然后我们用L对α,w分别求偏导,得到:
w=mi=1αiyixi
0=mi=1αiyi

将上述结果再回代入L中,得到对偶问题:
maxαmi=1αi12mi=1mj=1αiαjyiyjxTixj

此时的约束条件变成了:
s.t. mi=1αiyi=0
  αi>=0,i=1,2,...,m

解出来α之后,再求出w和b就可以得到最后的结果啦:

f(x)=i=1mαiyixTix+b

很显然,如果当x维度很高的话,这个方程会十分难解,为了避免这个问题,数学家们又想了一个歪…..哦不,高招。
我们的高招,SMO算法华丽登场!
在介绍SMO之前,我们需要介绍KKT条件。

KKT条件

首先我们有:
一般优化问题的拉格朗日乘数法:
minimize f0(x),xR
subject to
fi(x)<=0,i=1,2,....,m
hj(x)=0,  j=1,2,....,p

求出的拉格朗日函数为:
L(x,λ,v)=f0(x)+mi=1λifi(x)+pj=1vjhj(x)

该拉格朗日函数的对偶函数为:
g(λ,v)=infL(x,λ,v)=inf(f0(x)+mi=1λifi(x)+pi=1vihi(x))

若我们要通过求对偶问题的解来求原问题的解,即需要对偶函数的最大值就是原问题的最小值。即:
g(λ,v)
=inf(f0(x)+mi=1λifi(x)+pi=1vihi(x))
<= f0(x)+mi=1λifi(x)+pi=1vihi(x))
<= f0(x)

也就是要让上面两个不等式取等号。
要让第一个不等式取等号,即使x*为函数的驻点,即函数对x求导数为0
要让第一个不等式取等号,由于hi(x)=0,所以得要求λf(x)=0,所以得到如下约束:

fi(x)<=0,i=1,2,...,mhi(x)=   0,i=1,2,...,pλi  >= 0,i=1,2,...,mλifi(x)=0,i=1,2,...,mf0(x)+mi=1λifi(x)+pi=1vihi(x))=0


SMO算法

拉格朗日对偶问题我们都会解,但是一旦数据集很大的话,求解过程就会十分复杂

max

mi=1αi12mi=1mj=1αiαjyiyjxTixj

s.t.

mi=1αiyi=0
αi>=0,i=1,2,...,m

需要有一个优化的算法来求解这个复杂的问题,即SMO算法


因为直接求解超平面十分困难,我们从另外一个角度来思考问题,首先:
我们设最优超平面为g(x)。那么按照SVM的理论,如果这个g(x)是最优的分离超平面,就有:

fi(x)<=0,i=1,2,...,mhi(x)=   0,i=1,2,...,pλi  >= 0,i=1,2,...,mλifi(x)=0,i=1,2,...,mf0(x)+mi=1λifi(x)+pi=1vihi(x))=0

姑且称这个叫g(x)目标条件吧。根据已有的理论,上面的推导过程是可逆的。也就是说,只要我能找到一个α,它能满足g(x)目标条件,那么这个α就是对偶问题的最优解。


SMO算法思路
首先,初始化一个α,让它满足对偶问题的两个初始限制条件,然后不断优化它,使得由它确定的分离超平面满足g(x)目标条件,在优化的过程中始终确保它满足初始限制条件,这样就可以找到最优解。

那么如何优化α呢?
遵循如下两个基本原则:
1.每次优化时,必须同时优化α的两个分量,因为只优化一个分量的话,新的α就不再满足初始限制条件中的等式条件了。
2.每次优化的两个分量应当是违反g(x)目标条件比较多的。就是说,本来应当是大于等于1的,越是小于1违反g(x)目标条件就越多,这样一来,选择优化的两个分量时,就有了基本的标准。

于是,先选一个违反目标条件最多的α1。如何选α2呢,先给出方法:

Ei=g(xi)yi

首先,Ei为第i个样本预测的误差。
选取α2的标准就是取所有α中|E1-E2|最大的那个。
因为优化的方向是使目标函数(代价)变小的方向,所以当取了第一个α1之后,我们应该选的α2,它的误差应该与α1的误差方向相反且相差最远。比如E1是正的,我们要使优化后目标函数变小,我们最好应该选个负的E2,且越负越好。

于是这样每次只用选两个α进行优化,其它α看作定值,这样把N个解的问题,转换成了两个变量求解的问题


核函数

核函数是干嘛的?你百度半天可能都得不出结果,让老夫来好好忽悠….哦不,好好教导你吧!我们来举个例子:
支持向量机详解(SVM)
这个图上有四个点,两个“+”和两个“-”,老夫让你用一个超平面(也就是画一条直线)将它们分类,你能行吗?没错!你不行,其实老夫也不行,各大数学家也不行啊,所有人都只能画像图上那样的曲线才能达到分类的效果,当初这个问题可把数学家们愁坏了。这可咋整啊?
终于,有一个骨骼清奇的骚年想了一个高招,我们给这几个点再加一个维度不就成了?让他们到三维空间里去,不就能用一个超平面来分类了?如图所示:
支持向量机详解(SVM)
没错,单纯的给每个点加一个“Z”坐标,让他们从二维的变成三维的,这就是一种十分简单的核函数。
现在你们知道核函数是干嘛了的吧,没错,就是将低维线性不可分的数据映射到高维,从而使它们线性可分的”函数”。
常用的几个比较牛逼的核函数如下:
支持向量机详解(SVM)
看到上面这些”骨骼清奇”的核函数,是不是有一种被吓尿了的感觉?这他娘的都是啥子玩意哦?!不要怕,这些家伙本质上和上面我介绍的那种单纯的加一个”Z”坐标的核函数是一样的。甚至这些函数比我说的那个核函数还要”low”。为啥?让老夫细细说来:
首先,作为初学者的你,看到上面这些”如同瞎扯”一般的公式,第一反应肯定是,这他娘的是咋来的哦?长了个什么样的脑子的人才能想出这种鸟玩意来?


我来告诉你,其实这些函数,从某种意义上来说,都是…….瞎……写……的! 没错!就是瞎写的!
支持向量机详解(SVM)
这些函数其实是几十年来,数学家们在成千上万次实验中总结出来的经验之谈(说的难听点就是瞎凑出来的函数,效果比较好,但是为啥效果好就只有老天爷知道了)
这也是我上面说这些函数比我举例子的那个简单核函数还要”low”的原因,因为我那个核函数至少能保证让数据映射到高维之后真的线性可分。而用这些奇形怪状的核函数对数据进行映射了之后,就没人知道会发生啥情况了,只能看最终效果好不好,不好咱就在换一个。没错……..

换……………………一…………………….个!

支持向量机详解(SVM)


上文讨论的都是硬间隔SVM,软间隔SVM与硬间隔的原理类似,只是多了一项松弛因子。

软间隔SVM

干点实事儿。如图所示:
支持向量机详解(SVM)
先不看那两条虚线,我们来看看中间那个支持向量机详解(SVM),根据我们上面所说的,显然用它可以将整个二维空间分成两类,而且显然使用这种方式来分类+类别和-类别效果还不错的样子。


那我们是不是大功告成了呢?我们这样分就好了呢?


我们来考虑一个问题,如果出现这种情况呢?如图所示:
支持向量机详解(SVM)
这下是不是有点懵了?这TM是啥啊?没错,如果仅采用支持向量机详解(SVM)这个超平面来很“生硬”的将空间分为非黑即白的两种类型,是不是太严格了呢?如果数据的两种类别本身就不是那么的泾渭分明呢?就像图中一样,这样划分是不是有些太“死板”了。


为了解决这种问题,数学家们想了一个办法,俗话说“水至清则无鱼”,“做人留一线”,一刀割太死板了,我们来设置一个缓冲地带吧!
没错!就是图中的两个虚线中间的区域,数学家规定落入这个区域内的样本我们已经分类正确了(换而言之就是不管它们了,无视掉),他们的特征本身就不那么“明显”,那么我们干嘛还要为此“劳神”呢?老子不管你了还不成?没错!就是这么简单!数学家们给这个方法取了个名字叫做“soft margin”。

当然,软间隔SVM除了不考虑落在缓冲带的点以外,还可以单独(在计算支持向量时仍然不考虑它们)计算它们的损失,比如把目标函数修改为如图:

min

12||w||2+Cmi=1l0/1(yi(wTxi+b)1)
其中C>0是一个常数,l0/1是“0/1损失函数”

l0/1={1if z<0;0 otherwise.

显然当C无穷大时,会变回硬间隔SVM,C取0时就是我上面说的完全不考虑这些点啦。
软间隔SVM还有许多计算损失的函数:
hinge损失:lhinge(z)=max(0,1z);
指数损失(exponential loss):lexp(z)=exp(z);
对率损失(logistic loss):llog(z)=log(1+exp(z));

本文就不详解啦。


本文中的观点仅代表个人浅见,如标题所写,仅为戏言尔。
不过若能帮助到您也是我的荣幸。

相关文章:

  • 2021-07-17
  • 2021-11-29
  • 2021-06-25
  • 2021-10-08
  • 2021-07-02
  • 2021-10-19
  • 2021-12-29
  • 2021-11-30
猜你喜欢
  • 2021-12-10
  • 2021-10-18
  • 2021-10-05
  • 2021-12-26
  • 2021-09-13
  • 2021-04-10
相关资源
相似解决方案