简介:
支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型。他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的超平面将数据划分开。所以感知机的超平面可以有无数个,但是SVM的超平面只有一个。此外,SVM在引入核函数之后可以处理非线性问题。
SVM根据数据的不同可以分为以下三种形式:
1.线性可分支持向量机,也叫做硬间隔支持向量机,处理的数据是线性可分的,通过硬间隔最大化来学习一个线性可分的模型。
2.线性支持向量机,也叫做软间隔支持向量机,当数据近似线性可分时,通过引入松弛因子,软间隔最大化学习一个线性可分的模型。
3.非线性支持向量机,当数据线性不可分时,通过引入核函数将数据映射到高维空间后,学习得到一个非线性支持向量机。
线性可分支持向量机
考虑一个二分类问题,当数据可以在分布空间中通过一个超平面将正负样例分割开,一面为正类,一面为负类,我们就称数据是线性可分,这个分离超平面的方程为:w*x+b=0。而在线性可分数据中存在着无数个超平面可以将数据分割开(参考感知机),我们要找到其中最好的超平面,这个超平面不仅可以将训练集数据很好的划分开,还有更好的泛化能力。下图中很显然直线B是最好的一条分割线,所以选择间隔最大的一个超平面作为我们需要的最优的超平面。
![](https://upload-images.jianshu.io/upload_images/3395407-2a103a0d3f03b6e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
求解超平面w*x+b=0就是求w和b,以及对应的分类决策函数f(x)=sign(w*x+b),称之为线性可分支持向量机。
根据点到直线距离公式:
![](https://upload-images.jianshu.io/upload_images/3395407-b624ef4c81d9a11b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其中A为w向量,C为b,因为超平面的y值为0,所以对于支持向量机的点到超平面距离可以写作:
![](https://upload-images.jianshu.io/upload_images/3395407-4fc7d4dfa5a486a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
又因为w*x+b的边界为正负1,两个边界到超平面的距离和γ等于2倍的r,所以图3又可以写作:
![](https://upload-images.jianshu.io/upload_images/3395407-3921a557a85a3f5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这就是几何间隔。下图是支持向量机的各个概念图:
![](https://upload-images.jianshu.io/upload_images/3395407-ea63ef50a6c17773.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
当数据点为正类时,其y=+1,w*x+b>=+1,当数据点为负类时y=-1,w*x+b<=-1,所以y*(w*x+b)始终大于等于1,其中y*(w*x+b)成为函数间隔。
要找到间隔最大的超平面,也就是要找到满足y*(w*x+b)>=1约束条件的参数w和b,使得γ最大。即:
![](https://upload-images.jianshu.io/upload_images/3395407-8a96e8825080653b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
显然为了最大化间隔,仅需最大化||w||,这等价于最小化||w||的2次方,所以可以重写为:
![](https://upload-images.jianshu.io/upload_images/3395407-4d43e2cbe7b07157.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其中目标函数和约束函数都是连续可微的凸函数,并且目标函数是二次函数,约束函数是仿射函数,所以该约束问题是一个凸二次规划问题。
求解凸二次规划约束问题常用的办法是引入拉格朗日乘子,通过求解对偶问题得到原始问题的解。这就是线性可分支持向量机的对偶算法。
首先定义拉格朗日函数,对每个不等式约束引入拉格朗日乘子αi>=0,i=1,2,3....n.拉格朗日函数为:
![](https://upload-images.jianshu.io/upload_images/3395407-89916507165828c8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样就把带有约束问题的求极值问题转为无约束求极值问题,接下来根据拉格朗日对偶性求解原始问题的对偶问题:
![](https://upload-images.jianshu.io/upload_images/3395407-5675c8508a8e4d25.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以上就是求解线性可分支持向量机的全部过程,求解得到w和b之后就可以得到分类超平面:
![](https://upload-images.jianshu.io/upload_images/3395407-a5974836f03a7179.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以及分类决策函数:
![](https://upload-images.jianshu.io/upload_images/3395407-a7885c80f25d84c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
根据图9中w*和b*的结果可以看出,w*和b*只依赖于αi>0对应的(xi,yi)样本点,这些样本点称为支持向量。
线性支持向量机
当数据近似线性可分时,也就是说数据中存在噪声点,我们通过引入松弛因子,使函数间隔加上松弛因子ξ后大于等于1,这样约束条件就变成:
![](https://upload-images.jianshu.io/upload_images/3395407-d04f9e5060d6a469.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
对于每个松弛因子ξi需要支付一个代价,所以目标函数也就是代价函数变为:
![](https://upload-images.jianshu.io/upload_images/3395407-5acce3c987d5c264.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其中C>0称为惩罚参数,是超参数需要我们手动调参,C值越大时对误分类的惩罚增大,支持向量机的间隔宽度越窄,C值越小时对误分类的惩罚越小,支持向量机的间隔宽度越宽。而ξ的几何意义代表着,误分类数据点离正确分类一侧的距离,是几何距离。
那么这个松弛因子ξ是怎么来的呢?因为数据是近似可分的存在着许多噪音点,所以当计算代价函数时,这些误分类点要算入代价函数中去。这些误分类点的函数间隔y*(w*x+b)<=-1,所以代价函数可以写成带有0/1损失函数的集合函数,就是当数据点的函数间隔减去1小于0的话(误分类点),需要计算入代价函数,数据点的函数间隔减去1大于0的话(正确分类点),不需要计算入代价函数:
![](https://upload-images.jianshu.io/upload_images/3395407-ed59dc2e2ba9a31c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
但是0/1损失函数的数学性质不好,非凸非连续性。所以一般使用他的代替损失函数“hinge损失max(0,1-z)”代替它,则代价函数也就是目标函数变为:
![](https://upload-images.jianshu.io/upload_images/3395407-fb6b38c47cd97a11.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
用ξ替代max部分,就是ξ<=1-y*(w*x+b),所以带有约束条件的目标(代价)函数就变为下面的形式:
![](https://upload-images.jianshu.io/upload_images/3395407-b4ce30107c098eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
所以SVM的损失函数也可以看作是带有L2正则项(||w||^2)的hinge损失函数。以上就是线性支持向量机的带有约束条件的优化目标函数,求解w和b的过程与线性可分的方法一致,都是通过引入拉格朗日乘子,这里不再重复。其中一些列需要满足的约束条件称为KKT条件。
非线性支持向量机
当数据样本非线性可分时,也就是在当前的数据空间内(或者说当前维度内)无法找到一个超平面将数据分割开,那么需要我们将数据从当前的维度映射到更高维度后,使数据变成线性可分的,而将数据映射到高维的函数称之为核函数。
为什么在SVM求解带有约束条件的最优化问题时我们使用引入拉格朗日乘子方法,一是因为求解简单,二是可以很方便的引入核函数K(x,z)。
通过引入核函数之后,对偶问题的目标函数就变成:
![](https://upload-images.jianshu.io/upload_images/3395407-e8e2e7a27081d4bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后求解出w*和b*之后的决策分类函数:
![](https://upload-images.jianshu.io/upload_images/3395407-8f45db961d5985b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样通过核函数的引入,可以用求解线性支持向量机的方法求解非线性支持向量机。学习是隐式的,不是了解核函数是如何计算以及数据到底被映射到哪一维空间的,但是需要我们手动的选择核函数。常用的核函数有:
多项式核:
![](https://upload-images.jianshu.io/upload_images/3395407-e5b0c9ced4209931.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
高斯核(径向基核):
![](https://upload-images.jianshu.io/upload_images/3395407-23ebe7e76461c914.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
线性核,sigmoid核以及其他核函数等。通常使用先验知识或者交叉验证的方式选择核函数,但是如果无先验知识的情况下,一般选择高斯核。为什么选择高斯核呢?因为可以将数据映射到无穷维空间。
SMO序列最小最优化
该学习方法是为了简单求解SVM中的参数的一个算法,并不是很重要(调包侠^-^),所以没有很详细的看,以后有时间看完再更新到本文中。
待更新。。
参考书籍:
《统计学习方法》李航 著
《机器学习》 周志华 著