鸣谢
本文引用了下列文章或书籍
1.《机器学习》俗称西瓜书,作者:周志华
2.用讲故事的办法帮你理解SMO算法
3.吴恩达CS299课堂资料
说到支持向量机,首先得介绍一些基础知识,现在开始。
凸集
凸集定义:集合C内任意两点连成的线段(注意和仿射集的区别)都在集合C内,则C为凸集。
举个例子:
显然上图中,左图是凸集,右边那个像肾一样的肯定不是凸集~
凸包
凸包定义:包含集合C的最小凸集,为集合C的凸包。
仿射集
定义:通过集合内中任意两不同点的直线,该直线仍在集合内,则该集合为仿射集
感性认识:即这个集合是“平的”是“直的”,换句话说即它是“线性的”
仿射集的例子:直线,平面,超平面
显然仿射集都是凸集,凸集不一定是仿射集。
拉格朗日乘数法
假设有优化问题:
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) +
然后将L对λ,x求导,使导数都为0,联立方程组可以求出原解析问题的解。
超平面
什么是超平面?听上去好像很牛逼的样子?其实是一个很简单的概念,简单点说就是:二维空间的超平面为一维直线,三维空间的超平面为二维平面…….以此类推,n维空间的n-1维仿射集为n为空间的超平面。
举个例子:
上图就是一个二维空间的超平面,什么?这TM不是一根直线么?
可不就是在骗你…….啊呸!可不就是一条直线么?这就是伟大的数学家的定义啊!
三维空间中的超平面就是一个空间里的平面,就像这样:
是不是有点感觉了?没错:二维空间的超平面为一维直线,三维空间的超平面为二维平面…….以此类推,n维空间的n-1维仿射集为n为空间的超平面。
下面给出超平面的数学公式:
其中W(W1,W2,W3,W4,…..,Wn)为法向量,决定了超平面的方向。
b为位移项,决定了超平面在方向上的“位置”。
是不是有一点抽象,不用怕,我们继续用二维空间来举例子。
图中的两条直线分别为:
X1+X2+1=0和X1+X2+2=0
对照上面的公式,发现:
W1=W2=(1,1)
b1=1
b2=2
按照定义,W为法向量,我们来画一画试试:
哎哟卧槽?还真是法向量!怎么样?老夫没有忽悠你吧?
接下来看b,很容易发现这两条直线是平行的,唯一不同的就是这两条直线在它们的法向量的方向的“位置”不同,没错,这个b就是直线在它的法向量上的“位置”。
先导知识介绍完毕了,现在开始正戏。
支持向量机(SVM)基本模型
老规矩,没有图我说个J8,先来看一张图:
先忽略掉图中绿色的两根线,暂时不管它。
很明显图中有+和-两种类别的样本,我们现在要想一个办法,找一个超平面,来把它分成两个类别,图中划了好多个超平面,都能达到我们的目的。
但是,有这么多超平面,只有一个才是我们要选择的,其实大家心里都有一杆秤,只要你不是太奇葩,总会觉得那根“最粗最大”的超平面才是我们想要的。
但是为啥我们要选择那个超平面呢?难道是因为它“最粗最大”?放肆! 老夫是那么肤浅的人吗?
没错,那个“最粗最大”的超平面看起来最顺眼,为啥最顺眼,因为它正好在两个类别的“中间”啊!它划分的最平均啊,选择他的话能够尽量减少划分错误的可能性,因为它不会偏向两边任何一个类,用它来分类最“公正”。换而言之,用它来划分结果是最鲁棒的。
好!就决定是你了!“粗大君”!我们设这个“粗大”的超平面为:
它可以将空间分成两类:
1.
2.
是不是被老夫精妙的操作给震慑住了?
我来解释一下,如图所示(该图只是举个例子,具体数值没有意义),超平面将二维空间分成了红色和蓝色两类:
好了,这下总算有个如何分类的方针了,可是最重要的事情还没讲呢!那就是这个划分类型的超平面该如何确定呢?回到这张图:
生成两个样本集合的凸包,然后在凸包的支持向量上做切线,找到其中两个切线平行且方向相反且距离最大的那对切线,就是图中这两条虚线。然后找到这两个虚线“中间”的那个超平面(也就是这两条直线的垂线的垂直平分线)就是图中的实线。
那么问题来了,如何保证存在平行切线?
答:使数据集线性可分。
如何使数据线性可分呢?答案就是核函数。
核函数在后面提。
现在我们已经找到了,两条虚线(凸包的切线):
归纳一下就是:
这个公式的意思就是:
当第i个样本的特征xi带入公式大于等于1的时候分为正类,也就是图中的“+”类
当第i个样本的特征xi带入公式小于等于-1的时候分为负类,也就是图中的“-”类
那么为什么一定是1呢?这个1和-1是缩放得到的,其实原式应该写为:
由于
如图所示,距离超平面最近的几个点正好在虚线对应的超平面上,也就是样本中可以让这两个不等式取“等号”的点。
于是数学家们给这几个点取了一个牛逼的名字,即“支持向量”,而这两条虚线的距离为
我知道肯定有的同学不知道这个分数下面的||w||是啥意思,不要着急,容老夫慢慢道来。
想必各位高中都学过平行直线距离公式吧,什么?忘了?没关系,让老夫来帮你回忆回忆。
设两条直线公式分别为:
Ax1+Bx2+C1=0
Ax1+Bx2+C2=0
那么这两条直线的距离公式为:
带入上面这个公式:
是不是发现了|C1-C2|=2,而下面的||w||=
好了,现在来解释这个||w||就轻松多了,假设w为一个向量(w1,w2,….,wn)那么||w||=
言归正传,这两个虚线的距离被称作“间隔”,很直观的理解就是把两个划分开的“间隔”,显然要分类效果尽可能的好的话,这个“间隔”就要尽可能的大!而要让这个“间隔”尽可能的大,就要让这个γ尽可能的大,换而言之就是要让处于分母位置的||w||尽可能的小,也就是让||w||²尽可能的小。于是我们得到了支持向量机的基本模型:
min
s.t.
求解支持向量机基本模型
看到这个优化问题的样子,我们是不是第一反应就是拉格朗日乘数法!!
没有错!对支持向量机基本模型使用拉格朗日乘数法,得到如下式子:
然后我们用L对α,w分别求偏导,得到:
将上述结果再回代入L中,得到对偶问题:
此时的约束条件变成了:
s.t.
解出来α之后,再求出w和b就可以得到最后的结果啦:
很显然,如果当x维度很高的话,这个方程会十分难解,为了避免这个问题,数学家们又想了一个歪…..哦不,高招。
我们的高招,SMO算法华丽登场!
在介绍SMO之前,我们需要介绍KKT条件。
KKT条件
首先我们有:
一般优化问题的拉格朗日乘数法:
minimize
subject to
求出的拉格朗日函数为:
该拉格朗日函数的对偶函数为:
若我们要通过求对偶问题的解来求原问题的解,即需要对偶函数的最大值就是原问题的最小值。即:
也就是要让上面两个不等式取等号。
要让第一个不等式取等号,即使x*为函数的驻点,即函数对x求导数为0
要让第一个不等式取等号,由于hi(x)=0,所以得要求λf(x)=0,所以得到如下约束:
SMO算法
拉格朗日对偶问题我们都会解,但是一旦数据集很大的话,求解过程就会十分复杂
max
s.t.
需要有一个优化的算法来求解这个复杂的问题,即SMO算法
因为直接求解超平面十分困难,我们从另外一个角度来思考问题,首先:
我们设最优超平面为g(x)。那么按照SVM的理论,如果这个g(x)是最优的分离超平面,就有:
姑且称这个叫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个解的问题,转换成了两个变量求解的问题
核函数
核函数是干嘛的?你百度半天可能都得不出结果,让老夫来好好忽悠….哦不,好好教导你吧!我们来举个例子:
这个图上有四个点,两个“+”和两个“-”,老夫让你用一个超平面(也就是画一条直线)将它们分类,你能行吗?没错!你不行,其实老夫也不行,各大数学家也不行啊,所有人都只能画像图上那样的曲线才能达到分类的效果,当初这个问题可把数学家们愁坏了。这可咋整啊?
终于,有一个骨骼清奇的骚年想了一个高招,我们给这几个点再加一个维度不就成了?让他们到三维空间里去,不就能用一个超平面来分类了?如图所示:
没错,单纯的给每个点加一个“Z”坐标,让他们从二维的变成三维的,这就是一种十分简单的核函数。
现在你们知道核函数是干嘛了的吧,没错,就是将低维线性不可分的数据映射到高维,从而使它们线性可分的”函数”。
常用的几个比较牛逼的核函数如下:
看到上面这些”骨骼清奇”的核函数,是不是有一种被吓尿了的感觉?这他娘的都是啥子玩意哦?!不要怕,这些家伙本质上和上面我介绍的那种单纯的加一个”Z”坐标的核函数是一样的。甚至这些函数比我说的那个核函数还要”low”。为啥?让老夫细细说来:
首先,作为初学者的你,看到上面这些”如同瞎扯”一般的公式,第一反应肯定是,这他娘的是咋来的哦?长了个什么样的脑子的人才能想出这种鸟玩意来?
我来告诉你,其实这些函数,从某种意义上来说,都是…….瞎……写……的! 没错!就是瞎写的!
这些函数其实是几十年来,数学家们在成千上万次实验中总结出来的经验之谈(说的难听点就是瞎凑出来的函数,效果比较好,但是为啥效果好就只有老天爷知道了)
这也是我上面说这些函数比我举例子的那个简单核函数还要”low”的原因,因为我那个核函数至少能保证让数据映射到高维之后真的线性可分。而用这些奇形怪状的核函数对数据进行映射了之后,就没人知道会发生啥情况了,只能看最终效果好不好,不好咱就在换一个。没错……..
换……………………一…………………….个!
上文讨论的都是硬间隔SVM,软间隔SVM与硬间隔的原理类似,只是多了一项松弛因子。
软间隔SVM
干点实事儿。如图所示:
先不看那两条虚线,我们来看看中间那个,根据我们上面所说的,显然用它可以将整个二维空间分成两类,而且显然使用这种方式来分类+类别和-类别效果还不错的样子。
那我们是不是大功告成了呢?我们这样分就好了呢?
我们来考虑一个问题,如果出现这种情况呢?如图所示:
这下是不是有点懵了?这TM是啥啊?没错,如果仅采用这个超平面来很“生硬”的将空间分为非黑即白的两种类型,是不是太严格了呢?如果数据的两种类别本身就不是那么的泾渭分明呢?就像图中一样,这样划分是不是有些太“死板”了。
为了解决这种问题,数学家们想了一个办法,俗话说“水至清则无鱼”,“做人留一线”,一刀割太死板了,我们来设置一个缓冲地带吧!
没错!就是图中的两个虚线中间的区域,数学家规定落入这个区域内的样本我们已经分类正确了(换而言之就是不管它们了,无视掉),他们的特征本身就不那么“明显”,那么我们干嘛还要为此“劳神”呢?老子不管你了还不成?没错!就是这么简单!数学家们给这个方法取了个名字叫做“soft margin”。
当然,软间隔SVM除了不考虑落在缓冲带的点以外,还可以单独(在计算支持向量时仍然不考虑它们)计算它们的损失,比如把目标函数修改为如图:
min
其中C>0是一个常数,
显然当C无穷大时,会变回硬间隔SVM,C取0时就是我上面说的完全不考虑这些点啦。
软间隔SVM还有许多计算损失的函数:
hinge损失:
指数损失(exponential loss):
对率损失(logistic loss):
本文就不详解啦。
本文中的观点仅代表个人浅见,如标题所写,仅为戏言尔。
不过若能帮助到您也是我的荣幸。