建议先看一下这两篇文章:
核函数(Kernel function)(举例说明,通俗易懂)
1、支持向量机简介
支持向量机(support vector machine)是一种用于分类、回归和异常值(离群点)检测的监督学习方法。
支持向量机是一种二分类模型,其基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大有别于感知机;支持向量还包括核函数,使其成为实质上的非线性分类器。
支持向量机的学习策略就是间隔最大化,可形式化为一个求解二次规划(convex quadratic programming)问题。
当训练数据线性可分时,通过硬间隔最大化(不允许出现分类错误),学习一个线性分类器,即线性可分支持向量机,又称硬间隔支持向量机;当训练数据近似线性可分时,通过软间隔最大化(允许出现分类错误),也学习一个线性分类器,即线性可分支持向量机,又称软间隔支持向量机;当训练数据线性不可分时,通过使用核函数及软间隔最大化,学习非线性支持向量机。
当输入空间是欧式空间或离散集合,特征空间为希尔伯特空间时,核函数表示将输入从输入控件映射到特征空间得到的特征向量之间的内积。通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机,该方法称为核技巧。
感知机利用误分类最小的策略(w和b任意初始化),求得分离超平面,这时的解有无穷多个;线性可分支持向量机利用间隔最大化求最优分离超平面,这时解是唯一的。
2、支持向量机分类
2.1 硬间隔支持向量机
首先考虑二分类且线性可分的情况,则线性模型为:
φ(x) 代表一个固定特征空间变换,训练集由N个输入向量,,目标向量
边界被定义为决策边界与最近的数据点之间的垂直距离,决策边界与任意样本之间的最小距离,如上图(左)所示。如右图所示,最大限度地扩大边界会导致对决策边界的特定选择。这个边界的位置是由数据点的子集决定的,称为支持向量,它由圆圈表示。
对于所有分类正确的样本点到决策面的距离 有(推导过程):
边界由距离数据集最近的点 的垂直距离给出,希望优化参数w和b以使这个距离最大化。通过求解得到最大边缘的解:
上式直接求解太难,且与w无关,所以可以对w进行伸缩变化,如 , 所以可以自由定义接近判别面的点的距离:
则对于所有点满足:
这就是决策超平面的规范表示。对于等式所包含的数据点,约束被认为是活动的,而对于其余的数据点,它们被认为是不活动的。根据定义,总是会有至少一个活动约束,因为总是会有一个最近的点,一旦边界被最大化,就会有至少两个活动约束。
优化问题只要求我们最大化 ,相当于最小化
,所以需要解决的最优化问题为:
minimize
subject to
为了解决优化问题,引入了拉格朗日乘子(原理与推导) ,有:
上式中,对w和b求导得:
将导数带入来消除w和b:
求对偶函数最大化:
maximize
subject to
可将上面 w 求导得到的公式带入,得:
(式1)
这种形式的约束优化满足Karush-Kuhn-Tucker (KKT)条件,在本例中要求保持以下三个属性:
因此,对于每个样本点,有 或
。但是对于
的数据点不会出现在式1中,因为在预测新的数据点方面没有任何作用。剩余的点叫支持向量因为它们满足
,它们对应于特征空间中最大边缘超平面上的点。这个特性是支持向量机的实际适用性的核心。一旦模型被训练,大量的数据点可以被丢弃,只保留支持向量。
所以在决定分离超平面时只有支持向量在起作用,其他样本点不起作用。如果移动支持向量将改变所求的解;但如果在间隔边界以外移动其他样本点,甚至去掉这些点,则解不会改变。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称为支持向量。支持向量个数一般很少,是由很少重要的训练样本确定。
在解决了二次规划问题并找到了 a 的值之后,我们可以通过任何支持向量 满足
来确定阈值参数 b 的值。根据式1得预测方程为:
S表示支持向量的集合。可以用任意选择的支持向量 来解b的这个方程,乘以
和利用
,再将这些方程平均到所有的支持向量上,从而得到一个数值上更稳定的解,因此b为:
单个支持向量得到的b值:
所有支持向量的平均值:
便于后面模型的比较,引入了误差函数,如果一个数据点分类错误,它将给出无穷大的误差;如果分类正确,它将给出零误差。形式如下:
lambda>0,其精确值无意义。
2.2 软间隔支持向量机
在可分离类的情况下,隐式地使用了一个误差函数,如果数据点分类错误,它会给出无限的误差,如果分类正确,它会给出零误差,然后优化模型参数,使边际效益最大化。现在,修改了这种方法,允许数据点位于边缘边界的“错误一侧”,但是会随着与边界的距离增加而受到惩罚。
为此引入了松弛变量 ,每个训练数据点都有一个松弛变量。定义位于正确边缘边界(correct margin boundary)上或内的点的
,其他点
。因此决策边界(decision boundary)
的点有
;位于正确边缘边界内点有
;误分类点有
,如下图所示(带有圆圈的数据点是支持向量,虽然有个点被分类错误,但它仍是支持向量):
对于分类约束 可以用下式替代:
上述可以描述为放宽硬间隔的约束,通过软间隔允许一些训练点分类错误,但上述框架仍对异常值敏感,因为对误分类的惩罚与ξ线性增加。因此目标是最大化边缘的同时惩罚那些在错误边缘边界的点。需要最小化:
minimize
subject to
,
,用于控制松弛变量惩罚与边缘之间的平衡。因为对于任一错分类的点都有
,其所有错分类点的上限为
。参数C类似于正则化系数(的倒数)因为它控制了最小化训练误差与控制模型复杂度之间的平衡。C 越大,相当于惩罚松弛变量,希望松弛变量接近 0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C 值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
引入拉格朗日乘子,得:
根据KKT,得:
↓↓↓
☟☟☟
根据上式得,因为
,所以
的约束有:
现在对解决方法进行解释。对于的数据集,它们对于预测模型没有贡献。剩下的是支持向量,有
,因此一定满足:
若 ,则
,则根据KKT条件
得
,因此点在边缘上;若
,则
,则点可以在边缘内,要么正确分类
要么错误分类
。
由上可知支持向量一定满足 ,
,
,则有:
所有满足 的支持向量
的平均值:
支持向量机的一种替代的、等价的公式 -SVM,需要最大化:
maximize
subject to
该方法用 替换了C,可以解释为边际误差的上界(
的点、因此可能落在错误边界、或被错分)和支持向量的下界。
利用传统方法直接求解二次规划问题,由于计算量和存储量要求高,往往不可行,需要寻找更实用的方法。这使得整个二次规划问题可以分解成一系列更小的问题,主要通过分块技术(chunking)将其分成一个个子二次规划问题。如sequential minimal optimization,它将分块的概念发挥到了极致,只考虑了两个拉格朗日乘子。该子问题可以通过解析求解,从而避免了数值二次规划。给出了在每一步中选择拉格朗日乘子对的启发式算法。在实践中,根据特定的应用程序,SMO会随着数据点的数量变化而变化,介于线性和二次之间。
2.3 多分类支持向量机
支持向量机本质上是一个两类分类器。但在实践中,不得不处理涉及K > 2类的问题。因此,为了建立一个多类分类器,人们提出了多种组合多类支持向量机的方法
一对多(one-versus-the-rest),将K类的某一类 作为正类,剩下的K-1类作为负类,建立支持向量机分类模型
。样本最终预测结果:
但这种方法会导致一些样本在分类中不属于任何一类或者属于多个类别,同时存在类不平衡问题。例如,如果有10个类,每个类有相同数量的训练数据点,对各个分类器进行数据集训练,则正类样本占10%,负类样本占90|%,原始问题的对称性就消失了。有人提出了修正将正类的目标值设为+1,负类的目标值设为 -1/(K-1)。
一对一(one-versus-one),训练K(K - 1)/2个支持向量机,采用投票法。这种方法也会导致一些样本在分类中不属于任何一类或者属于多个类别。如果K过大会导致训练时间多于一对多的方法。同样的,预测新样本时需要更多的计算。
3、支持向量机回归
现在将支持向量机扩展到回归问题同时保留稀疏性的性质。
简单线性回归的最小化正则化误差模型为:
为了得到稀疏解,将二次误差方程用不敏感误差函数替换,形式如下:
如果预测值 y(x) 与目标值 t 的绝对误差小于 (
>0),则误差为0;反之绝对误差减去
。
不敏感误差函数具有与不敏感区域外的错误相关的线性关系,如下面左图所示,红线为不敏感误差线,青色为二次误差线(
)。
不敏感区域的理解:应该是指 和
的那些数据点,这些数据点对回归模型的构建有作用,叫不敏感区域;
的数据点对回归模型的构建没有作用(误差=0),如右图粉色缓冲带(
管道)所示的数据点,所以粉色缓冲带(
管道)外维也叫不敏感区域。
总得来说就是计算不敏区域的误差,后面为了方便引入了松弛变量。看右图,一个表示上界误差 (,包含边界),一个表示下界误差 (
,包含边界)。敏感区域的误差即
的误差为0,所以不用考虑该区域的数据,误差为0不需要计算!!!
因此最小化正则化误差函数为:
通过分类知道,上述误差函数可以换一种表达方式,通过引入松弛变量 和
,支持向量位于不敏感区域,如上图(右)所示。
时,
;
时,
。
位于管道的目标值范围为
。
引入松弛变量是允许点位于管外,但松弛变量为非零数值,因此有:
则支持向量机回归的误差函数 (优化问题) 可以写为:
minimize
subject to ;
;
;
引入拉格朗日乘子():
求解梯度():
用上式带入拉格朗日函数消除相关变量,最后得到对偶问题进行最大化。
根据上式得,因为
,所以
的约束有:
根据w的导数,对于新的样本点的预测可以表示为:
相应的Karush-Kuhn-Tucker (KKT)条件,即在解的时候对偶变量和约束的乘积必须消失,有:
由上可知,如果 ,则
不为 0,表明样本点在
管道的上边界(
)或位于上边界上方(
);同样的 如果
,则
不为0,表明样本位于
管道的下边界或下边界下方。
此外,对于约束 和
是不可能同时为 0 的,因为将两者相加得到
,而
都是非负数且
是严格大于 0 的,因此对于每个样本点有
为 0 或
为 0 或者两者都为0。
支持向量是那些有助于预测的数据点,即 或
,这些点是位于
管道的边缘或管外。所有
管道内的点有
。
对于参数 b 考虑位于管道边界上和外的点,则,因为KKT
,所以有
,在根据KKT
,则有
,根据上面的预测公式(红色)可以得到:
与分类类似,对于SVM回归有一个替代方程,对控制复杂性的参数有更直观的解释。事实上,通过固定参数 限定位于管外的点的比率替代固定
的不敏感区域的宽度。因此需要最大化:
maximize
subject to
最多有 个数据点落在不敏感管道外,所以至少有
个数据点是支持向量落在管道上或外。
可以手动选择,正常通过交叉验证选择。
4、支持向量机优缺点
优点:
- 在高维空间中有效;
- 在数据维度大于样本的条件下仍然有效
- 决策函数(也叫支持向量)用的训练集的子集,所以也叫内存有效(memory efficient)
- 通用性:可以为决策函数指定不同的核函数。提供通用核函数,但也可自定义。
缺点:
- 如果特征数远远大于样本数,在选择核函数时应避免过拟合,正则化项是关键。
- 支持向量机不直接提供概率估计,它们是使用昂贵的五折交叉验证计算的。
5、python3
参考:https://blog.csdn.net/wds2006sdo/article/details/53156589
参考:PRML