支持向量机(Support Vector Machine, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的建个最大的线性分类器,间隔最大使它有别于感知机;支持向量还包括核技巧,这使他成为实质上的非线性分类器。

假设输入为




支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机训练集多少个


输出为


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机的基本思想_02


  1. 在特征空间如何进行二分类

直观的做法是在特征空间找出一个一个超平面,可以把需要分类的点分隔在超平面的两侧(线性可分

但实际情况是往往找不到一个如此完美的超平面进行分类(线性不可分),那么一般可以采取以下两种方法:

  1. 找出一个超平面进行近似分割(approximate separation),也就是允许少部分点分类错误
  2. 扩大特征空间,使超平面可以进行分割

  1. 超平面

超平面的形式如下:


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机预测matlab代码_03


我们可以知道,若,那么超平面就是一条直线,若p=3,那么超平面就是一个平面,若


, 那么超平面我们无法直观的表达出来,所以称之为超平面。


其中向量


称之为该超平面的法向量,垂直于超平面


如果特征空间是二维空间,SVM就是要找出一条合适的直线,把不同的类分在直线的两侧


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机matlab代码程序_04


即当


时,


, 当


时,


,


等价于




2.线性可分支持向量机学习算法---最大间隔法

当特征平面的类线性可分,那么我们总可以找到超平面把不同的类分开,但是这样的超平面并不是唯一的,如下图:


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机 拟合 函数 matlab_05


那么SVM就是要找出这些平面当中,能够使间隔最大化的那一个平面。可以表达为以下的最优化问题:



或者



其实我们可以直观的这么想象,如果在二维空间中,最大间隔法就是在两个类别的点之间塞进一根尽可能宽的木条,那么我们需要的分离超平面就是这跟木条的中线。在木条边上的点称为支持向量(support vectors ),木条宽度依赖于分离超平面的法向量


,等于


.


我们可以知道在决定分离超平面的时候,只有支持向量是起作用的,而其他的样本点并不起作用,如果改变支持变量的位置,那么会改变所求解的分离超平面,但是如果在间隔边界以外移动其他实例点,甚至去掉或者增加一部分的点,也不会改变求解出来的分离超平面。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称之为支持向量机。


3.线性可分支持向量机学习算法---对偶算法

最大间隔法属于线性规划的内容,有时候求最优解并不一定好求,对偶算法可以使问题更加容易求解,具体推导这里不做详细展开,有兴趣可以自己查阅李航的统计学习方法。

首先,根据条件(1)定义拉格朗日函数:



输入:线性可分训练集

,其中

输出:分离超平面和分类决策函数
1)构造并求解约束最优化问题


求得最优解


2)计算


并选择

的一个正分量

计算


(3)求得分离超平面


分类决策函数:

例:已知一个如下图所示的训练数据集,其正例点是


,负例点是


,试用对偶算法求出分离超平面。


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机matlab代码程序_06


解:根据所给的数据,对偶问题是



支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机预测matlab代码_07


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机 拟合 函数 matlab_08



4.线性支持向量机--线性不可分问题的原始问题

在现实中,数据点有可能是不可分的(并且不可分的情况更多),如下图所示


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机预测matlab代码_09


或者在原来样本中增加了一部分噪声数据,那么可能会导致求出来的线性分离超平面变化很大(如下图所示),但这些结果都不是我们想要的


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机matlab代码程序_10


为了解决以上的两种情况,我们采取引入一个松弛变量(slack variable)


,使函数间隔


加上松弛变量


大于等于1。这样,约束条件变为:



可以知道,当

同时对每个松弛变量支付一个代价


。那么目标函数由原来的


变成



这里的参数


称为惩罚函数,一般由实际问题决定,当C值较小时,对误分类数据点的容忍度较大,当C值较大时,对误分类的数据点容忍度较小。式子(3)表示要使


尽量的小即间隔尽量的大,同时使误分类点的个数尽量小,C是调和两者的系数.


所以对于现行不可分的线性支持向量机的学习问题可以表示为一下的凸二次规划:



以上的凸二次规划问题解是存在的。可以证明


的解是唯一的,但是


的解不是唯一的,


的解存在于一个区间。(有兴趣可以自行证明求解一下)



5.线性不可分问题--对偶算法

对于线性不可分的原始问题是一个凸二次规划问题,求解比较复杂,所以一般采用其对偶问题,即

输入:线性可分训练集

,其中

输出:分离超平面和分类决策函数
1) 选择惩罚函数C>0,构造并求解约束最优化问题


求得最优解


2)计算


并选择

的一个正分量

计算


(3)求得分离超平面


分类决策函数:


在步骤(2)中,对于任意符合条件的

,都可以求出一个

,但是由于

的解并不唯一,所以在实际计算当中,可以取所有符合条件的

的平均值。

以上式子(6)的拉格朗日方方程为:



对拉格朗日方程的


分别求偏导数,并且使之为0,得



其KKT条件为



若不清楚KKT条件可以参考我之前的文章

leungleung:浅谈KKT条件zhuanlan.zhihu.com


由KKT条件以及式子(9)可以得知,只有当


时,


,满足这个条件的这些点称之为支持向量(support vector)



时,


,支持向量


落在间隔边界上;



,则分类正确,


落在间隔边界和分离超平面之间;



,则


在分离超平面上



,则


位于分离超平面的误分类一侧



6.非线性支持向量机---核技巧

有时候无论C取什么样的值,都不能很好的进行分类,

但我们可以发现,如果这个时候用一条椭圆形曲线(非线性模型)就可以把点很好的分开


支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机matlab代码程序_11


但是非线性问题往往不好进行求解,常见的做法是对特征空间进行一个非线性变换,然后用求解线性问题的方法进行求解。

如以上问题,原空间为


,新空间为


,那么定义从原空间到新空间的映射:



经过变换之后,原空间的椭圆



就变换成为新空间中的直线



支持向量机 拟合 函数 matlab 支持向量机matlab代码程序_支持向量机 拟合 函数 matlab_12


核函数定义

是输入空间(欧式空间

的子集或者离散集合)。又设

为特征空间(希尔伯特空间),如果存在一个从

的映射


使得对所有的

,函数

满足条件


那么

称为核函数,

为映射函数,式中

为内积

核技巧在支持向量机当中的应用

我们可以看到在对偶算法中式子(7-1)与(7-2)都只涉及到实例与实例之间的内积,那么目标函数中的内积


可以用核函数


代替,那么对偶问题的目标函数成为



同时分类决策函数中的内积也可以用核函数代替,那么分类决策函数成为



这等价于经过映射函数


将原来的输入空间变换到一个新的特征空间,将输入空间中的内积


变换成为特征空间中的内积


,在新的特征空间里从训练样本中学习线性支持向量机。当映射函数是非线性函数时,学习到的含有核函数的支持向量机是非线性分类模型。


常用核函数

核函数一般不需要自己构造,常用的几个核函数可以解决绝大多数的问题,常见的核函数有

线性核函数:



多项式核函数:



高斯核函数:




7.SVM在多分类问题上的使用

因为SVM是一个二类分类器,不能直接对多分类问题进行分类,一般可以采取以下两种办法进行间接多分类

一对一法(one-versus-one,简称OVO SVMs或者pairwise)

  其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。

  当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。

  Libsvm中的多类分类就是根据这个方法实现的。

  假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。

  投票是这样的:
  A=B=C=D=0;
  (A,B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;
  (A,C)-classifier 如果是A win,则A=A+1;otherwise, C=C+1;
  ...
  (C,D)-classifier 如果是A win,则C=C+1;otherwise,D=D+1;
  The decision is the Max(A,B,C,D)

评价:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。

一对多法(one-versus-rest,简称OVR SVMs)

  训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

  假如我有四类要划分(也就是4个Label),他们是A、B、C、D。

  于是我在抽取训练集的时候,分别抽取

  (1)A所对应的向量作为正集,B,C,D所对应的向量作为负集;

  (2)B所对应的向量作为正集,A,C,D所对应的向量作为负集;

  (3)C所对应的向量作为正集,A,B,D所对应的向量作为负集;

  (4)D所对应的向量作为正集,A,B,C所对应的向量作为负集;

  使用这四个训练集分别进行训练,然后的得到四个训练结果文件。

  在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。

  最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。

  于是最终的结果便是这四个值中最大的一个作为分类结果。

评价:

  这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用。可以在抽取数据集的时候,从完整的负集中再抽取三分之一作为训练负集。