1、拉格朗日乘子
作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。
如何将一个含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题?拉格朗日乘数法从数学意义入手,通过引入拉格朗日乘子建立极值条件,对n个变量分别求偏导对应了n个方程,然后加上k个约束条件(对应k个拉格朗日乘子)一起构成包含了(n+k)变量的(n+k)个方程的方程组问题,这样就能根据求方程组的方法对其进行求解。
无条件约束:
minf(x)
等式条件约束:
minf(x)s.t. hk(x)=0 k=1,2,…,lF(x,λ)=f(x)+k=1∑lλkhk(x)
不等式条件约束:
minf(x)s.t. hj(x)=0 j=1,2,…,p gk(x)≤0 k=1,2,…,qL(x,λ,μ)=f(x)+j=1∑pλjhj(x)+k=1∑qμkgk(x)
2、线性分类器
首先给出一个非常非常简单的分类问题(线性可分),我们要用一条直线,将下图中黑色的点和白色的点分开,很显然,图上的这条直线就是我们要求的直线之一(可以有无数条这样的直线)。
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM3Mi8yNGY4MGMyOGY0N2JiNzdkZWU0M2I2ZDRkNjNiNTFlNC5wbmc=)
假如说,我们令黑色的点 = -1, 白色的点 = +1,直线f(x)=wx+b。当向量x的维度=2的时候,f(x) 表示二维空间中的一条直线, 当x的维度=3的时候,f(x) 表示三维空间中的一个平面,当x的维度=n > 3的时候,表示n维空间中的超平面。
一个很直观的感受是,让这条直线到给定样本中最近的点最远,这句话读起来比较拗口,下面给出几个图,来说明一下:
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk2Ny9kMGQ0NDUzMDhiNjRkODM2NjA3MzBlNWM1ZDYxNzFiZi5wbmc=)
这两种分法哪个更好呢?
就像我们平时判断一个人是男还是女,就是很难出现分错的情况,这就是男、女两个类别之间的间隙非常的大导致的,让我们可以更准确的进行分类。在SVM中,称为Maximum Marginal,是SVM的一个理论基础之一。选择使得间隙最大的函数作为分割平面是有很多道理的,比如说从概率的角度上来说,就是使得置信度最小的点置信度最大,从实践的角度来说,这样的效果非常好。上图被红色和蓝色的线圈出来的点就是所谓的支持向量(support vector)。
3、线性可分支持向量机
在这里假设二维特征向量 X =(x1,x2),做另外一个假设就是把b看作是另外一个weight,那么超平面就可以更新为:
b+w1∗x1+w2∗x2=0
所有超平面右上方的点满足:
b+w1∗x1+w2∗x2>0
所有超平面左下方的点满足:
b+w1∗x1+w2∗x2<0
给定一个特征空间上的训练数据集:T={(x1,y1),(x2,y2),(x3,y3)…(xn,yn)},其中,x1∈Rn,yi∈{+1,−1},i=1,2,3,4…N,xi为第i个实例(若 n>1,xi为向量),yi为xi的类标记,当yi=+1时,称xi为正例,当yi=−1时,称xi为负例,(xi,yi)称为样本点。
对平面中的点进行等比例缩小或者放大,总有一个比例,使得支持向量点到超平面的距离为1。
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkzMS8zYmFhZTg1Mzk1YjZkNGE4YjU3ODZmOWFmZGIyYzlmMy5wbmc=)
4、SVM的目标函数
把w1和w2看成一个向量,x1,x2也是一个向量,则有
y(x)=wTΦ(x)+b{y(xi)>0⟺yi=+1y(xi)<0⟺yi=−1⟹yi⋅y(xi)>0
w,b等比例缩放,等价于点到超平面的距离缩放,从而
∣∣w∣∣yi⋅y(xi)=∣∣w∣∣yi⋅(wT⋅Φ(xi)+b)
前面已经提到过,让这条直线到给定样本中最近的点最远,即目标函数是
argw,bmax{∣∣w∣∣1min[yi⋅(wT⋅Φ(xi)+b)]}
因为这里的约束条件是支持向量点到超平面的距离为1,即
yi⋅(wT⋅Φ(xi)+b)≥1
到这里,我们前面的问题转化为了求
argw,bmax∣∣w∣∣1s.t. yi⋅(wT⋅Φ(xi)+b)≥1 i=1,2,…,n
∣∣w∣∣是w的二范数,跟w⋅w表达式是一个意思,之前得到,求SVM的关键就是,最大化这个式子等价于最小化∣∣w∣∣,另外由于∣∣w∣∣是一个单调函数,我们可以对其加入平方,和前面的系数。
max∣∣w∣∣1⟶min21∣∣w∣∣2s.t. yi(wT⋅Φ(xi)+b)≥1, i=1,2,…,n
转化为对偶问题,并优化求解。
这个优化问题可以用拉格朗日乘子法去解,使用了KKT条件的理论,这里直接作出这个式子的拉格朗日目标函数:
L(w,b,α)=21∣∣w∣∣2−i=1∑nαi(yi(wTxi+b)−1)
求解这个式子的过程需要拉格朗日对偶性的相关知识。
原问题是极小极大问题:
w,bminαmaxL(w,b,α)
问题的对偶问题,是极大极小问题:
αmaxw,bminL(w,b,α)
首先让L关于w,b最小化,分别令L关于w,b的偏导数为0,得到关于原问题的一个表达式:
∂w∂L=0∂b∂L=0⟹w=i=1∑nαiyiΦ(xn)⟹0=i=1∑nαiyi
目标函数L(w,b,α)的推导过程如下:
L(w,b,α)αmaxw,bminL(w,b,α)s.t. =21∣∣w∣∣2−i=1∑αi[y(i)(wTx(i)+b)−1]=21wTw−i=1∑mαiy(i)wTx(i)−i=1∑mαiy(i)b+i=1∑mαi=21wTi=1∑mαiy(i)x(i)−i=1∑mαiy(i)wTx(i)−i=1∑mαiy(i)b+i=1∑mαi=21wTi=1∑mαiy(i)x(i)−wTi=1∑mαiy(i)x(i)−i=1∑mαiy(i)b+i=1∑mαi=−21wTi=1∑mαiy(i)x(i)−bi=1∑mαiy(i)+i=1∑mαi=−21(i=1∑mαiy(i)x(i))Ti=1∑mαiy(i)x(i)−bi=1∑mαiy(i)+i=1∑mαi=−21(i=1∑maiyixi)T(i=1∑maiyixi)−bi=1∑maiyi+i=1∑mai=−21i=1∑maiyixiTi=1∑maiyixi+i=1∑mai=−21i=1,j=1∑maiyixiTajyjxj+i=1∑mai=i=1∑mai−21i=1,j=1∑maiajyiyjxiTxj=αmin21i=1∑nj=1∑nαiαjyiyj(Φ(xi)⋅Φ(xj))−i=1∑nαii=1∑nαiyi=0αi≥0, i=1,2,…,n
假设有最优解α∗,则有:
w∗b∗=i=1∑Nαi∗yiΦ(xi)=yi−i=1∑Nαi∗yi(Φ(xi)⋅Φ(xj))
求得分离超平面:w∗Φ(x)+b∗=0
分类决策函数:f(x)=sign(w∗Φ(x)+b∗)
示例:给定三个数据点:正例点x1=(3,3),x2=(4,3),负例点x3=(1,1),求线性可分支持向量机。
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg3MC8zYzM4MGQyZTFkMmE4OGFlYTFmN2RkZDZjMjc5MmYzNi5wbmc=)
s.t. αmin21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)−i=1∑nαi=21(18α12+25α22+2α32+42α1α2−12α1α3−14α2α3)−α1−α2−α33α1+3α2−α3=0αi≥0, i=1,2,3
5、引入松弛变量的线性不可分支持向量机
我们知道所有数都不那么干净,不能100%线性可分。我们可以通过引入松弛变量,来允许有些数据点可以处于分割面的错误的一侧。
需要加一个松弛因子ξi≥0:
yi(w⋅xi+b)≥1−ξi
目标函数:
s.t. w,bmin21∣∣w∣∣2+Ci=1∑Nξiyi(w⋅xi+b)≥1−ξi, i=1,2,…,nξi≥0, i=1,2,…,n
拉格朗日函数:
L(w,b,ξ,α,μ)=21∣∣w∣∣2+Ci=1∑nξi−i=1∑nαi(yi(w⋅xi+b)−1+ξi)−i=1∑nμiξi
C代表惩罚系数,即如果某个x是属于某一类,但是它偏离了该类,跑到边界上其他类的地方去了,C越大表明越不想放弃这个点,边界就会缩小(sklearn里面默认是1)。
接下来就是同样的,求解一个拉格朗日对偶问题,得到一个原问题的对偶问题的表达式:
⟹w,bminαmaxL(w,b,ξ,α,μ) 原问题αmaxw,bminL(w,b,ξ,α,μ) 对偶问题
对w,b,ξ求偏导:
∂w∂L=0∂b∂L=0∂ξ∂L=0⟹w=i=1∑nαiyiΦ(xn)⟹0=i=1∑nαiyi⟹C−αi−μi=0
带入得:
w,b,ξminL(w,b,ξ,α,μ)=−21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)+i=1∑nαi
对原问题求极大得:
s.t. αmax−21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)+i=1∑nαii=1∑nαiyi=0C−αi−μi=0αi≥0μi≥0, i=1,2,…,n
整理得:
s.t. αmin21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)−i=1∑nαii=1∑nαiyi=00≤αi≤C, i=1,2,…,n
αi的取值范围是与线性可分的对偶问题表达式的不同之处。在线性不可分情况下得到的对偶问题,不同的地方就是α的范围从[0, +∞),变为了[0, C],增加的惩罚ε没有为对偶问题增加什么复杂度。
6、SVM 序列最小化方法SMO
SMO是求两个拉格朗日乘子优化问题的解,假设α1和α2是变量,其他是定值:
s.t. s.t. αmin21i=1∑Nj=1∑NαiαjyiyjK(xi⋅xj)−i=1∑Nαii=1∑Nαiyi=00≤αi≤C, i=1,2,…,Nα1,α2minW(α1,α2)=21K11α1T+21K22α22+y1y2α1α2K12−(α1+α2)+y1α1i=3∑NyiαiKi1+y2α2i=3∑NyiαiKi2α1y1+α2y2=−i=3∑Nyiαi=ζ0≤αi≤C
迭代公式:
g(x)ηEiαjnew=i=1∑NyiαiK(xi,x)+b=K(x1,x1)+K(x2,x2)−2K(x1,x2)=∣∣Φ(x1)−Φ(x2)∣∣2=g(xi)−yi=(j=1∑NyjαjK(xj,xi)+b)−yi, i=1,2=αjold+ηyj(Ei−Ej)
退出条件:
i=1∑Nαiyi=00≤αi≤C, i=1,2,…,nyi⋅g(xi)=⎩⎪⎨⎪⎧≥1,=1,≤1,{xi∣αi=0} 落在边界外{xi∣0<αi<C} 落在边界上{xi∣αi=C} 落在边界内g(xi)=j=1∑nyjαjK(xj,xi)+b
7、核函数
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI4Ny81YTBiNDYzMzUwYmE5ZmQyYjJhYjg5YTE2YzFjZDlmZi5wbmc=)
如图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时该如何把这两类数据分开呢?由我们的经验可以得到,一个理想的分界应该是一个“圆圈”而不是一条线(超平面) 。如果用X1和X2来表示这个二维平面的两个坐标的话, 我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写成这样的形式:
a1X1+a2X12+a3X2+a4X22+a5X1X2+a6=0
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为Z1=X1,Z2=X12,Z3=X2,Z4=X22,Z5=X1X2,那么显然,上面的方程在新的坐标系下可以写做:
i=1∑5aiZi+a6=0
关于新的坐标Z,这正是一个超平面(hyper plane)的方程。也就是说,如果我们做一个映射ϕ:R2→R5,将X按照上面的规则映射为Z,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!其实刚才的方法稍想一下就会发现有问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;如果原始空间是三维,那么我们会得到 19 维的新空间,这个数目是呈爆炸性增长的,这给计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算。
不妨还是从最开始的简单例子出发,设两个向量x1=(η1,η2)T和x2=(ξ1,ξ2)T,前面说的五维空间的映射,映射过后的内积为:
<ϕ(x1),ϕ(x2)>=η1ξ1+η12ξ12+η2ξ2+η22ξ22+η1η2ξ1ξ2
另外,我们又注意到:
(<x1,x2>+1)2=2η1ξ1+η12ξ12+2η2ξ2+η22ξ22+2η1η2ξ1ξ2+1
二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度就是一样的了。
事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM如何处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数K,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。
核函数与之前计算的区别:
- 核函数是映射到高维空间中,然后再根据内积的公式进行计算
- 之前的计算方式则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果
我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数(Kernel Function),例如在刚才的例子中,我们的核函数为:
K(x1,x2)=(<x1,x2>+1)2
常用的几个核函数:
多项式核:K(x1,x2)=(<x1,x2>+R)d
高斯核函数RBF:K(x1,x2)=exp(−2σ2∣∣x1−x2∣∣2)
线性核:K(x1,x2)=<x1,x2>
核函数的本质:
实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(如上文的那幅图所示,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的)。
但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小会很高。
此时就需要核函数,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
最后引用这里的一个例子举例说明下核函数解决非线性问题的直观效果。
假设现在你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你需要搭建一个篱笆来把羊群围起来。但是篱笆应该建在哪里?你很可能需要依据牛群和狼群的位置建立一个“分类器”,比较下图这几种不同的分类器,我们可以看到SVM完成了一个很完美的解决方案。
![支持向量机SVM和核函数详述 支持向量机SVM和核函数详述](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg4NC85ZGMzMWVkMGU5YTZkNmEyOWE1MGU3YzVhNjE1ZDMyYy5wbmc=)