一. 拉格朗日乘法介绍
拉格朗日乘数法(Lagrange Multiplier Method)在数学最优问题中,是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。
1.1 等式约束
已知
其中
满足
,求满足条件的
最小值。
如图所示,最小值在两个曲线的相切位置,则它们的梯度平行,则意味着
,
就是拉格朗日乘子。则上例子有
,这三个方程组可求出满足条件的最小值。上例中,针对等式约束拉格朗日函数为
,对
求偏导为0,是一样的效果。当有多个等式约定时,则对应有多个拉格朗日乘子。
1.2 不等式约束
s.t
。这类不等式约束条件的求最小值,可分为如下两种情况:
第一种情况函数
的极小值落在函数
可行区域内,相当于不等式约束条件无效。则此时极小值满足的条件:
;
; 引入拉格朗日乘子
后,满足条件:
;
;
。
第二种情况函数
的极小值没落在
可行区域内,最小时值处梯度依然平行,但是方向相反,所以此时极小值满足条件:
;
;
。
汇总总两种情况,加上来原等式的条件,不等式的全约束条件满足为:
;
;
;
。把
,得出
。
1.3 KKT条件
当约束条件包含等式和不等式,求解最小值问题:
s.t
,
引入拉格朗日乘子
、
使设
,满足如下条件(KKT条件):
;
;
;
;
;
1.4 regularity条件
不满足KKT条件的一定不是最优解,满足KKT条件不一定是最优解,还需要满足
、
线性无关的解才是最优解,
1.5拉格朗日对偶函数:
拉格朗日函数
转换为把
当作常数,关于
取最小值得到的函数为
,inf 表示下确界。从而得到只是与
有关和
无关一个新函数。原问题是求最小化
,显然会有
。假设
是满足原问题约束条件下的最优解,则:
(这个公式详细推导我也没看明白)。所以得
是原问题最优解的下界,导出拉格朗日对偶问题:
。
通俗理解:对于
会有 ,
==>
==>
。
二. SVM算法公式推导
(1)支持向量机概念
支持向量机(Support Vector Machine,SVM)主要是将特征空间通过非线性变换的方式映射到一个高纬的特征空间,并在这个高纬空间中找出最优线性分界超平面的一种方法。简单来说,SVM的主要原理就是找出间隔最大的超平面作为分类边界。关于超平面在百度百科中有非常明确的定义,我这里通俗解释就是:超平面就是比当前所在的环境空间低一个纬度的子空间。如下图所示,直线A、B、C均属于超平面。图 1
上述图1直线的方程表示为
。那么推广到n维空,则超平面可表示为:
(3.1) 令
不全为0,
则公式可表示为
(3.2)。所以超平面的应用一般用于划分类别,分布在超平面的一侧所有的数据属于某个类别,分布在另一侧的所有数据属于另一个类别。如上图所示,就算是能正确划分类别的超平面也有无数多个,到底怎样的超平面才算是最优超平面,就引入了间隔的概念。
(2)间隔函数、几何间隔
仍以二维平面为例,设H为分类线(也可以成为超平面),
和
分别为过各分类中离分类线最近的样本且平行于分类线的直线,它们之间的距离叫做分类间隔。所谓的最优分类线就是要求分类线不但能将两类正确分开,而且使得分类间隔最大。图 2
初中课本学过点到直线的距离公式为
,那么我们可以这样理解在超平面
确定的情况下,
能够相对的表示点
到超平面的距离(函数间隔)。如图2所示点分布在超平面的两侧,因此可以用与超平面
的符号(是否大于0)与类标记
的符号是否一至,表示分类是否正确。取
为1或-1,若
则判断
为1,否则为 -1。因此可用量
来判断分类的正确性,并且值越大分类结果可信度越大。
接下来我们引入另一个很重要的概念定义,函数间隔,对于给定的训练数据集T和超平面(w, b),定义超平面(w, b)关于样本点(
)的函数间隔为:
。
超平面(w,b)会有很多个,但是在关于训练集T的函数间隔最小的超平面(w,b)只有唯一值,定义最小函数间隔:
。(
可理解为需要找的支持向量)
因为超平面(w,b)为
,w, b 同时变成2w, 2b等式依然还成立,但是最小函数间隔则会增大2倍。于是引入几何间隔的概念,定义几何间隔为:
,
为上述定义的最小函数间隔,
。
(3)最优超平面
根据上述分析,最优超平面就是就是满足最小函数间隔最大的超平面,就是求:
;
就是关于超平面(w,b)的最小函数间隔。
的取值并不影响最优化问题的解,为简单设
;并且原函数是求最大值,则可以转化为
,再次转化下则得到,
。
拉格朗日乘法公式转换得:
(非常重要的一个公式)。对w、b分别求偏导:
;
。 把这组式子代入
(其中
)得:
原始问题求:
根据拉格朗日对偶问题转换为
,把最优化问题转化为对应的对偶问题,得:
s.t
;
可以通过SMO算法求出
,然后可以求出对应的
。最终可以得到决策分类函数为:
; sgn()为符号函数,返回的是整型。
(4)合页损失函数
线性支持向量机学习还有另外一种解释,就是最小化一下目标函数:
;
目标第一项:
为合页损失函数。其数学表达式为:
;
表示预测输出。当
时,损失值:
。
所以单样本点位于超平面合支持向量之间时,分类依然正确,但是合页损失函数的损失值为
(
为松弛变量)。
三. 线性不可分支持向量机、非线性支持向量机、核函数
(1)线性不可分支持向量机图 3
如果所示
旁边依然一个干扰项,超平面无法完全的把两类分开,此时我们把这种情况,称为线性不可分,在线性不可分的情况下约束条件
将很难满足,因此引入一个松弛变量
(
),使得约束条件为:
。从而原始问题转化为如下公式:
s.t
最终换算得出:
s.t
; 可以看出引入松弛变量,最终转为了对于拉格朗日乘子
值的限制。
(2)非线性支持向量机图 4
像如上图4所示,根本无法用一根直线完全区分开来,只能用非线性曲线将它们正确区分,这种分类问题就是非线性分类。一般的做法是进行空间纬度转化,然后变成线性可分。例如图4可以转化成如下:图 5
将二维空间,映射到三维空间中,这样就能找到一个超平面对样本点进行线性分割。假设通过映射
后,原始的训练样本集
变成了
,则原始的优化问题转为:
s.t
。
对偶函数问题转化为:
s.t
。原先的
变成了
,而整个正好可以采用合适的核函数简化运算。
(3)核函数
在计算特征空间中的内积
时,可以采用满足Mercer定理的核函数 :
。这个定理有点复杂,这里只列举一些常用核函数如下:
线性核函数:
多项式核函数:
径向基核函数(RBF):
代表向量作差之后各分量的平方和的开根号;
为径向基核的参数。也叫高斯核函数,因为可以看出另一种核函数:
。
Sigmoid核函数:
;
为核函数参数。
四. 多分类支持向量机
可以将整个多分类支持向量机分为多个两分类支持向量机来处理,从而实现多分类。例如有三个类别A、B、C。
(1)以A所对应的向量作为正集,B、C所对应的向量作为负集,此时得到一个决策函数
。
(2)以B所对应的向量作为正集,A、C所对应的向量作为负集,此时得到一个决策函数
。
(3)以C所对应的向量作为正集,A、B所对应的向量作为负集,此时得到一个决策函数
。
(4)若有一个未知类别的测试数据集x,将其分别代入这3各决策函数并求出函数值,假设得到的
最大,则判断x属于B类。
此分类方法叫一对多(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,将其分别代入这三个决策函数并求出函数值,假设在
判断为A类,
判断都为C类,则x判断就为C类。
在sklearn.svm 包的SCV方法中,参数decison_function_shape='ovr',一对多分类、'ovo'一对一分类,后面再详叙。
五. 支持向量机python代码实现
上面讲了那么多如下python代码都已经封装好了,首先要学会的就是先做一个懂原理的调参员。
from sklearn.svm import SVC
SVC(C=1.0, cache_size=200,class_weight=None,coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kennel='linear',
max_iter=-1, probability=False, random_state=None, shrink-ing=True,
tol=0.001, verbose=False)
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