原始的SVM早在1963年就被发明了,但直到1992年才发明了核方法,使得SVM可以用于非线性分类。

SVM的应用:
handwritten character recognition手写字符识别
face detection 人脸检测
pedestrian detection行人检测
text categorization 文本分类

SVM把训练样本都看作高维空间的点,找一个超平面,使得两类样本尽可能宽地分开。新来的测试样本被映射到同一个空间,看它在hyperlane的哪一侧就能线性二分类。

Note:  p维空间是用p-1维的Hyperlane分隔开的。

SVM,顾名思义,支持向量是对于求解学习模型的关键(实际上SVM最终的模型只和支持向量有关,和其他的数据点向量无关),所以问题求解的复杂度直接和支持向量的个数有关。所以先说两个重点基础概念——margin & support vector。

(一) 间隔和支持向量

SVM(Support Vector Machine)的思想和其他线性模型做2分类一样,都是找个超平面(hyperplan)然后一刀切。但SVM这么成功(在90年代直接造成了NN的第二冬),自然有其独到之处,那就是在超平面的概念上,多引入了“间隔”和"支持向量"的概念。

可实现分类的超平面不唯一,我们怎么选择一个更好的超平面呢?直观上,应该是去找位于两类样本的“正中间”的那个。

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机


超平面的方程:

支持向量机的红酒案例数据集 支持向量机模型应用_SVM_02

支持向量机的红酒案例数据集 支持向量机模型应用_perl_03是法向量,他的方向与超平面正交,决定超平面的方向 ;

b是位移项,决定超平面和原点的距离。

这俩参数完全决定了超平面,所以就直接把超平面记为支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_04

(实际上最小二乘回归,逻辑回归好不容易求解出来的线性模型也是个超平面,LDA最后求出来的是个过原点的超平面,b=0)

超平面建模完毕,那么空间中任意一点到它的距离:
支持向量机的红酒案例数据集 支持向量机模型应用_SVM_05
不明白可以以二维为例,二维空间的对应的划分超平面是一条直线支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_06,点到直线的距离公式为支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_07,则点到超平面的距离为支持向量机的红酒案例数据集 支持向量机模型应用_SVM_08,推广到高维就明白上式了。

可正确分类的超平面满足:
支持向量机的红酒案例数据集 支持向量机模型应用_perl_09
but! 我们现在不仅要正确分类,而且要提出更高的标准,要留有“裕量”,即“间隔”:
支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_10
支持向量support vector使(2)中不等式的等号成立的那些距离超平面最近的那几个训练样本点。
间隔margin两个异类支持向量到超平面的距离之和。支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_11

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_12


(二)SVM的对偶问题推导

前面讲了间隔(硬间隔),我们希望硬间隔支持向量机的红酒案例数据集 支持向量机模型应用_perl_13尽量大,也就是支持向量机的红酒案例数据集 支持向量机模型应用_SVM_14尽量小,so问题转化为
支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_15

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_16

这是个二次规划问题(目标函数是变量的二次函数,约束是变量的线性不等式),并且标准形式中的Q矩阵在这里就是单位阵E,E是正定的,所以这是个凸二次规划,且在约束规定的可行域内有唯一的全局最小解。(关于二次规划详细介绍请移步xxxx)

常见的通用的二次规划算法有椭球法(ellipsoid method),内点法(interior point),增广拉格朗日法(augmented Lagrangian),梯度投影法(gradient projection),etc. 但是这个问题的规模正比于训练样本数,开销很大,所以需要根据问题特点开发更高效的算法,1998年由Platt提出的SMO算法就是典型代表。

先暂时不管具体求解,先把问题再深入分析分析,分析完了再说用SMO怎么求解支持向量机的红酒案例数据集 支持向量机模型应用_SVM_17

我们先用之前学的拉格朗日乘子法把问题转化为它的对偶问题(dual problem),共m个样本组成的不等式约束,那就引入m个KKT乘子(松弛变量)支持向量机的红酒案例数据集 支持向量机模型应用_perl_18(这里不明白的话请移步我的这篇博客),把约束写进目标函数中,构造出拉格朗日函数为:

支持向量机的红酒案例数据集 支持向量机模型应用_perl_19

松弛变量(slack variable)和训练样本是一一对应的。(one-to-one relationship)

为了得到拉格朗日对偶函数,对变量支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_20求偏导等于0,分别得到:

支持向量机的红酒案例数据集 支持向量机模型应用_perl_21
也就是说,法向量支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_22等于m个样本点向量的加权和,加权系数是支持向量机的红酒案例数据集 支持向量机模型应用_SVM_23,且这些加权系数之和为0.

把(3)代回拉格朗日函数(2),得到拉格朗日对偶函数

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_24

拉格朗日对偶问题为:

支持向量机的红酒案例数据集 支持向量机模型应用_perl_25

记录一下:我至今没懂为啥第二项符号是负??????

由于SVM的模型里有不等式约束,所以必须满足KKT条件:
支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_26
这三个式子就表明:非支持向量的KKT乘子为0,在式(3)求法向量时根本不做贡献,只有支持向量(满足KKT条件2的样本点)对模型求解有贡献。


(三)对偶问题具体求解(SMO算法)

前面第二节把SVM的基本模型转化为了对偶问题。由于原问题是凸优化问题,且训练样本里一定至少有一个非支持向量使得slater’s condition成立,所以强对偶成立,所以原问题的最优解就是对偶问题的最优解,这节就来具体讲怎么求出对偶问题的参数支持向量机的红酒案例数据集 支持向量机模型应用_SVM_17.

SMO算法是解析的方式求解,而不是数值优化,所以非常高效快速。

基本思路:每次选两个优化变量支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_28,固定其他支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_29个变量。即初始化参数支持向量机的红酒案例数据集 支持向量机模型应用_SVM_17后,迭代两个步骤till convergence:

  1. 选一对需要更新的变量支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_31
  2. 固定其他支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_32个变量,解析求出更新后的支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_31

可以看出,这个思路像极了坐标上升/下降,不过坐标上升/下降是一次优化一个变量,这里一次优化两个而已。那这里为啥要优化俩呢?这是因为第二节的公式(4),也就是最后的对偶问题里有个约束
支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_34
如果你一次只选一个变量进行优化固定其他支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_35个,那这个约束使得被选中的变量也直接固定下来了。。没得优化了。于是那就一次选俩,则有:
支持向量机的红酒案例数据集 支持向量机模型应用_perl_36
支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_37支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_38表示,代回第二节的(4),则对偶问题只有一个变量(支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_38),成了一个单变量的二次规划问题,直接对支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_38求导等于0,就可以解析求出更新后的支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_41,再代入本节(1),求出更新后的支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_42。涉及到的全是解析步骤,没有一点数值迭代优化的内容,求出来的都是闭式解(即解析解),所以极其高效。

那么关键问题来了,每次依据什么准则选两个变量呢?

  1. 第一个变量:选择KKT条件违背程度最大的变量。
    我们知道,KKT条件是成为极值点的必要条件,满足KKT则有可能是极值点。现在还没找到极值点,所以KKT肯定不满足。那么优化KKT违背程度越大的变量,目标函数的变化幅度越大。
    回顾KKT:
    支持向量机的红酒案例数据集 支持向量机模型应用_SVM_43
    对偶问题中,只有支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_44是未知变量,支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_45都已知。和支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_46有关的只有(1)(3),而(1)是对偶问题的约束,必须满足,所以初始化支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_44时一定是满足(1)的。

至于条件(3):

  • 支持向量机的红酒案例数据集 支持向量机模型应用_线性模型_48,则 支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_46 必须为0,所以若支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_50,则违背KKT,且支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机的红酒案例数据集_46越大,违背程度越大。
  • 支持向量机的红酒案例数据集 支持向量机模型应用_perl_52,则支持向量机的红酒案例数据集 支持向量机模型应用_perl_53
  1. 第二个变量:选择对应样本点和第一个变量对应的样本点距离最远的变量。这样两个变量的差别很大,对目标函数带来的变化会比更新两个相似变量大。

求出支持向量机的红酒案例数据集 支持向量机模型应用_perl_54后,支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_55由下式求出:
支持向量机的红酒案例数据集 支持向量机模型应用_SVM_56

而偏移项支持向量机的红酒案例数据集 支持向量机模型应用_perl_57的求解就要用到支持向量支持向量机的红酒案例数据集 支持向量机模型应用_SVM_58了:
支持向量机的红酒案例数据集 支持向量机模型应用_SVM_59
但支持向量通常不止一个,所以b的解也不唯一,现实中常用所有支持向量求出的b的平均值作为最终解,这样比较鲁棒:

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_60

支持向量机的红酒案例数据集 支持向量机模型应用_SVM_61是支持向量集,支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_62是支持向量的个数

由(2)(3),支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_45只和支持向量有关。直观上也很好理解,看下图,SVM的思想不像逻辑回归那样去拟合每个样本点,而是直接去找个划分平面把两类分开,那这个平面自然应该在两类的边界向量中间,它的位置支持向量机的红酒案例数据集 支持向量机模型应用_perl_57和方向支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_55支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_55的方向不是划分平面的方向,而是和划分平面正交)都由这两类样本的边界上的点决定。支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_55定了后,每个支持向量都能算出一个支持向量机的红酒案例数据集 支持向量机模型应用_perl_57,对应的平面和我们想要的超平面平行,但过那个支持向量,所以最终支持向量机的红酒案例数据集 支持向量机模型应用_perl_57用(3)这种方式算,使划分超平面位于两类的正中间。

支持向量机的红酒案例数据集 支持向量机模型应用_支持向量机_12

至此为止,则SVM的线性二分类模型参数全部求解完毕,训练完成。

感觉还是很神奇的,这么简单的一个想法,竟然能写出这么多的复杂的数学推导,而且最后得到的结论还和直观思考结果完全吻合,不得不叹服数学的神奇和强大,把朴素的思想用数学表示出来,很难,但一旦做到了,就贡献老大了。

呜呼!关于引入核方法把SVM用于非线性分类,后面会另开博文详细分析。