一. 拉格朗日乘法介绍
拉格朗日乘数法(Lagrange Multiplier Method)在数学最优问题中,是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。
1.1 等式约束
已知
![v2-cb1c84342a281e787b69e23296fdb492_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-cb1c84342a281e787b69e23296fdb492_b.jpg)
如图所示,最小值在两个曲线的相切位置,则它们的梯度平行,则意味着
1.2 不等式约束
![v2-35087d114e8c76fd6e6865dbce863413_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-35087d114e8c76fd6e6865dbce863413_b.jpg)
第一种情况函数
第二种情况函数
汇总总两种情况,加上来原等式的条件,不等式的全约束条件满足为:
1.3 KKT条件
当约束条件包含等式和不等式,求解最小值问题:
引入拉格朗日乘子
1.4 regularity条件
不满足KKT条件的一定不是最优解,满足KKT条件不一定是最优解,还需要满足
1.5拉格朗日对偶函数:
拉格朗日函数
通俗理解:对于
二. SVM算法公式推导
(1)支持向量机概念
支持向量机(Support Vector Machine,SVM)主要是将特征空间通过非线性变换的方式映射到一个高纬的特征空间,并在这个高纬空间中找出最优线性分界超平面的一种方法。简单来说,SVM的主要原理就是找出间隔最大的超平面作为分类边界。关于超平面在百度百科中有非常明确的定义,我这里通俗解释就是:超平面就是比当前所在的环境空间低一个纬度的子空间。如下图所示,直线A、B、C均属于超平面。
![v2-f981c984a234a36105642f94c099024f_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-f981c984a234a36105642f94c099024f_b.jpg)
上述图1直线的方程表示为
(2)间隔函数、几何间隔
仍以二维平面为例,设H为分类线(也可以成为超平面),
![v2-34ca073edd32746c9099eb625689992a_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-34ca073edd32746c9099eb625689992a_b.jpg)
初中课本学过点到直线的距离公式为
接下来我们引入另一个很重要的概念定义,函数间隔,对于给定的训练数据集T和超平面(w, b),定义超平面(w, b)关于样本点(
超平面(w,b)会有很多个,但是在关于训练集T的函数间隔最小的超平面(w,b)只有唯一值,定义最小函数间隔:
因为超平面(w,b)为
(3)最优超平面
根据上述分析,最优超平面就是就是满足最小函数间隔最大的超平面,就是求:
拉格朗日乘法公式转换得:
原始问题求:
s.t
可以通过SMO算法求出
(4)合页损失函数
线性支持向量机学习还有另外一种解释,就是最小化一下目标函数:
目标第一项:
所以单样本点位于超平面合支持向量之间时,分类依然正确,但是合页损失函数的损失值为
三. 线性不可分支持向量机、非线性支持向量机、核函数
(1)线性不可分支持向量机
![v2-533ed1cd3e0f77057c7cdcfdf0c3c35f_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-533ed1cd3e0f77057c7cdcfdf0c3c35f_b.jpg)
如果所示
最终换算得出:
s.t
(2)非线性支持向量机
![v2-d3784007f93bd6dbb234d08c028625ff_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d3784007f93bd6dbb234d08c028625ff_b.jpg)
像如上图4所示,根本无法用一根直线完全区分开来,只能用非线性曲线将它们正确区分,这种分类问题就是非线性分类。一般的做法是进行空间纬度转化,然后变成线性可分。例如图4可以转化成如下:
![v2-e497a034b028c8ae7ae59b6f7ccb41f8_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=73e6924b-f12e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-e497a034b028c8ae7ae59b6f7ccb41f8_b.jpg)
将二维空间,映射到三维空间中,这样就能找到一个超平面对样本点进行线性分割。假设通过映射
对偶函数问题转化为:
(3)核函数
在计算特征空间中的内积
线性核函数:
多项式核函数:
径向基核函数(RBF):
Sigmoid核函数:
四. 多分类支持向量机
可以将整个多分类支持向量机分为多个两分类支持向量机来处理,从而实现多分类。例如有三个类别A、B、C。
(1)以A所对应的向量作为正集,B、C所对应的向量作为负集,此时得到一个决策函数
(2)以B所对应的向量作为正集,A、C所对应的向量作为负集,此时得到一个决策函数
(3)以C所对应的向量作为正集,A、B所对应的向量作为负集,此时得到一个决策函数
(4)若有一个未知类别的测试数据集x,将其分别代入这3各决策函数并求出函数值,假设得到的
此分类方法叫一对多(One-vs-Rest)方法,主要原理是将每一类样本与其它k-1类样本进行分类,这样就可以形成k个分类支持向量机,最后进行多分类时,得到最大值的那一类便是该样本数据的分类。这个方法简单、有效,但每次训练时,都使用全部样本,当训练样本规模变大时,训练速度会急剧下降。
还有一种分类方法叫一对一(One vs One ),主要原理是通过在不同类别的样本之间两两进行分类训练,形成k(k-1)/2个支持向量机。当对样本数据实行分类时,通过对其在每两个类别之间分类,进行k(k-1)/2次分类,每次分类结果的类别记1分,获得分类最多的类别就是最终该样本的类别。例如三个列表A、B、C,根据三个类别所对应的特征向量及其类别取值,采用一对一方法做如下安排:
(1)以A所对应的向量作为正集,B对对应的向量作为负集,得到分类函数
(2)以A所对应的向量作为正集,C对对应的向量作为负集,得到分类函数
(3)以B所对应的向量作为正集,C对对应的向量作为负集,得到分类函数
(4)若有一个未知类别测试数据集x,将其分别代入这三个决策函数并求出函数值,假设在
在sklearn.svm 包的SCV方法中,参数decison_function_shape='ovr',一对多分类、'ovo'一对一分类,后面再详叙。
五. 支持向量机python代码实现
上面讲了那么多如下python代码都已经封装好了,首先要学会的就是先做一个懂原理的调参员。
from
C: 松弛变量或惩罚因子,C越大,希望松弛变量接近0,即对误分类的惩罚增大,但泛化能力弱。C值越小,对误分类的惩罚越小,容许出错,将它们当成噪声点,泛化能力强。默认C=1.0。
kernel: 核函数;默认是rbf(上面提到的径向基核函数)、linear 线性核函数、ploy 多项式核函数、sigmoid Sigmoid核函数
degree: 多项式poly函数的纬度,默认是3。
gamma: 'rbf'、 'poly' 、'sigmoid'的核函数参数。默认是’auto’,则会选择1/n_features。
coef0: 核函数的常数项。对于'poly'、'sigmoid'核函有用。
这里面的每个参数都对应了上面一个知识点。demo代码地址:
https://github.com/zx3305/tennis/tree/master/svmgithub.com