机器学习-SVM理论
理论知识
SVM是在神经网络模型及CNN出现之前很火的一种分类模型。它有很好的泛化能力。
线性可分支持向量机:当data线性可分时使用
如果两类数据是线性可分的,那么如果垂直n维超平面做一个投影面,则这两类数据一定可以投影到低维空间中且还是可分的。
线性可分SVM中不会出现在分割面上及支撑面和分割面之间的缓冲部分(人造词汇,不是专业名称),最多出现在支撑面上。但是在线性SVM中是可能的。
-
硬间隔最大化(hard margin maximization)
硬间隔
-
硬间隔支持向量机
线性支持向量机:当data不是线性的,但是可以在一定错误率下线性分开
-
软间隔最大化(soft margin maximization)
软间隔
-
软间隔支持向量机
非线性支持向量机:在线性可分或线性的基础上加上核函数,实现非线性分类的效果
-
核函数kernel function
对于高斯核函数,c越大,过渡带越窄;γ越大,分割界面的非线性程度越大(当γ倾向于无穷大时,SVM就退化为
注意,我们一般把向量定义为列向量,这里的w和x都是这样的
将一个点带入,如果式子大于0,表示是在法向量的同方向;小于0,表示是在法向量的逆方向。如果这么来看,最严谨的标法应该是把上图中w的方向换一下,即**法向量w永远指向以直线划分的大于0的方向。之后其实没必要对这个太过于纠结,只要按照几何间隔的定义来就一定是恒正的,再分析就是不涉及到符号的分析了。
支撑向量:确定超平面w向量的向量
在间隔边界上的点称为支撑向量,这就是支撑向量机的由来
我们就是要通过“将最短几何间隔最大化”这个目标来确定超平面的相关参数
SVM得到的分类器的分类误差会比较小
注意这里有一个特征映射:
特征映射可以提高特征的阶数并且增加特征的数量,可以根据实际情况选择一个合适最高阶数的映射
注意,这里谈的不是点到直线的距离,而仅仅只是函数值y,函数值y是可以通过成比例改变w和b而改变的,但是点到直线的距离是不会的。我们只约束了函数值的绝对值≥1,也就是函数间隔≥1,并没有要求几何间隔。所以这是一定能办得到的。
从平面几何的角度来看,我们想做的就是使得离直线最近的点(支撑向量)离我们的直线几何距离最远,办法就是调整直线的斜率和截距。而限制函数间隔为1也是为了我们讨论的方便,否则变量太多。当然,这样的假设对于我们最后模型的表现也是有影响的,这个看上面那个模型对比图就能看出来,也可以从下面看:
这是我们转化后的问题,显然如果我们的前提不一样(第二行那个就是我们的前提),求得的最小值w也不一样,因此选择一个合适的函数距离也是调参的一部分。注意这里不是1个约束,而是n个约束,是在这n个约束的条件下求最小值。
怎么做呢?
关于拉格朗日乘子法和KKT条件,可以参考这篇文章:
来源:https://www.cnblogs.com/mo-wang/p/4775548.html
在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件是两种最常用的方法。在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件。
我们这里提到的最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值(因为最小值与最大值可以很容易转化,即最大值问题可以转化成最小值问题)。提到KKT条件一般会附带的提一下拉格朗日乘子。对学过高等数学的人来说比较拉格朗日乘子应该会有些印象。二者均是求解最优化问题的方法,不同之处在于应用的情形不同。
一般情况下,最优化问题会碰到一下三种情况:
(1)无约束条件
这是最简单的情况,解决方法通常是函数对变量求导,令求导函数等于0的点可能是极值点。将结果带回原函数进行验证即可。
(2)等式约束条件
设目标函数为f(x),约束条件为h_k(x),形如:
s.t. 表示subject to ,“受限于”的意思,l表示有l个约束条件。
则解决方法是消元法或者拉格朗日法。消元法比较简单不在赘述,这里主要讲拉格朗日法,因为后面提到的KKT条件是对拉格朗日乘子法的一种泛化。
例如给定椭球:
求这个椭球的内接长方体的最大体积。这个问题实际上就是条件极值问题,即在条件 下,求的最大值。
当然这个问题实际可以先根据条件消去 z (消元法),然后带入转化为无条件极值问题来处理。但是有时候这样做很困难,甚至是做不到的,这时候就需要用拉格朗日乘数法了。
首先定义拉格朗日函数F(x):
( 其中λk是各个约束条件的待定系数。)
然后解变量的偏导方程:
......,
如果有l个约束条件,就应该有l+1个方程(因为把每个约束的、不同的λ也算进去了)。求出的方程组的解就可能是最优化值(高等数学中提到的极值),将结果带回原方程验证就可得到解。
回到上面的题目,通过拉格朗日乘数法将问题转化为
对求偏导得到
联立前面三个方程得到和,带入第四个方程解之
带入解得最大体积为:
至于为什么这么做可以求解最优化?维基百科上给出了一个比较好的直观解释。
举个二维最优化的例子:
min f(x,y)
s.t. g(x,y) = c
这里画出z=f(x,y)的等高线(函数登高线定义见百度百科):
绿线标出的是约束g(x,y)=c的点的轨迹。蓝线是f(x,y)的等高线。箭头表示斜率,和等高线的法线平行。从梯度的方向上来看,显然有d1>d2。绿色的线是约束,也就是说,只要正好落在这条绿线上的点才可能是满足要求的点。如果没有这条约束,f(x,y)的最小值应该会落在最小那圈等高线内部的某一点上。而现在加上了约束,最小值点应该在哪里呢?显然应该是在f(x,y)的等高线正好和约束线相切的位置,因为如果只是相交意味着肯定还存在其它的等高线在该条等高线的内部或者外部,使得新的等高线与目标函数的交点的值更大或者更小,只有到等高线与目标函数的曲线相切的时候,可能取得最优值。
如果我们对约束也求梯度∇g(x,y),则其梯度如图中绿色箭头所示。很容易看出来,要想让目标函数f(x,y)的等高线和约束相切,则他们切点的梯度一定在一条直线上(f和g的斜率平行)。
也即在最优化解的时候:∇f(x,y)=λ(∇g(x,y)-C) (其中∇为梯度算子; 即:f(x)的梯度 = λ* g(x)的梯度,λ是常数,可以是任何非0实数,表示左右两边同向。)
即:▽[f(x,y)+λ(g(x,y)−c)]=0λ≠0
那么拉格朗日函数: F(x,y)=f(x,y)+λ(g(x,y)−c) 在达到极值时与f(x,y)相等,因为F(x,y)达到极值时g(x,y)−c总等于零。
min( F(x,λ) )取得极小值时其导数为0,即▽f(x)+▽∑ni=λihi(x)=0,也就是说f(x)和h(x)的梯度共线。
简单的说,在F(x,λ)取得最优化解的时候,即F(x,λ)取极值(导数为0,▽[f(x,y)+λ(g(x,y)−c)]=0)的时候,f(x)与g(x) 梯度共线,此时就是在条件约束g(x)下,f(x)的最优化解。
(3)不等式约束条件
设目标函数f(x),不等式约束为g(x),有的教程还会添加上等式约束条件h(x)。此时的约束优化问题描述如下:
则我们定义不等式约束下的拉格朗日函数L,则L表达式为:
其中f(x)是原目标函数,hj(x)是第j个等式约束条件,λj是对应的约束系数,gk是不等式约束,μk是对应的约束系数。
常用的方法是KKT条件,同样地,把所有的不等式约束、等式约束和目标函数全部写为一个式子L(a, b, x)= f(x) + ag(x)+bh(x),这里的a和b都是大于等于0的。
KKT条件是说最优值必须满足以下条件:
1)L(a, b, x)对x求导为零;这个是对整体的要求
2)h(x) =0;这个是等式自身的性质,不算是要求
3)μ*g(x) = 0;这个就是不等式的条件
求取这些等式之后就能得到候选最优值。其中第三个式子非常有趣,因为g(x)<=0,如果要满足这个等式,必须μ=0或者g(x)=0. 这是SVM的很多重要性质的来源,如支持向量的概念。
接下来主要介绍KKT条件,推导及应用。详细推导过程如下:
参考:
【1】拉格朗日乘数法
【2】KKT条件介绍
上面的那个推导,我又细化了一下:
SVM与凸优化
用对偶问题来解决原始问题。上面两张图片中就说明了,在一定的条件(KKT条件)下,原问题和对偶问题的解是相同的。
SVM中用到的凸优化是只包括不等式约束、不包括等式约束的。
为什么我们要求关于α的最大值呢?因为我们L的第二部分,除α之外的部分是大于等于0的,算上负号是小于等于0的,所以α越大整体才会越小。再者说了,这个α是我们在构建拉格朗日乘数法的时候引入的,怎么也需要想办法消去才能得到结果啊
我们对对偶问题进行求解
先对L求w的偏导数,然后L对b求偏导数,分别设这两个偏导数为0,就得到了两个等式。
.
将其代入L式可以得到一个只和α相关的式子,之后再对α求最大值就好了。
具体推导见这篇博客:
来源:https://blog.csdn.net/luoshixian099/article/details/51073885
回顾原始问题:
写成拉格朗日函数,由于只有不等式约束所以只包含拉格朗日乘子αiαi:
原始问题最优解p∗=minw,b maxαL(w,b,α)p∗=minw,b maxαL(w,b,α);对偶问题的最优解d∗=maxα minw,bL(w,b,α)d∗=maxα minw,bL(w,b,α)
对偶问题先求关于参数w,b的最小值,再求关于参数αα的最大值。
首先,分别对w,b求偏导数并令为0,得:把上述结果带入拉格朗日函数L(w,b,α)L(w,b,α)
注意到上述是只关于参数αα的函数,记为W(α)W(α),由对偶函数,下一步即最大化W(α)W(α)
注:向量的内积定义
下面的目的是解决上述优化问题,通常采用SMO算法
————————————————
版权声明:本文为CSDN博主「勿在浮砂筑高台」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoshixian099/article/details/51073885
求出α后再反代求出w和b,这样就能确定超平面了。有了超平面、构造好决策函数之后就能用于分类了。
高效地求解α的方法是SMO,见我的博文:https://www.cnblogs.com/jiading/p/11684982.html。
手推的话,继续往下看。
这个就是将原式求最大值加了个负号变成了求最小值,但依然是有约束的,只不过这次变成了等式约束。
举例:
回顾一个知识点:最值在极值点或者边界处取到
但是因为有两个变量,所以“边界”不一定值两个变量同时取到边界,也有可能只有一个在边界上,所以这才有了上面图片中比较α1和α2为0的两种情况,选较小的那种。
注意这里的结果是有实际含义的!这里求出最后的α1和α3不为0,而α2为0,正是说明了向量1和向量3是支持向量,而向量2不是。因为1和3参与到了w和b的取值中,起到了“支持”的作用
线性支撑向量机
线性可分支持向量机对噪声和异常值比较敏感。而线性支持向量机的过渡带相比而言更快,泛化能力会更好。
相当于弱化了要求,有了一个讨论的余地。其实这就是soft margin(软间隔)
关于软间隔更多的资料可以参考:https://blog.csdn.net/robin_xu_shuai/article/details/77051258
让ξi加入目标函数的目的是限制ξ的大小,不要使得松弛的程度过大。而关于限制有多严格,就是靠C来调节了,C越大,限制越严格;C越小,限制越松。
当C取无穷大的时候,模型就退化为线性可分向量机,这一点从下面的式子中也能看出来。
之后的内容和线性可分向量机几乎一样了。
和线性可分向量机的区别就是第一步这一次不仅对w和b求了偏导数,同时也对ξ求了。
在这里,我们用C和α来表示μi,从而替换掉式子中的μi。和线性可分向量机相比,这里α的范围变成了[0,C],求最值的时候注意一下这个边界的变化就好了,剩下的都一样。
在这里,C用来控制“最大化间隔”和“保证大多数点的函数间隔小于1.0”这里两个目标的权重
附一个例子来说明C的影响:
可以看到,当C变得很大的时候,模型的行为就退化为了线性可分向量机。
线性支持向量机和线性可分向量机相比,它在要求模型能够使得大多数样本可分、有一个“过渡带”的同时,也允许了一小部分样本进入这个过渡带。理论上如果ξ足够大的话(也就是允许大于1的损失),也允许与该范围标记不一致的点越过超平面进入该范围。
如何计算一个样本的损失值ξ?就是1-它在函数中的实际取值,也可以由图中看,但注意不是几何距离,而是函数值:
在过渡带上的点,它们的α值是介于0到C之间,过渡带外面的点的α值是0,过渡带内的点α值是C
我们可以认为,我们的优化目标就是最小化损失,也就是上面式子的第二项,而第一项就可以认为是一个正则项(l2正则),这也是SVM的一种理解角度。
损失在0-1之间,属于分对了但是有损失;损失大于1,才是真的分错了。
核函数
至于核函数,我觉得这篇博文说的非常好,所以直接引用:
来源:https://blog.csdn.net/luoshixian099/article/details/51073885
观察线性支持向量机的对偶问题为:
上述目标函数中,只包含原始数据的内积形式。由上述分析,只需要找到一个合适的非线性变换,将原始数据映射到高维特征空间中,内积形式变为为。定义K(x,z)=ϕ(x)T**ϕ(z)K(x,z)=ϕ(x)Tϕ(z)x,zx,zϕ(x)ϕ(x)K(x,z)K(x,z)
E**g:x,z∈R**n, K(x,z)=(xTz)2=∑i,j=1n(xix**j)(ziz**j), 对应ϕ(x)=(x1x1,x1x2...,x1x**n,x2x1,...xnx**n)TEg:x,z∈Rn, K(x,z)=(xTz)2=∑i,j=1n(xixj)(zizj), 对应ϕ(x)=(x1x1,x1x2...,x1xn,x2x1,...xnxn)T
常用几个核函数:
多项式核函数:K(x,z)=(xTz+1)q,q>0多项式核函数:K(x,z)=(xTz+1)q,q>0
高斯核函数:K(x,z)=exp(−||x−z||22σ2), 称为高斯径向基函数分类器,即上面图中采用方法高斯核函数:K(x,z)=exp(−||x−z||22σ2), 称为高斯径向基函数分类器,即上面图中采用方法
双曲正切函数:K(x,z)=tan**h(βxT**z+γ);为满足 Merce**r 定理,一组可能的参数β=2,γ=1
也就是说,我们可以只找到核函数的内积计算方法即可,并不需要找到并计算核函数本身。原本的步骤是:
选取数据-》计算特征空间的映射-》对两个映射做内积,此时内积是在特征空间的维度进行的,计算难度很大。
常用的核函数及其适用条件:
来源:https://blog.csdn.net/batuwuhanpei/article/details/52354822
线性核函数
κ(x,xi)=x⋅xi
κ(x,xi)=x⋅xi
线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的
多项式核函数
κ(x,xi)=((x⋅xi)+1)d
κ(x,xi)=((x⋅xi)+1)d
多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
高斯(RBF)核函数
κ(x,xi)=exp(−||x−xi||2δ2)
κ(x,xi)=exp(−||x−xi||2δ2)
高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。
sigmoid核函数
κ(x,xi)=tanh(η<x,xi>+θ)
κ(x,xi)=tanh(η<x,xi>+θ)
采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。
因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证的方法,来试用不同的核函数,误差最下的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。在吴恩达的课上,也曾经给出过一系列的选择核函数的方法:如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM;
如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。
————————————————
版权声明:本文为CSDN博主「wolfrevoda」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/batuwuhanpei/article/details/52354822
其实“线性核函数”就是我们没有强调核函数的时候使用的那种、线性情况下的核函数。