做者:July 。致谢:pluskid、白石、JerryLead。
说明:本文最初写于2012年6月,然后不断反反复复修改&优化,修改次数达上百次,最后修改于2016年11月。
声明:本文于2012年便早已附上全部参考连接,并注明是篇“学习笔记”,且写明具体参考了pluskid等人的文章。文末2013年的PDF是为证。另,若是本文的图片/公式没法正常显示,请点击本文的**七月在线题库版**。php
动笔写这个支持向量机(support vector machine)是费了很多劲和困难的,缘由很简单,一者这个东西自己就并很差懂,要深刻学习和研究下去需花费很多时间和精力,两者这个东西也很差讲清楚,尽管网上已经有朋友写得不错了(见文末参考连接),但在描述数学公式的时候仍是显得不够。得益于同窗白石的数学证实,我仍是想尝试写一下,但愿本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整归纳和介绍支持向量机的导论性的文章。html
本文在写的过程当中,参考了很多资料,包括《支持向量机导论》、《统计学习方法》及网友pluskid的支持向量机系列等等,于此,仍是一篇学习笔记,只是加入了本身的理解和总结,有任何不妥之处,还望海涵。全文宏观上总体认识支持向量机的概念和用处,微观上深究部分定理的前因后果,证实及原理细节,力保逻辑清晰 & 通俗易懂。java
同时,阅读本文时建议你们尽可能使用chrome等浏览器,如此公式才能更好的显示,再者,阅读时可拿张纸和笔出来,把本文全部定理.公式都亲自推导一遍或者直接打印下来(可直接打印网页版或本文文末附的PDF)在文稿上演算,从而享受随时随地思考、演算的极致快感。web
OK,仍是那句话,有任何问题,欢迎任何人随时不吝指正 & 赐教,感谢。面试
支持向量机,因其英文名为support vector machine,故通常简称SVM,通俗来说,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略即是间隔最大化,最终可转化为一个凸二次规划问题的求解。算法
理解SVM,我们必须先弄清楚一个概念:线性分类器。spring
给定一些数据点,它们分别属于两个不一样的类,如今要找到一个线性分类器把这些数据分红两类。若是用x表示数据点,用y表示类别(y能够取1或者-1,分别表明两个不一样的类),一个线性分类器的学习目标即是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程能够表示为( wT中的T表明转置):chrome
可能有读者对类别取1或-1有疑问,事实上,这个1或-1的分类标准起源于logistic回归。编程
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合做为自变量,因为自变量的取值范围是负无穷到正无穷。所以,使用logistic函数(或称做sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的几率。浏览器
假设函数
其中x是n维特征向量,函数g就是logistic函数。
而的图像是
能够看到,将无穷映射到了(0,1)。
而假设函数就是特征属于y=1的几率。
从而,当咱们要判别一个新来的特征属于哪一个类时,只需求便可,若
大于0.5就是y=1的类,反之属于y=0类。
此外,只和
有关,
>0,那么
,而g(z)只是用来映射,真实的类别决定权仍是在于
。再者,当
时,
=1,反之
=0。若是咱们只从
出发,但愿模型达到的目标就是让训练数据中y=1的特征
,而是y=0的特征
。Logistic回归就是要学习获得
,使得正例的特征远大于0,负例的特征远小于0,并且要在所有训练实例上达到这个目标。
接下来,尝试把logistic回归作个变形。首先,将使用的结果标签y = 0和y = 1替换为y = -1,y = 1,而后将(
)中的
替换为b,最后将后面的
替换为
(即
)。如此,则有了
。也就是说除了y由y=0变为y=-1外,线性分类函数跟logistic回归的形式化表示
没区别。
进一步,能够将假设函数中的g(z)作一个简化,将其简单映射到y=-1和y=1上。映射关系以下:
下面举个简单的例子。以下图所示,如今有一个二维平面,平面上有两种不一样的数据,分别用圈和叉表示。因为这些数据是线性可分的,因此能够用一条直线将这两类数据分开,这条直线就至关于一个超平面,超平面一边的数据点所对应的y全是-1 ,另外一边所对应的y全是1。
这个超平面能够用分类函数表示,当f(x) 等于0的时候,x即是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点,以下图所示:
注:有的资料上定义特征到结果的输出函数,与这里定义的
实质是同样的。为何?由于不管是
,仍是
,不影响最终优化结果。下文你将看到,当咱们转化到优化
的时候,为了求解方便,会把yf(x)令为1,即yf(x)是y(w^x + b),仍是y(w^x - b),对咱们要优化的式子max1/||w||已无影响。
(有一朋友飞狗来自Mare_Desiderii,看了上面的定义以后,问道:请教一下SVM functional margin 为=y(wTx+b)=yf(x)中的Y是只取1和-1 吗?y的惟一做用就是确保functional margin的非负性?真是这样的么?固然不是,详情请见本文评论下第43楼)
换言之,在进行分类的时候,遇到一个新的数据点x,将x代入f(x) 中,若是f(x)小于0则将x的类别赋为-1,若是f(x)大于0则将x的类别赋为1。
接下来的问题是,如何肯定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而断定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。因此,得寻找有着最大间隔的超平面。
在超平面w*x+b=0肯定的状况下,|w*x+b|可以表示点x到距离超平面的远近,而经过观察w*x+b的符号与类标记y的符号是否一致可判断****分类是否正确,因此,能够用(y*(w*x+b))的正负性来断定或表示分类的正确性。于此,咱们便引出了函数间隔(functional margin)的概念。
定义函数间隔(用表示)为:
而超平面(w,b)关于T中全部样本点(xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:
**= **min
i (i=1,...n)
但这样定义的函数间隔有问题,即若是成比例的改变w和b(如将它们改为2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),因此只有函数间隔还远远不够。
事实上,咱们能够对法向量w加些约束条件,从而引出真正定义点到超平面的距离--几何间隔(geometrical margin)的概念。
假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量,为样本x到超平面的距离,以下图所示:
根据平面几何知识,有
其中||w||为w的二阶范数(范数是一个相似于模的表示长度的概念),是单位向量(一个向量除以它的模称之为单位向量)。
又因为x0 是超平面上的点,知足 f(x0)=0,代入超平面的方程,可得
,即
。
随即让此式的两边同时乘以
,再根据
和
,便可算出γ:
为了获得的绝对值,令
乘上对应的类别 y,便可得出几何间隔(用
表示)的定义:
从上述函数间隔和几何间隔的定义能够看出:几何间隔就是函数间隔除以||w||,并且函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。
对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。因此,为了使得分类的确信度尽可能高,须要让所选择的超平面可以最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。
经过由前面的分析可知:函数间隔不适合用来最大化间隔值,由于在超平面固定之后,能够等比例地缩放w的长度和b的值,这样能够使得的值任意大,亦即函数间隔
能够在超平面保持不变的状况下被取得任意大。但几何间隔由于除上了
,使得在缩放w和b的时候几何间隔
的值是不会改变的,它只随着超平面的变更而变更,所以,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。
因而最大间隔分类器(maximum margin classifier)的目标函数能够定义为:
同时需知足一些条件,根据间隔的定义,有
其中,s.t.,即subject to的意思,它导出的是约束条件。
回顾下几何间隔的定义,可知:若是令函数间隔
等于1(之因此令
等于1,是为了方便推导和优化,且这样作对目标函数的优化没有影响,至于为何,请见本文评论下第42楼回复),则有
= 1 / ||w||且
,从而上述目标函数转化成了
至关于在相应的约束条件下,最大化这个1/||w||值,而1/||w||即是几何间隔
。
以下图所示,中间的实线即是寻找到的最优超平面(Optimal Hyper Plane),其到两条虚线边界的距离相等,这个距离即是几何间隔,两条虚线间隔边界之间的距离等于2
,而虚线间隔边界上的点则是支持向量。因为这些支持向量恰好在虚线间隔边界上,因此它们知足
(还记得咱们把 functional margin 定为 1 了吗?上节中:处于方便推导和优化的目的,咱们能够令
=1),而对于全部不是支持向量的点,则显然有
。
OK,到此为止,算是了解到了SVM的第一层,对于那些只关心怎么用SVM的朋友便已足够,没必要再更进一层深究其更深的原理。
2.1.一、从原始问题到对偶问题的求解
接着考虑以前获得的目标函数:
因为求的最大值至关于求
的最小值,因此上述目标函数等价于(w由分母变成分子,从而也有原来的max问题变为min问题,很明显,二者问题等价):
由于如今的目标函数是二次的,约束条件是线性的,因此它是一个凸二次规划问题。这个问题能够用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在必定的约束条件下,目标最优,损失最小。
此外,因为这个问题的特殊结构,还能够经过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即经过求解与原问题等价的对偶问题(dual problem)获得原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样作的优势在于:一者对偶问题每每更容易求解;两者能够天然的引入核函数,进而推广到非线性分类问题。
那什么是拉格朗日对偶性呢?简单来说,经过给每个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(经过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出咱们的问题):
而后令
容易验证,当某个约束条件不知足时,例如,那么显然有
(只要令
便可)。而当全部约束条件都知足时,则最优值为
,亦即最初要最小化的量。
所以,在要求约束条件获得知足的状况下最小化,实际上等价于直接最小化
(固然,这里也有约束条件,就是
≥0,i=1,…,n) ,由于若是约束条件没有获得知足,
会等于无穷大,天然不会是咱们所要求的最小值。
具体写出来,目标函数变成了:
这里用表示这个问题的最优值,且和最初的问题是等价的。若是直接求解,那么一上来便得面对w和b两个参数,而
又是不等式约束,这个求解过程很差作。不妨把最小和最大的位置交换一下,变成:
交换之后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。并且有
≤
,在知足某些条件的状况下,这二者相等,这个时候就能够经过求解对偶问题来间接地求解原始问题。
换言之,之因此从minmax的原始问题,转化为maxmin的对偶问题
,一者由于
是
的近似解,两者,转化为对偶问题后,更容易求解。
下面能够先求L 对w、b的极小,再求L 对的极大。
2.1.二、KKT条件
上文中提到“≤
在知足某些条件的状况下,二者等价”,这所谓的“知足某些条件”就是要知足KKT条件。
勘误:经读者qq_28543029指出,这里的条件不该该是KKT条件,要让二者等价需知足strong duality (强对偶),然后有学者在强对偶下提出了KKT条件,且KKT条件的成立要知足constraint qualifications,而constraint qualifications之一就是Slater条件。所谓Slater 条件,即指:凸优化问题,若是存在一个点x,使得全部等式约束都成立,而且全部不等式约束都严格成立(即取严格不等号,而非等号),则知足Slater 条件。对于此处,Slater 条件成立,因此d*≤p*能够取等号。
通常地,一个最优化数学模型可以表示成下列标准形式:
其中,f(x)是须要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。
同时,得明白如下两点:
而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须知足下面的条件:
通过论证,咱们这里的问题是知足 KKT 条件的(首先已经知足Slater条件,再者f和gi也都是可微的,即L对w和b均可导),所以如今咱们便转化为求解第二个问题。
也就是说,原始问题经过知足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,而后求对的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。
2.1.三、对偶问题求解的3个步骤
(1) 、首先固定*,* 要让 L 关于 w 和 b 最小化,咱们分别对w,b求偏导数,即令 ∂L/∂w 和 ∂L/∂b 等于零(对w求导结果的解释请看本文评论下第45楼回复):
将以上结果代入以前的L:
获得:
提醒:有读者可能会问上述推导过程如何而来?说实话,其具体推导过程是比较复杂的,以下图所示:
最后,获得:
如 jerrylead所说:“倒数第4步”推导到“倒数第3步”使用了线性代数的转置运算,因为ai和yi都是实数,所以转置后与自身同样。“倒数第3步”推导到“倒数第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法运算法则。最后一步是上一步的顺序调整。
从上面的最后一个式子,咱们能够看出,此时的拉格朗日函数只包含了一个变量,那就是(求出了
便能求出w,和b,因而可知,上文第1.2节提出来的核心问题:分类函数**
**也就能够垂手可得的求出来了)。
(2) 、求对*的极大,* 便是关于对偶问题的最优化问题。通过上面第一个步骤的求w和b,获得的拉格朗日函数式子已经没有了变量w,b,只有
。从上面的式子获得:
这样,求出了,根据
,便可求出w,而后经过
,便可求出b,最终得出分离超平面和分类决策函数。
(3) 在求得L(w, b, a) 关于 w 和 b 最小化,以及对的极大以后,最后一步则能够利用SMO算法求解对偶问题中的拉格朗日乘子
。
上述式子要解决的是在参数上求最大值W的问题,至于
和
都是已知数。要了解这个SMO算法是如何推导的,请跳到下文第3.5节、SMO算法。
到目前为止,咱们的 SVM 还比较弱,只能处理线性的状况,下面咱们将引入核函数,进而推广到非线性分类问题。
2.1.四、线性不可分的状况
OK,为过渡到下节2.2节所介绍的核函数,让咱们再来看看上述推导过程当中获得的一些有趣的形式。首先就是关于咱们的 hyper plane ,对于一个数据点 x 进行分类,其实是经过把 x 带入到算出结果真后根据其正负号来进行类别划分的。而前面的推导中咱们获得
所以分类函数为:
这里的形式的有趣之处在于,对于新点 x的预测,只须要计算它与训练数据点的内积便可(表示向量内积),这一点相当重要,是以后使用 Kernel 进行非线性推广的基本前提。此外,所谓 Supporting Vector 也在这里显示出来——事实上,全部非Supporting Vector 所对应的系数
都是等于零的,所以对于新点的内积计算实际上只要针对少许的“支持向量”而不是全部的训练数据便可。
为何非支持向量对应的等于零呢?直观上来理解的话,就是这些“后方”的点——正如咱们以前分析过的同样,对超平面是没有影响的,因为分类彻底有超平面决定,因此这些无关的点并不会参与分类问题的计算,于是也就不会产生任何影响了。
回忆一下咱们2.1.1节中经过 Lagrange multiplier获得的目标函数:
注意到若是 x i 是支持向量的话,上式中红颜色的部分是等于 0 的(由于支持向量的 functional margin 等于 1 ),而对于非支持向量来讲,functional margin 会大于 1 ,所以红颜色部分是大于零的,而又是非负的,为了知足最大化,
必须等于 0 。这也就是这些非Supporting Vector 的点的局限性。
至此,咱们便获得了一个maximum margin hyper plane classifier,这就是所谓的支持向量机(Support Vector Machine)。固然,到目前为止,咱们的 SVM 还比较弱,只能处理线性的状况,不过,在获得了对偶dual 形式以后,经过 Kernel 推广到非线性的状况就变成了一件很是容易的事情了(相信,你还记得本节开头所说的:“经过求解对偶问题获得最优解,这就是线性可分条件下支持向量机的对偶算法,这样作的优势在于:一者对偶问题每每更容易求解;两者能够天然的引入核函数,进而推广到非线性分类问题”)。
2.2.一、特征空间的隐式映射:核函数
事实上,大部分时候数据并非线性可分的,这个时候知足这样条件的超平面就根本不存在。在上文中,咱们已经了解到了SVM处理线性可分的状况,那对于非线性的数据SVM咋处理呢?对于非线性的状况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,经过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来讲,在线性不可分的状况下,支持向量机首先在低维空间中完成计算,而后经过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上自己很差分的非线性数据分开。如图所示,一堆数据在二维空间没法划分,从而映射到三维空间里划分:
而在咱们遇到核函数以前,若是用原始的方法,那么在用线性学习器学习一个非线性关系,须要选择一个非线性特征集,而且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,所以,考虑的假设集是这种类型的函数:
这里ϕ:X->F是从输入空间到某个特征空间的映射,这意味着创建非线性学习器分为两步:
而因为对偶形式就是线性学习器的一个重要性质,这意味着假设能够表达为训练点的线性组合,所以决策规则能够用测试点和训练点的内积来表示:
若是有一种方式能够在特征空间中直接计算内积〈φ(xi · φ(x) 〉,就像在原始输入点的函数中同样,就有可能将两个步骤融合到一块儿创建一个非线性的学习器,这样直接计算法的方法称为核函数方法:
核是一个函数K,对全部x,z(-X,知足,这里φ是从X到内积特征空间F的映射。
2.2.二、核函数:如何处理非线性数据
来看个核函数的例子。以下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据自己就是线性不可分的,此时我们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)?
事实上,上图所述的这个数据集,是用两个半径不一样的圆圈加上了少许的噪音生成获得的,因此,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。若是用和
来表示这个二维平面的两个坐标的话,咱们知道一条二次曲线(圆圈是二次曲线的一种特殊状况)的方程能够写做这样的形式:
注意上面的形式,若是咱们构造另一个五维的空间,其中五个坐标的值分别为,
,
,
,
,那么显然,上面的方程在新的坐标系下能够写做:
关于新的坐标,这正是一个 hyper plane 的方程!也就是说,若是咱们作一个映射
,将
按照上面的规则映射为
,那么在新的空间中原来的数据将变成线性可分的,从而使用以前咱们推导的线性分类算法就能够进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。
再进一步描述 Kernel 的细节以前,不妨再来看看上述例子在映射事后的直观形态。固然,你我可能没法把 5 维空间画出来,不过因为我这里生成数据的时候用了特殊的情形,因此这里的超平面实际的方程是这个样子的(圆心在轴上的一个正圆):
所以我只须要把它映射到,
,
这样一个三维空间中便可,下图便是映射以后的结果,将坐标轴通过适当的旋转,就能够很明显地看出,数据是能够经过一个平面来分开的(pluskid:下面的gif 动画,先用 Matlab 画出一张张图片,再用 Imagemagick 拼贴成):
核函数至关于把原来的分类函数:
映射成:
而其中的能够经过求解以下 dual 问题而获得的:
这样一来问题就解决了吗?彷佛是的:拿到非线性数据,就找一个映射,而后一股脑把原来的数据映射到新空间中,再作线性 SVM 便可。不过事实上好像并无这么简单。
细想一下,刚才的方法是否是有问题?
这个时候,可能就须要 Kernel 出马了。
不妨仍是从最开始的简单例子出发,设两个向量和
,而
便是到前面说的五维空间的映射,所以映射事后的内积为:
(公式说明:上面的这两个推导过程当中,所说的前面的五维空间的映射,这里说的前面即是文中2.2.1节的所述的映射方式,回顾下以前的映射规则,再看那第一个推导,其实就是计算x1,x2各自的内积,而后相乘相加便可,第二个推导则是直接平方,去掉括号,也很容易推出来)
另外,咱们又注意到:
两者有不少类似的地方,实际上,咱们只要把某几个维度线性缩放一下,而后再加上一个常数维度,具体来讲,上面这个式子的计算结果实际上和映射
以后的内积的结果是相等的,那么区别在于什么地方呢?
(公式说明:上面之中,最后的两个式子,第一个算式,是带内积的彻底平方式,能够拆开,而后,经过凑一个获得,第二个算式,也是根据第一个算式凑出来的)
回忆刚才提到的映射的维度爆炸,在前一种方法已经没法计算的状况下,后一种方法却依旧能从容处理,甚至是无穷维度的状况也没有问题。
咱们把这里的计算两个向量在隐式映射事后的空间中的内积的函数叫作核函数 (Kernel Function) ,例如,在刚才的例子中,咱们的核函数为:
核函数能简化映射空间中的内积运算——恰好“碰巧”的是,在咱们的 SVM 里须要计算的地方数据向量老是之内积的形式出现的。对比刚才咱们上面写出来的式子,如今咱们的分类函数为:
其中 由以下 dual 问题计算而得:
这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果倒是等价的!固然,由于咱们这里的例子很是简单,因此我能够手工构造出对应于的核函数出来,若是对于任意一个映射,想要构造出对应的核函数就很困难了。
2.2.三、几个核函数
一般人们会从一些经常使用的核函数中选择(根据问题和数据的不一样,选择不一样的参数,实际上就是获得了不一样的核函数),例如:
2.2.四、核函数的本质
上面说了这么一大堆,读者可能仍是没明白核函数究竟是个什么东西?我再简要归纳下,即如下三点:
最后引用这里的一个例子举例说明下核函数解决非线性问题的直观效果。
假设如今你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你须要搭建一个篱笆来把羊群围起来。可是篱笆应该建在哪里呢?你极可能须要依据牛群和狼群的位置创建一个“分类器”,比较下图这几种不一样的分类器,咱们能够看到SVM完成了一个很完美的解决方案。
这个例子从侧面简单说明了SVM使用非线性分类器的优点,而逻辑模式以及决策树模式都是使用了直线方法。
OK,再也不作过多介绍了,对核函数有进一步兴趣的,还能够看看此文。
在本文第一节最开始讨论支持向量机的时候,咱们就假定,数据是线性可分的,亦即咱们能够找到一个可行的超平面将数据彻底分开。后来为了处理非线性数据,在上文2.2节使用 Kernel 方法对原来的线性 SVM 进行了推广,使得非线性的的状况也能处理。虽然经过映射将原始数据映射到高维空间以后,可以线性分隔的几率大大增长,可是对于某些状况仍是很难处理。
例如可能并非由于数据自己是非线性结构的,而只是由于数据有噪音。对于这种偏离正常位置很远的数据点,咱们称之为 outlier ,在咱们原来的 SVM 模型里,outlier 的存在有可能形成很大的影响,由于超平面自己就是只有少数几个 support vector 组成的,若是这些 support vector 里又存在 outlier 的话,其影响就很大了。例以下图:
用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了本身本来所应该在的那个半空间,若是直接忽略掉它的话,原来的分隔超平面仍是挺好的,可是因为这个 outlier 的出现,致使分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并无严格计算精确坐标),同时 margin 也相应变小了。固然,更严重的状况是,若是这个 outlier 再往右上移动一些距离的话,咱们将没法构造出能将数据分开的超平面来。
为了处理这种状况,SVM 容许数据点在必定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,若是把它移动回来,就恰好落在原来的 超平面 蓝色间隔边界上,而不会使得超平面发生变形了。
插播下一位读者@Copper_PKU的理解: “ 换言之,在有松弛的状况下outline点也属于支持向量SV,同时,对于不一样的支持向量,拉格朗日参数的值也不一样,如此篇论文《Large Scale Machine Learning》中的下图所示:
对于远离分类平面的点值为0;对于边缘上的点值在[0, 1/L]之间,其中,L为训练数据集个数,即数据集大小;对于outline数据和内部的数据值为1/L。更多请参看本文文末参考条目第51条。 ”
OK,继续回到我们的问题。咱们,原来的约束条件为:
如今考虑到outlier问题,约束条件变成了:
其中称为松弛变量 (slack variable) ,对应数据点
容许偏离的 functional margin 的量。固然,若是咱们运行
任意大的话,那任意的超平面都是符合条件的了。因此,咱们在原来的目标函数后面加上一项,使得这些
的总和也要最小:
其中 是一个参数,用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点误差量最小”)之间的权重。注意,其中
是须要优化的变量(之一),而
是一个事先肯定好的常量。完整地写出来是这个样子:
用以前的方法将限制或约束条件加入到目标函数中,获得新的拉格朗日函数,以下所示:
分析方法和前面同样,转换为另外一个问题以后,咱们先让针对
、
和
最小化:
将 带回
并化简,获得和原来同样的目标函数:
不过,因为咱们获得而又有
(做为 Lagrange multiplier 的条件),所以有
,因此整个 dual 问题如今写做:
把先后的结果对比一下(错误修正:图中的Dual formulation中的Minimize应为maxmize):
能够看到惟一的区别就是如今 dual variable 多了一个上限
。而 Kernel 化的非线性形式也是同样的,只要把
换成
便可。这样一来,一个完整的,能够处理线性和非线性并能容忍噪音和 outliers 的支持向量机才终于介绍完毕了。
行文至此,能够作个小结,不许确的说,SVM它本质上便是一个分类方法,用w^T+b定义分类函数,因而求w、b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对拉格朗日乘子a的求解(求解过程当中会涉及到一系列最优化或凸二次规划等问题),如此,求w.b与求a等价,而a的求解能够用一种快速学习算法SMO,至于核函数,是为处理非线性状况,若直接映射到高维计算恐维度爆炸,故在低维计算,等效高维表现。
OK,理解到这第二层,已经能知足绝大部分人一窥SVM原理的好奇心,然对于那些想在证实层面理解SVM的则还很不够,但进入第三层理解境界以前,你必需要有比较好的数理基础和逻辑证实能力,否则你会跟我同样,吃很多苦头的。
说实话,凡是涉及到要证实的东西.理论,便通常不是怎么好惹的东西。绝大部分时候,看懂一个东西不难,但证实一个东西则须要点数学功底,进一步,证实一个东西也不是特别难,难的是从零开始发明创造这个东西的时候,则显艰难(由于任什么时候代,大部分人的研究所得都不过是基于前人的研究成果,前人所作的是开创性工做,而这每每是最艰难最有价值的,他们被称为真正的先驱。牛顿也曾说过,他不过是站在巨人的肩上。你,我则更是如此)。
正如陈希孺院士在他的著做《数理统计学简史》的第4章、最小二乘法中所讲:在科研上诸多观念的革新和突破是有着不少的不易的,或许某个定理在某个时期由某我的点破了,如今的咱们看来一切都是理所固然,但在一切没有发现以前,可能许许多多的顶级学者毕其功于一役,耗尽一辈子,努力了几十年最终也是无功而返。
话休絮烦,要证实一个东西先要弄清楚它的根基在哪,即构成它的基础是哪些理论。OK,如下内容基本是上文中未讲到的一些定理的证实,包括其背后的逻辑、来源背景等东西,仍是读书笔记。
本部分导述
3.1.一、感知机算法
这个感知机算法是1956年提出的,年代久远,依然影响着当今,固然,能够确定的是,此算法亦非最优,后续会有更详尽阐述。不过,有一点,你必须清楚,这个算法是为了干吗的:不断的训练试错以期寻找一个合适的超平面(是的,就这么简单)。
下面,举个例子。以下图所示,凭咱们的直觉能够看出,图中的红线是最优超平面,蓝线则是根据感知机算法在不断的训练中,最终,若蓝线能经过不断的训练移动到红线位置上,则表明训练成功。
既然须要经过不断的训练以让蓝线最终成为最优分类超平面,那么,到底须要训练多少次呢?Novikoff定理告诉咱们当间隔是正的时候感知机算法会在有限次数的迭代中收敛,也就是说Novikoff定理证实了感知机算法的收敛性,即能获得一个界,不至于无穷循环下去。
这里,
为扩充间隔。根据误分次数公式可知, 迭代次数与对应于扩充(包括偏置)权重的训练集的间隔有关。
顺便再解释下这个所谓的扩充间隔,
即为样本到分类间隔的距离,即从
引出的最大分类间隔。OK,还记得上文第1.3节开头的内容么?以下: “
在给出几何间隔的定义以前,我们首先来看下,如上图所示,对于一个点x,令其垂直投影到超平面上的对应的为x0,因为w是垂直于超平面的一个向量,为样本x到分类间隔的距离,咱们有
”
而后后续怎么推导出最大分类间隔请回到本文第1、二部分,此处不重复板书。
同时有一点得注意:感知机算法虽然能够经过简单迭代对线性可分数据生成正确分类的超平面,但不是最优效果,那怎样才能获得最优效果呢,就是上文中第一部分所讲的寻找最大分类间隔超平面。此外,Novikoff定理的证实请见这里。
3.2.一、Mercer定理
Mercer定理 :若是函数K是上的映射(也就是从两个n维向量映射到实数域)。那么若是K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例
,其相应的核函数矩阵是对称半正定的。
要理解这个Mercer定理,先要了解什么是半正定矩阵,要了解什么是半正定矩阵,先得知道什么是正定矩阵(矩阵理论博大精深,关于矩阵推荐我正在看的一本《矩阵分析与应用》)。而后这里有一个此定理的证实,能够看下。
正如@Copper_PKU所说:核函数在SVM的分类效果中起了重要的做用,最后这里有个tutorial能够看看。
在本文1.0节有这么一句话“支持向量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法,经过寻求结构化风险最小来提升学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的状况下,亦能得到良好统计规律的目的。”但初次看到的读者可能并不了解什么是结构化风险,什么又是经验风险。要了解这两个所谓的“风险”,还得又从监督学习提及。
监督学习实际上就是一个经验风险或者结构风险函数的最优化问题。风险函数度量平均意义下模型预测的好坏,模型每一次预测的好坏用损失函数来度量。它从假设空间F中选择模型f做为决策函数,对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数来度量预测错误的程度。损失函数记为L(Y, f(X))。
经常使用的损失函数有如下几种(基本引用自《统计学习方法》):
如此,SVM有第二种理解,即最优化+损失最小,或如@夏粉_百度所说“可从损失函数和优化算法角度看SVM,boosting,LR等算法,可能会有不一样收获”。
OK,关于更多统计学习方法的问题,请参看此文。
关于损失函数,以下文读者评论中所述:能够看看张潼的这篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各类算法中经常使用的损失函数基本都具备fisher一致性,优化这些损失函数获得的分类器能够看做是后验几率的“代理”。此外,张潼还有另一篇论文《Statistical analysis of some multi-category large margin classification methods》,在多分类状况下margin loss的分析,这两篇对Boosting和SVM使用的损失函数分析的很透彻。
3.4.一、什么是最小二乘法?
既然本节开始以前提到了最小二乘法,那么下面引用《正态分布的前世此生》里的内容稍微简单阐述下。
咱们口头中常常说:通常来讲,平均来讲。如平均来讲,不吸烟的健康优于吸烟者,之因此要加“平均”二字,是由于凡事皆有例外,总存在某个特别的人他吸烟但因为常常锻炼因此他的健康情况可能会优于他身边不吸烟的朋友。而最小二乘法的一个最简单的例子即是算术平均。
最小二乘法(又称最小平方法)是一种数学优化技术。它经过最小化偏差的平方和寻找数据的最佳函数匹配。利用最小二乘法能够简便地求得未知的数据,并使得这些求得的数据与实际数据之间偏差的平方和为最小。用函数表示为:
使偏差「所谓偏差,固然是观察值与实际真实值的差量」平方和达到最小以寻求估计值的方法,就叫作最小二乘法,用最小二乘法获得的估计,叫作最小二乘估计。固然,取平方和做为目标函数只是众多可取的方法之一。
最小二乘法的通常形式可表示为:
有效的最小二乘法是勒让德在 1805 年发表的,基本思想就是认为测量中有偏差,因此全部方程的累积偏差为
咱们求解出致使累积偏差最小的参数便可:
勒让德在论文中对最小二乘法的优良性作了几点说明:
对于最后一点,从统计学的角度来看是很重要的一个性质。推理以下:假设真值为,x1, ... , xn为n次测量值, 每次测量的偏差为ei = xi -
,按最小二乘法,偏差累积为
求解 使
达到最小,正好是算术平均
。
因为算术平均是一个历经考验的方法,而以上的推理说明,算术平均是最小二乘的一个特例,因此从另外一个角度说明了最小二乘方法的优良性,使咱们对最小二乘法更加有信心。
最小二乘法发表以后很快获得了你们的承认接受,并迅速的在数据分析实践中被普遍使用。不过历史上又有人把最小二乘法的发明归功于高斯,这又是怎么一回事呢。高斯在1809年也发表了最小二乘法,而且声称本身已经使用这个方法多年。高斯发明了小行星定位的数学方法,并在数据分析中使用最小二乘方法进行计算,准确的预测了谷神星的位置。
说了这么多,貌似跟本文的主题SVM没啥关系呀,别急,请让我继续阐述。本质上说,最小二乘法便是一种参数估计方法,说到参数估计,我们得从一元线性模型提及。
3.4.二、最小二乘法的解法
什么是一元线性模型呢? 请容许我引用这里的内容,先来梳理下几个基本概念:
对于一元线性回归模型, 假设从整体中获取了n组观察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。对于平面中的这n个点,能够使用无数条曲线来拟合。要求样本回归函数尽量好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。
选择最佳拟合曲线的标准能够肯定为:使总的拟合偏差(即总残差)达到最小。有如下三个标准能够选择:
最经常使用的是普通最小二乘法( Ordinary Least Square,OLS):所选择的回归模型应该使全部观察值的残差平方和达到最小,即采用平方损失函数。
咱们定义样本回归模型为:
其中ei为样本(Xi, Yi)的偏差。
接着,定义平方损失函数Q:
则经过Q最小肯定这条直线,即肯定,以
为变量,把它们看做是Q的函数,就变成了一个求极值的问题,能够经过求导数获得。
求Q对两个待估参数的偏导数:
根据数学知识咱们知道,函数的极值点为偏导为0的点。
解得:
这就是最小二乘法的解法,就是求得平方损失函数的极值点。自此,你看到求解最小二乘法与求解SVM问题何等类似,尤为是定义损失函数,然后经过偏导求得极值。
OK,更多请参看陈希孺院士的《数理统计学简史》的第4章、最小二乘法。
在上文中,咱们提到了求解对偶问题的序列最小最优化SMO算法,但并未提到其具体解法。首先看下最后悬而未决的问题:
等价于求解:
1998年,Microsoft Research的John C. Platt在论文《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》中提出针对上述问题的解法:SMO算法,它很快便成为最快的二次规划优化算法,特别是在针对线性SVM和数据稀疏时性能更优。
接下来,我们便参考John C. Platt的这篇文章来看看SMO的解法是怎样的。
3.5.一、SMO算法的推导
我们首先来定义特征到结果的输出函数:
注:这个u与咱们以前定义的实质是同样的。
接着,从新定义下我们原始的优化问题,权当从新回顾,以下:
求导获得:
代入中,可得
。
经过引入拉格朗日乘子转换为对偶问题后,得:
s.t:
且
注:这里获得的min函数与咱们以前的max函数实质也是同样,由于把符号变下,即由min转化为max的问题,且yi也与以前的等价,yj亦如此。
通过加入松弛变量后,模型修改成:
从而最终咱们的问题变为:
下面要解决的问题是:在上求上述目标函数的最小值。为了求解这些乘子,每次从中任意抽取两个乘子
和
,而后固定
和
之外的其它乘子
,使得目标函数只是关于
和
的函数。这样,不断的从一堆乘子中任意抽取两个求解,不断的迭代求解子问题,最终达到求解原问题的目的。
而原对偶问题的子问题的目标函数能够表达为:
其中
为了解决这个子问题,首要问题即是每次如何选取和
。实际上,其中一个乘子是违法KKT条件最严重的,另一个乘子则由另外一个约束条件选取。
根据KKT条件能够得出目标函数中取值的意义:
这里的仍是拉格朗日乘子:
而最优解须要知足KKT条件,即上述3个条件都得知足,如下几种状况出现将会出现不知足:
也就是说,若是存在不知足KKT条件的,那么须要更新这些
,这是第一个约束条件。此外,更新的同时还要受到第二个约束条件的限制,即
所以,若是假设选择的两个乘子和
,它们在更新以前分别是
、
,更新以后分别是
、
,那么更新先后的值须要知足如下等式才能保证和为0的约束:
其中,是常数。
两个因子很差同时求解,因此可先求第二个乘子的解(
),获得
的解(
)以后,再用
的解(
)表示
的解(
)。
为了求解,得先肯定
的取值范围。假设它的上下边界分别为H和L,那么有:
接下来,综合和
这两个约束条件,求取
的取值范围。
当y1 != y2时,根据可得
,因此有
,
,以下图所示:
当y1 = y2时,一样根据可得:
,因此有
,
,以下图所示:
如此,根据y1和y2异号或同号,可得出的上下界分别为:
回顾下第二个约束条件,令上式两边乘以y1,可得
其中,。
所以能够用
表示,
,从而把子问题的目标函数转换为只含
的问题:
对求导,可得
化简下:
而后将、
、和
代入上式可得:
令(表示预测值与真实值之差),
,而后上式两边同时除以
,获得一个关于单变量
的解:
这个解没有考虑其约束条件,便是未经剪辑时的解。
而后考虑约束可获得通过剪辑后的
的解析解为:
求出了后,即可以求出
,得
。
那么如何选择乘子和
呢?
而b在知足下述条件:
下更新b:
且每次更新完两个乘子的优化后,都须要再从新计算b,及对应的Ei值。
最后更新全部,y和b,这样模型就出来了,从而便可求出我们开头提出的分类函数:
此外,这里也有一篇相似的文章,你们能够参考下。
3.5.二、SMO算法的步骤
综上,总结下SMO的主要步骤,以下:
意思是,
假定在某一次迭代中,须要更新,
对应的拉格朗日乘子
,
,那么这个小规模的二次规划问题写为:
那么在每次迭代中,如何更新乘子呢?引用这里的两张PPT说明下:
知道了如何更新乘子,那么选取哪些乘子进行更新呢?具体选择方法有如下两个步骤:
最后,每次更新完两个乘子的优化后,都须要再从新计算b,及对应的Ei值。
综上,SMO算法的基本思想是将Vapnik在1982年提出的Chunking方法推到极致,SMO算法每次迭代只选出两个份量ai和aj进行调整,其它份量则保持固定不变,在获得解ai和aj以后,再用ai和aj改进其它份量。与一般的分解算法比较,尽管它可能须要更多的迭代次数,但每次迭代的计算量比较小,因此该算法表现出较好的快速收敛性,且不须要存储核矩阵,也没有矩阵运算。
3.5.三、SMO算法的实现
行文至此,我相信,SVM理解到了必定程度后,是的确能在脑海里从头到尾推导出相关公式的,最初分类函数,最大化分类间隔,max1/||w||,min1/2||w||^2,凸二次规划,拉格朗日函数,转化为对偶问题,SMO算法,都为寻找一个最优解,一个最优分类平面。一步步梳理下来,为何这样那样,太多东西能够追究,最后实现。以下图所示:
至于下文中将阐述的核函数则为是为了更好的处理非线性可分的状况,而松弛变量则是为了纠正或约束少许“不安分”或脱离集体很差归类的因子。
台湾的林智仁教授写了一个封装SVM算法的libsvm库,你们能够看看,此外这里还有一份libsvm的注释文档。
除了在这篇论文《fast training of support vector machines using sequential minimal optimization》中platt给出了SMO算法的逻辑代码以外,这里也有一份SMO的实现代码,你们能够看下。
或许咱们已经听到过,SVM在不少诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有不少的应用,但或许你并没强烈的意识到,SVM能够成功应用的领域远远超出如今已经在开发应用了的领域。
3.6.一、文本分类
一个文本分类系统不只是一个天然语言处理系统,也是一个典型的模式识别系统,系统的输入是须要进行分类处理的文本,系统的输出则是与文本关联的类别。因为篇幅所限,其它更具体内容本文将再也不详述。
OK,本节虽取标题为证实SVM,但聪明的读者们想必早已看出,其实本部分并没有多少证实部分(特此致歉),怎么办呢?能够参阅《支持向量机导论》一书,此书精简而有趣。本节完。
本文发表后,微博上的不少朋友给了很多意见,如下是节选的一些精彩评论:
很是享受这种全民大讨论的年代,没有谁必定就对或必定就错,而是各自发表各自的理解看法,真棒!
OK,此文从最初2012年5月开始动笔,到后续不断的修改,创造了三个之最,即所写时间最长,所花心血最大,所改次数最多,由于个人目标是让没有任何机器学习基础的都能看懂此文,因此老是不停的改,不停的改,不想放过任何一个小的细节。再者,引用侯捷的一句话是:天下大做,必做于细。
最后,很是感谢pluskid及诸多朋友们的文章及著做,让我有机会在其基础上总结、深刻。有任何问题,敬请广大读者随时不吝批评指正,感谢。
本文PDF版
本文会一直不断翻新,再者,上述 4 个PDF的阅读体验也还不是最好的,若是有朋友制做了更好的PDF,欢迎分享给我:weibo.com/julyweibo,谢谢。
July、二零一六年一月十七日第N次修改(N > 100)。
重大消息:个人新书《编程之法:面试和算法心得》终于在2015年10月14日上架开卖了!京东抢购地址:item.jd.com/11786791.ht…。京东、当当、亚马逊等各大网店均已有现货销售。新书收录了本篇SVM,且新书质量远高于博客。July、二零一五年十月二十九日。