本文已参与「新人创作礼」活动,一起开启掘金创作之路
本文为博主在学习支持向量机时的笔记与总结,如有理解不当之处,欢迎指正。
个人博客连接: JMX的个人博客
一、SVM简介
支持向量机SVM是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的泛化能力。
VC维(外文名Vapnik-Chervonenkis Dimension)的概念是为了研究学习过程一致收敛的速度和推广性(Generalization performance),由统计学理论定义的有关函数集学习性能的一个重要指标。
其相关定义较多,且较难懂,简单来说VC维是用来衡量研究对象(数据集与学习模型)可学习性的指标。而可学习性与数据量和模型的复杂度有关。但只是泛泛但知道了,如何定量的计算和表达这种关系就需要引入VC维但概念了。正由于SVM关注的为VC维,其在解决问题时与样本的维数是无关的。
结构风险:机器学习本质上为对问题真实模型的逼近,因而需要衡量近似模型与真实模型之间的差距。
预测的值与问题真实解就叫做风险。我们选择了一个分类器后,真实误差较难获得,直观的是通过在样本数据上的分类结果与真实结果(标注数据)之间的差值来表示,这个差值叫做经验风险Remp(w)。但大多数机器学习模型可以在样本数据取得很好的分类效果,但在其余真实分类中效果并不是很好,即模型泛化能力差。因此经验风险最小化原则适用的前提为每一个样本风险需要能够逼近真实风险。但样本数据较真实世界中的数据要小得多,因而这个前提条件较难以满足。
统计学习因此引入了泛化误差界的概念即真实风险应该由两部分组成,一是经验风险,代表在给定样本的误差;二是置信风险,代表在多大程度上相信分类器的结果,即分类器的泛化能力。由于第二部分置信风险没有办法精确计算,只能给出一个估计的区间,使得整个误差只能计算上界,所以叫做泛化误差界。
置信风险与两个量有关,一是样本数量,给定的样本数量越多,分类器置信程度越高;二是分类函数的VC维,VC维越大,置信程度越差。
泛化误差界的公式:
R(w) <= Remp(w) + ф(w)
R(w):真实风险
Remp(w): 经验风险
ф(w): 置信风险。
SVM是一种最小化结构风险的算法。具有以下特点。
- 小样本,(当然样本数据越多越好),指的是对于问题的复杂度而言,也相对于深度学习而言,所需要的样本数量是较少的。
- 非线性,通过引入松弛变量与核函数,将低维线性不可分的情况映射为高维线性可分。
二、SVM线性分类器,目标函数与约束条件
分隔两类数据的线性函数,如果不分空间的维数,这类函数统一称为超平面。
g(x) = wx + b ,这里的变量均以向量表示以忽略空间维数。
评判分类数据到分类超平面的距离:
该公式由空间中点到平面距离得到,即:
D = (AX+BY+C)/sqrt(A^2 + B ^2)
||w||是什么符号?||w||叫做向量w的范数,范数是对向量长度的一种度量。我们常说的向量长度其实指的是它的2-范数,范数最一般的表示形式为p-范数,可以写成如下表达式
向量w=(w1, w2, w3,…… wn)
它的p-范数为
用归一化的w和b代替原值之后的间隔有一个专门的名称,叫做几何间隔,几何间隔所表示的正是点到超平面的欧氏距离,我们下面就简称几何间隔为“距离”。以上是单个点到某个超平面的距离(就是间隔,后面不再区别这两个词)定义,同样可以定义一个点的集合(就是一组样本)到某个超平面的距离为此集合中离超平面最近的点的距离。下面这张图更加直观的展示出了几何间隔的现实含义:
H是分类面,而H1和H2是平行于H,且过离H最近的两类样本的直线,H1与H,H2与H之间的距离就是几何间隔。
间隔:δ=y(wx+b)=|g(x)|
几何间隔:
之所以如此关心几何间隔这个东西,是因为几何间隔与样本的误分次数间存在关系:
因此我们需要最小化误分次数,即最大化几何间隔,即最小化||w||。
我们的任务就变成了min||w||,为了求导方便,我们改成min(1/2*||w||^2)
但如果直接求解该目标函数,很容易得到当||w||为0时,目标函数取得最小值。这时我们需要为目标函数添加约束条件。
当||w||=0的时候就得到了目标函数的最小值。但是这反映在图中,就是H1与H2两条直线间的距离无限大,这个时候,所有的样本点(无论正样本还是负样本)都跑到了H1和H2中间,而我们原本的意图是,H1右侧的被分为正类,H2 左侧的被分为负类,位于两类中间的样本则拒绝分类(拒绝分类的另一种理解是分给哪一类都有道理,因而分给哪一类也都没有道理)。这下所有样本点都进入了无法分类的灰色地带。
从图中可以看出,要想对点进行分类,点到平面的距离需要大于1即在H1或H2外,于是有了约束条件:
yi[(w·xi)+b]-1≥0 (i=1,2,…,l) (l是总的样本数)
综上,我们得到我们要求的目标函数与约束条件:
三、求解带约束的极值:拉格朗日乘子法和KKT条件
1.无约束条件求极值
直接对目标函数进行求导
2.含等式约束条件求极值
定义拉格朗日函数:
F(x,λ)=f(x)+∑k=1l(λk∗hk(x))
之后通过对各个变量求偏导,得出最优解。
例:给定椭球a2x2+b2y2+c2z2=1 求解f(x,y,z)=8xyz的极值
构造拉格朗日函数:F(x,y,z,λ)=8xyz+λ(a2x2+b2y2+c2z2−1)
∂x∂F(x,y,z,λ)=8yz+a22λx=0
∂y∂F(x,y,z,λ)=8xz+b22λy=0
∂z∂F(x,y,z,λ)=8xy+c22λz=0
∂λ∂F(x,y,z,λ)=a2x2+b2y2+c2z2−1=0
连列上述等式进行求解。
3.含不等式约束条件求极值
定义拉格朗日函数:
L(x,μ,λ)=f(x)+∑j=1n(λjhj(x))+∑i=1m(μkgk(x))
这里取得极值需要利用KKT条件:L(x,μ,λ)=f(x)+ag(x)+bh(x)取最优值符合以下条件:
(1) L(a,b,x)对x求偏导为0
(2) h(x) = 0
(3) a*g(x) = 0
我们先忽略h(x)
μk>=0 ,gk(x)<=0 => μkgk(x)<=0
maxμL(x,μ)=f(x)
minxf(x)=minxmaxμL(x,μ)
maxμminxL(x,μ)=maxμ(minxf(x)+minx(∑(μkgk(x))))=minxf(x)+maxμminx∑(μkgk(x))=minxf(x)=minxmaxμL(x,μ)
推导过程中有:minx∑kqμkgk(x)=0,μ=0org(x∗)=0;−∞,other
maxμL(x∗,μ)=f(x∗)又
maxμminxL(x,μ)=minxf(x)+maxμminxμg(x)=f(x∗)
x∗为L(x,μ)极值点,∂x∂L(x,μ)∣x=x∗=0,μg(x∗)=0
综合以下条件:
1.L(x,μ,λ)=f(x)+∑j=1n(λjhj(x))+∑i=1m(μkgk(x))
2.λj=0
3.hj(x)=0
4.μk≥0
5.gk(x)≤0
可以推出:
1.minxmaxμL(x,λ,μ)=maxμminxL(x,λ,μ)=minxf(x)=f(x∗)
2.∂x∂L(x,μ)∣x=x∗=0
3.μkgk(x)=0
四、SVM含约束条件的极值求解
SVM中构建拉格朗日函数:L(w,b,α)=21∣∣w∣∣2+∑i=1mαi∗(1−yi(wTxi+b))
约束条件为:
1.αi∗(1−yi(wTxi+b))=0
2.αi≥0
3.yi(wTxi+b)−1≥0
Tips:使用1−yi(wTxi+b)而不是yi(wTxi+b)−1是要符合上述g(x)≤0条件。
对变量求偏导,变量均以向量形式表示:
1.∂w∂L(w,b,α)=w−∑i=1mαiyixi=0
2.∂b∂L(w,b,α)=∑i=1myiαi=0
Tips:<w,x>表示向量的内积xi为样本数据,x为预测未知数据
由上述结果:原先g(x)=<w,x>+b=<∑i=1mαiyixi,x>+b=∑i=1mαiyi<xi,x>+b
需要求解的未知量由w变成了α
这里求解α的常用算法为SMO算法,关于SMO算法的推导将在下一篇中介绍。
五、SVM中的核函数
上述讨论的SVM是线性分类器,但现实世界中很多分类问题,并不是线性可分的,如下面的例子:
我们把一维空间:横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类。在这个问题中,我们无法找到一条直线将两类数据分开,但我们可以在二维空间内找到一条曲线:
显然通过点在这条曲线的上方还是下方就可以判断点所属的类别。这条曲线就是我们熟知的二次曲线,它的函数表达式可以写为:
g(x)=c0+c1x+c2x2
很明显这个函数为非线性函数,但新建一个向量y与a:
因此函数可以表示为g(x)=<a,y>
原来在二维空间中一个线性不可分的问题,映射到四维空间(3个自变量加一个因变量)后,变成了线性可分的!因此这也形成了我们最初想解决线性不可分问题的基本思路——向高维空间转化,使其变得线性可分。
我们可以发现通过映射之后计算高维空间的w′x′可以得到分类结果,而高维空间中的w′x′分别由wx低维空间映射得到。我们希望可以有一个函数K(w,x)接受低维空间输入使得:
g(x)=K(w,x)+b
f(x′)=<w′,x′>+b
上述两个函数结果相同,这样的函数就叫做核函数。
上文中的线性分类器:
f(x′)=∑i=1mαiyi<xi′,x′>+b
高维空间中即为:
g(x)=∑i=1mαiyiK(xi,x)+b
当映射到高维空间仍然线性不可分时,需要引入松弛变量。
六、SVM中松弛变量
经过上述操作,我们将线性不可分的问题转变成为了高维中线性可分的,即:
但真实世界中的分类问题往往会有异常数据,如下图中的黄点:
若对上述数据按之前方法处理,则该线性可分问题又变成了非线性可分的。这种问题叫做“近似线性可分问题”。因而我们需要对这种噪声有一定的容错性。
原先我们的约束条件为:
yi[(wTxi)+b]≥1
现在对上述约束条件加上容错性:
yi[(wTxi)+b]≥1−ζi
ζi≥0
衡量损失可以通过:
∑i=1lζi2
或者∑i=1lζi
因而我们的目标函数与优化条件由:
变成:
这里需要注意以下几个点:
1 . 并非所有的样本点都有一个松弛变量与其对应。实际上只有“离群点”才有,或者也可以这么看,所有没离群的点松弛变量都等于0,为离群样本设置松弛变量。
2. 松弛变量的值实际上标示出了对应的点到底离群有多远,值越大,点就越远。
3. 惩罚因子C决定了你有多重视离群点带来的损失,显然当所有离群点的松弛变量的和一定时,你定的C越大,对目标函数的损失也越大,此时就暗示着你非常不愿意放弃这些离群点,最极端的情况是你把C定为无限大,这样只要稍有一个点离群,目标函数的值马上变成无限大,马上让问题变成无解,这就退化成了硬间隔问题。
4. 惩罚因子C不是一个变量,整个优化问题在解的时候,C是一个你必须事先指定的值,指定这个值以后,解一下,得到一个分类器,然后用测试数据看看结果怎么样,如果不够好,换一个C的值,再解一次优化问题,得到另一个分类器,再看看效果,如此就是一个参数寻优的过程,但这和优化问题本身决不是一回事,优化问题在解的过程中,C一直是定值,要记住。
参考文章:SVM 原理详解,通俗易懂