出处:结构之法算法之道blog。
前言
动笔写这个支持向量机(support vector machine)是 费了不少劲和困难的,从5月22日凌晨两点在微博上说我要写了,到此刻真正动笔要写此文,中间竟然隔了近半个月。原因很简单,一者这个东西本身就并不好 懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有不少朋友已经写得不错了(见文末参考链接..),但在描述数学 公式的时候还是显得不够。得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整概括和介绍支持向 量机的导论性的文章。
本文作为Top 10 Algorithms in Data Mining系列第二篇文章,将主要结合支持向量机导论、数据挖掘导论及网友的Free Mind的支持向量机系列而写(于此,还是一篇读书笔记,只是加入了自己的理解,有任何不妥之处,还望海涵),宏观上整体认识支持向量机的概念和用处,微观上深究部分定理的来龙去脉,证明及原理细节,力求深入浅出 & 通俗易懂。
同时,本文分三层,第一层、了解SVM,第二层、深入SVM,第三层、证明SVM,最后谈谈SVM的应用,以此逐层深入,从而照顾到水平深浅度不同的读 者,在保证浅显直白的基础上尽可能深入,还读者一个明明白白透透彻彻的SVM,希望我能做到。还是那句原话,有任何问题,欢迎任何人随时不吝指正 & 赐教,谢谢。
第一层、了解SVM
1.0、什么是支持向量机SVM
在进入第一层之前,你只需了解什么是支持向量机SVM就够了,而要明白什么是SVM,便得从头从什么是数据挖掘说起。
数据挖掘是机器学习、数据库和统计学三者结合的产物,数据挖掘首先要确定挖掘的任务或目的,确定了挖掘任务之后,就要决定使用什么样的挖掘算法,选择了算法之后便可以实施数据挖掘操作,获取有用的信息或模式。
分类作为数据挖掘领域中一项非常重要的任务,目前在商业上应用最多(比如分析型CRM里面的客户分类模型,客户流失模型,客户盈利等等,其本质上都属于分 类问题)。而分类的目的则是学会一个分类函数或分类模型(或者叫做分类器),该模型能吧数据库中的数据项映射到给定类别中的摸一个,从而可以用于预测未知 类别。
而本文将要介绍的支持向量机SVM算法便是一种分类方法。
- 所谓支持向量机,顾名思义,分为两个部分了解,一什么是支持向量(简 单来说,就是支持 or 支撑平面上把两类类别划分开来的超平面的向量点,下文将具体解释),二这里的“机”是什么意思。我先来回答第二点:这里的“机(machine,机器)” 便是一个算法。在机器学习领域,常把一些算法看做是一个机器,如分类机(当然,也叫做分类器),而支持向量机本身便是一种监督式学习的方法(什么是监督学 习与非监督学习,请参见第一篇),它广泛的应用于统计分类以及回归分析中。
对于不想深究SVM原理的同学(比如就只想看看SVM是干嘛的),那么,了解到这里便足够了,不需上层。而对于那些喜欢深入研究一个东西的同学,甚至究其本质的,咱们则还有很长的一段路要走,万里长征,咱们开始迈第一步吧(深信你能走完)。
1.1、线性分类
OK,在讲SVM之前,咱们必须先弄清楚一个概念:线性分类器。
-
这里我们考虑的是一个两类的分类问题,数据点用
x 来表示,这是一个n 维向量,而类别用y 来表示,可以取 1 或者 -1 ,分别代表两个不同的类。一个线性分类器就是要在n 维的数据空间中找到一个超平面,其方程可以表示为:wTx b=0
但即使我已经给出了线性分类器的定义及公式,相信,仍然是有相当一部分读者是不知所谓的超平面(w,b)中w,和b所指是何物的?但本文尽量不留遗漏,以期尽量将有必要了解的技术细节原原本本的和盘托出,如下:
- 上面已经说过,两类问题的分类通常用一个实值函数f:(R^n 即指n唯平面)按照这样的方式操作:当f(x)>=0,输入想x=(x1,...xn)‘赋给正类,否则赋给负类,考虑当f(x),x属于X是线性 函数的情况,函数可以写为:f(x)=<w,b> b。这个式子的几何解释是,<w,x> b=0所定义的超平面讲输入空间X(各种点)分为两半。也就是说,超平面是维数为n-1的仿射子空间,它将空间分为两部分,这两部分对应输入中两类不同的 点,对应着超平面上面的正区域和超平面下面的负区域,当b的值变化时,超平面平行于自身移动,示意图如下(注意体会途中w,b的几何意义,我们实际应用 SVM的过程中,所谓调参数调的就是这两个参数w和b):
1.2、线性分类的一个例子
OK,来理论可能读者看不懂,咱们来直接举一个例子吧,且举最简单的例子,一个二维平面(一个超平面,在二维空间中的例子就是一条直线),如下图所示,平面上有两种不同的点,分别用两种不同的颜色表示,一种为红颜色的点,另一种则为蓝严肃的点,红颜色的线表示一个可行的超平面。
从上图中我们可以看出,这条红颜色的线把红颜色的点和蓝颜色的点分开来了。而这条红颜色的线就是我们上面所说的超平面,而现在的情况是,这个所谓的超平面的的确确便把这两种不同颜色的点分隔开来,换句话说,事实上,是存在这样一个超平面可以把两类数据分隔开来的,比如,在超平面一边的数据点所对应的
- 当然,有些时候(或者说大部分时候)数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在(不过关于如何处理这样的问题我们后面会讲),这里先从最简单的情形开始推导,就假设数据都是线性可分的,亦即这样的超平面是存在的。
1.3、 functional margin与geometrical margin
从几何直观上来说,由于超平面是用于分隔两类数据的,越接近超平面的点越“难”分隔,因为如果超平面稍微转动一下,它们就有可能跑到另一边去。反之,如果是距离超平面很远的点,例如图中的右上角或者左下角的点,则很容易分辩出其类别。
结合上图,我们直接定义 functional margin 为
- 对 functional margin 为 γˆ=y(wTx b)=yf(x)的解释:上面直接给出它的定义并没有说明来由,其实这是有来头的。一般来说,我们定义:样例(xi,yi)对应于超平面(w,b)的函数的间隔量为:γˆ=y(wTx b)。注意,γˆ>0意 味着(xi,yi)被正确分类,超平面(w,b)对应于训练集S的函数的间隔分布就是训练集S中样例的间隔分布。有时,所谓间隔分布的最小值指超平面 (w,b)对应于训练集S的函数的间隔。最终,训练集S的间隔是在所有超平面上的最大几何间隔,实现这个最大间隔的超平面称之为最大间隔超平面,对于线性 可分的训练集来说,间隔的值都讲是正值。下图是xi,xj分别到超平面的几个间隔距离γi,γj:
下面不妨来看看functional margin与geometrical margin二者之间的关系。如图所示,对于一个点
- OK,我来推到下上述式子的代入过程:因为f(x)=w^T b,把x=x0 r*w/||w||代入f(x)得,f(x)=f(x。 r *w / ||w||) = w^T(x0 r* w/ ||w||) b = w^T*x0 w^T*r*w/ ||w|| b = w^T*r*w/||w||=r*||w||,所以γ=f(x)/||w||=(w^T*b)/||w||。证毕。
又由于
不过,这里的
- 因为γˆ=y(wTx b)=yf(x),所以γ˜=yγ=(y*f(x))/||w||=γˆ/||w||。
1.4、最大间隔分类器maximum margin classifier的定义
通过上文,我们已经很明显的看出,functional margin 和 geometrical margin 相差一个
不过这里我们有两个 margin 可以选,不过 functional margin 明显是不太适合用来最大化的一个量,因为在 hyper plane 固定以后,我们可以等比例地缩放
当然,还需要满足一些条件,根据 margin 的定义,我们有
其中
通过求解这个问题,我们就可以找到一个 margin 最大的 classifier ,如下图所示,中间的红色线条是 Optimal Hyper Plane ,另外两条线到红线的距离都是等于
到此,算是完成了 Maximum Margin Classifier 的介绍,通过最大化 margin ,我们使得该分类器对数据进行分类时具有了最大的 confidence 。对于什么是Support Vector Machine ,我们可以先这样理解,如上图所示,我们可以看到 hyper plane 两边的那个 gap 分别对应的两条平行的线(在高维空间中也应该是两个 hyper plane)上有一些点,显然两个 hyper plane 上都会有点存在,否则我们就可以进一步扩大 gap ,也就是增大
1.5、到底什么是Support Vector
上节,我们介绍了Maximum Margin Classifier,但并没有具体阐述到底什么是Support Vector,本节,咱们来重点阐述这个概念。咱们不妨先来回忆一下上次最后一张图:
可以看到两个支撑着中间的 gap 的超平面,它们到中间的纯红线 separating hyper plane 的距离相等,即我们所能得到的最大的 geometrical margin
很显然,由于这些 supporting vector 刚好在边界上,所以它们是满足
到此为止,算是了解到了SVM的第一层。
第二层、深入SVM
2.1、从线性可分到线性不可分
当然,除了在上文中所介绍的从几何直观上之外,支持向量的概念也可以从其优化过程的推导中得到。虽然上一节给出了目标函数,却没有讲怎么来求解。现在就让我们来处理这个问题。回忆一下之前得到的目标函数:
这个问题等价于(在这里加上平方,一个系数,显然这两个问题是等价的):
- 到这个形式以后,就可以很明显地看出来,它是一个凸优化问题,或者更具体地说,它是一个二次优化问题——目标函数是二次的,约束条件是线性的。这个问题可以用任何现成的 QP (Quadratic Programming) 的优化包进行求解。所以,我们的问题到此为止就算全部解决了。
- 虽然这个问题确实是一个标准的 QP 问题,但是它也有它的特殊结构,通过 Lagrange Duality 变 换到对偶变量 (dual variable) 的优化问题之后,可以找到一种更加有效的方法来进行求解——这也是 SVM 盛行的一大原因,通常情况下这种方法比直接使用通用的 QP 优化包进行优化要高效得多。此外,在推导过程中,许多有趣的特征也会被揭露出来,包括刚才提到的 supporting vector 的问题。
至于上述提到,关于什么是Lagrange duality,简单地来说,通过给每一个约束条件加上一个 Lagrange multiplier,我们可以将它们融和到目标函数里去
然后我们令
、
容易验证,当某个约束条件不满足时,例如
这里用
当然,交换以后的问题不再等价于原问题,这个新问题的最优值用
首先要让
带回
此时我们得到关于 dual variable
如前面所说,这个问题有更加高效的优化算法,不过具体方法在这里先不介绍,让我们先来看看推导过程中得到的一些有趣的形式。首先就是关于我们的 hyper plane ,对于一个数据点
w=∑ni=1αiyixi
因此
这里的形式的有趣之处在于,对于新点 x的预测,只需要计算它与训练数据点的内积即可(这里⋅,⋅表示向量内积),这一点至关重要,是之后使用 Kernel 进行非线性推广的基本前提。此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非 Supporting Vector 所对应的系数 α 都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。
为什么非支持向量对应的
注意到如果
把上述所有这些东西整合起来,便得到了一个maximum margin hyper plane classifier,这就是所谓的支持向量机(Support Vector Machine)。当然,到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,不过,在得到了 dual 形式之后,通过 Kernel 推广到非线性的情况就变成了一件非常容易的事情了。
2.2、核函数Kernel
咱们首先给出核函数的来头:
- 在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数
κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。由于核函数的优良品质,这样的非线性扩展在计算量上并没有比原来复杂多少,这一点是非常难得的。当然,这要归功于核方法——除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。
也就是说,Minsky和Papert早就在20世纪60年代就已经明确指出线性学习器计算能力有限。为什么呢?因为总体上来讲,现实世界复杂的应用需要 有比线性函数更富有表达能力的假设空间,也就是说,目标概念通常不能由给定属性的简单线性函数组合产生,而是应该一般地寻找待研究数据的更为一般化的抽象 特征。
而下文我们将具体介绍的核函数则提供了此种问题的解决途径,从下文你将看到,核函数通过把数据映射到高维空间来增加第一节所述的线性学习器的能力,使得线 性学习器对偶空间的表达方式让分类操作更具灵活性和可操作性。我们知道,训练样例一般是不会独立出现的,它们总是以成对样例的内积形式出现,而用对偶形式 表示学习器的优势在为在该表示中可调参数的个数不依赖输入属性的个数,核函数通过使用恰当的核函数来替代内积,可以隐式得将非线性的训练数据映射到高维空 间,而不增加可调参数的个数(当然,前提是核函数能够计算对应着两个输入特征向量的内积)。
前面我们介绍了线性情况下的支持向量机,它通过寻找一个线性的超平面来达到对数据进行分类的目的。不过,由于是线性方法,所以对非线性的数据就没有办法处 理了。例如图中的两类数据,分别分布为两个圆圈的形状,不论是任何高级的分类器,只要它是线性的,就没法处理,SVM 也不行。因为这样的数据本身就是线性不可分的。
对于这个数据集,我可以悄悄透露一下:我生成它的时候就是用两个半径不同的圆圈加上了少量的噪音得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为
关于新的坐标
再进一步描述 Kernel 的细节之前,不妨再来看看这个例子映射过后的直观例子。当然,我没有办法把 5 维空间画出来,不过由于我这里生成数据的时候就是用了特殊的情形,具体来说,我这里的超平面实际的方程是这个样子(圆心在
因此我只需要把它映射到
现在让我们再回到 SVM 的情形,假设原始的数据时非线性的,我们通过一个映射
现在则是在映射过后的空间,即:
而其中的
.......
预告:
本文正在不断迭代,增补中,预计6月中旬初步完成,前期主要结合网友的Free Mind的支持向量机系列而写,后期将结合支持向量机导论,[美] Nello Cristianini / John Shawe-Taylor 著,深究部分定理的来龙去脉,证明及原理细节。