机器学习 -- 支持向量机SVM

1. 背景

  1. 最先是由Corinna Cortes和Vapnik等于1995年首先提出的
  2. 深度学习(2012)出现以前,SVM被认为是机器学习中近十几年来最成功,表现最好的算法

2. 机器学习的通常框架

训练集 => 提取特征向量 => 结合必定的算法(分类器:好比决策树,KNN) => 得出结果算法

3. 简单介绍

3.1 例子

图中有黑色和白色两类色点,很明显H1不能分开两类点,H2勉强能够,可是H3效果是最好的。margin越大,产生偏差的可能性越小。框架

3.2 SVM的主要内容

SVM寻找区分两类的超平面(hyper plane),使边际(margin)最大,当一个新的n维点输入时根据其在超平面的哪一侧将其归为那一类。机器学习

下面介绍边际的概念:学习

Q1:总共能够有多少个可能的超平面?
A1:无数条测试

Q2:如何选取使边际(margin)最大的超平面(Max Margin Hyperplane)?
A2:超平面到一侧最近点的距离等于到另外一侧最近点的距离,两侧的两个超平面平行。优化

Q3:为何要选择边际最大的超平面呢
A3:是为了新的测试点输入时能够根据在超平面的哪一侧更精确地判断测试点是属于哪一类样例。spa

 

3. 线性可区分(linear separable)和线性不可区分(linear inseparable)

 

前面几张图的例子都是比较完美的例子,能够用一条直线来将两类样例分开,称为线性可区分,而如图的状况下就没办法直接用一条直接将两类样例分开,称为线性不可区分。后者更复杂,因此这里咱们先讨论线性可区分的状况。.net

4. 定义与公式创建

超平面能够定义为(中间那条线):W*X + b = 0orm

这里W是N维的权重,W={w1,w2,.....wn}
n是特征值得个数
X是N维的训练样例,例如一个样本点的坐标是(3,8),则xT=(3,8) ,而不是x=3(通常说向量都是说列向量,所以以行向量形式来表示时,就加上转置)。
b是偏向biasblog

就比如二维直线的方程式y=kx+吧,这里只是扩展到N维,点的坐标是(X1,X2,X3,...,Xn),W就比如扩展到N维的斜率k。

4.1 超平面方程

假设二维特征向量:X=(x1,x2),把b想象为额外的wight(w0),超平面方程为:

W*X + b = 0   =>  向量W*向量X +w0=0  =>  (w1,w2)*(x1,x2) + w0 = 0  =>  w1*x1 + w2*x2 + w0 = 0

全部超平面右上方的点知足:w1*x1 + w2*x2 + w0 > 0

全部超平面左上方的点知足:w1*x1 + w2*x2 + w0 < 0

将两类样例的分类标记classlabel分别用值+1和-1,字母y表示,超平面两边边际的两个平行的超平面用H1和H2表示,令两侧边际线上的点代入结果=1和-1,则H1,H2外侧:
                      H1:W1*X1 + W2*X2 + b >= 1, y=+1
                      H2:W1*X1 + W2*X2 + b <= -1, y=-1
综合以上两式,获得公式(1):
                      y*(W1*X1 + W2*X2 + b) >= 1 
也就是说全部训练集的点都知足这个公式

全部坐落在边际的两边的超平面上的被称做"支持向量(support vectors)",分界的超平面和H1,H2上任意一点的距离=1/(||W||),||W||是向量的范数, (i.e:其中||W||是向量的范数(norm))。

因此,最大边际距离为:2/(||W||)

5. 求解

5.1 SVM如何找出最大边际的超平面呢(MMH)

利用一些数学推导,以上公式(1)可变为有限制的凸优化问题(convex quadratic optimization);
利用karush-Kuhn-Tucker(KKT)条件和拉格朗日公式,能够推出MMH能够被表示为如下"决定边界":

其中,yi是支持向量点Xi(support vector)的类别标记(class label),XT是要测试的实例,阿尔法i和b0是刚才一系列计算中获得的具体值,l是支持向量点的个数。

5.2 对于任何测试(要归类的)实例,代入以上公式,得出的符号是正仍是负决定

6. 例子

 

如图,已知训练集(2,3),(1,1),(2,0)这三个点,(2,3)是第一类,(1,1),(2,0)是第二类,怎样进行SVM计算呢。

首先能够看出支持向量是(2,3)和(1,1),向量W =(2,3)-(1,1) = (a,2a)

根据公式两侧边际线上的点W1*X1 + W2*X2 + b = 1和-1,能够列出:

2*a + 3*2a + b =1
1*a + 1*2a + b = -1
解得 a=0.4,b=-2.2


向量W = (0.4,0.8)
g(向量x) = 0.4 * X1 + 0.8 * X2 - 2.2

经过这个方程就能够对平面中的点进行判断,凡是第一类的点也就是是分界线上方的点坐标代入,结果必然大于0,第二类的点代入结果必然小于0,这样也就创建了SVM的方程。

另外咱们能够看出SVM能够解决两类实例的分类问题,但通常问题中,样例的类别每每不止两类,这时候SVM是怎么处理的呢?好比有10类的样例,怎么进行分类判断?只须要创建10个SVM方程就能获得结果。好比第一个是类别1,第二个是类别2到10的集合,这样就能创建一个SVM方程;第一个是类别2,第二个是类别1和类别3到10的集合,这样就能创建第二个SVM方程,以此类推。

最后总结一下SVM的特色:

  1. 训练好的模型的算法复杂度是由支持向量的个数决定的而不是由数据的维度决定的,因此SVM不太容易产生overfitting。
  2. SVM训练出的模型彻底依赖于支持向量,即便训练集里全部非支持向量所有除去,训练出的模型也彻底同样。
  3. 一个SVM若是训练得出的支持向量个数较少,SVM训练出的模型比较容易被泛化。能够适用于个多的例子,而若是支持向量过多,那么可能针对这个例子区分得比较好,可是其余状况区分得并非很好。

 

参考:http://blog.csdn.net/ewfwewef/article/details/52824711

相关文章
相关标签/搜索