赞
踩
支持向量机(SVM)的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。 实际应用中一般要解决觉得是多分类问题,SVM也可以用了来解决多分类,可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式等。
一般SVM有下面三种:
这里通过一个有趣的故事来介绍
SVM之大侠与反派:
在很久以前,大侠的心上人被反派囚禁,大侠想要去他的心上人,于是便去和反派谈判。反派说只要你能顺利通过三关,我就放了你的心上人。
现在大侠的闯关正式开始:
第一关:反派在桌子上似乎有规律地放了两种颜色的球,说:你用一根棍子分离它们。要求是尽量再放更多的球之后,仍然适用。
大侠很利索地放了一根棍子如下:
第二关:反派在桌子上放了更多的球,似乎有一个红球站错了阵营
图一
SVM就是试图把棍子放在最佳位置,好让在棍的两边有尽可能大的间隙!!!
于是大侠调整如下,现在即使反派放很多的球,棍子依然是一个很好的分界线
图二
由于反派放球的局限性或噪声的因素,放进的球可能更接近图一两个类的分隔界,这将使划分出现错误,而图二分隔界受影响最小.换言之,图二分隔界(划分超平面)所产生的分类结果是最鲁棒的,对未见实例的泛化能力强。
第三关:反派看大侠又解决了,心生一计给大侠一个更难的挑战,反派将球散乱地放在桌子上。
现在大侠已经没有办法用一根棍子将这些球分开了,怎么办呢?大侠灵机一动,使出三成内力拍向桌子,然后桌子上的球被震到空中,说时迟那时快,大侠瞬间抓起一张纸,插到了两种球的中间。
现在从反派的角度看,这些球像是被一条曲线分开了,于是他放了大侠的心上人。
概述一下:
当一个分类问题,数据是线性可分(linearly separable)的,也就是用一根棍就可以将两种小球分开的时候,我们只要将棍的位置放在让小球距离棍的距离最大化的位置即可,寻找这个最大间隔的过程,就叫做最优化。但是,现实往往是很残酷的,一般的数据是线性不可分的,也就是找不到一个棍将两种小球很好的分类。这个时候,我们就需要像大侠一样,将小球拍起,用一张纸代替小棍将小球进行分类。想要让数据飞起,我们需要的东西就是核函数(kernel),用于切分小球的纸,就是超平面(hyperplane)。 如果数据集是N维的,那么超平面就是N-1维的。
给定数据集D= {(x1, y1), (x2,y3),…,(xm,ym)},yi∈{ -1,+1 },进行二分类。
在样本空间中,划分超平面可通过线性方程ωTx+b = 0来描述。其中 ω决定了超平面的方向,b决定了超平面的位置。
这里还要知道,一个向量到一个超平面的距离计算公式(不难理解的,和点到直线距离公式很像):
如图6.2所示,距离超平面最近的这几个训练样本点使式ωTx+b = -1(+1);它们被称为"支持向量",两个异类支持向量到超平面的距离为
也被称为间隔,所以我们要将间隔最大化,只要(为了方便后面求导,进行一点点的变形)
【注:上面直接取ωTx+b = -1(+1)实际上并不草率,取-+100,甚至-+1000都是可以的,只是将ω和b进行相应的放缩,仍表示同一个超平面。这里取 -1(+1)是为了方便计算】
上面的目标函数是建立在一定的约束条件的基础上的
我们如何判断一条直线能够将所有的样本点都正确分类?
超平面的位置应该是在间隔区域的中轴线上,所以确定超平面位置的b参数也不能随意的取值
对于一个给定的超平面,我们如何找到对应的支持向量,来计算距离d?
如果(ω,b)能正确分类,则即对于(xi,yi)∈D,若yi= -1, ωTx+b<0; 若yi= +1, ωTx+b>0。
现在要求在高点,超平面的位置在间隔区域的中轴线上,则即对于(xi,yi)∈D,若yi= -1, ωTx+b<-1; 若yi= +1, ωTx+b>1。
所以呢,约束条件最终用一个不等式来表示(这里不等式取等号时,xi是一个支持向量)
【这里就可以体会到了 yi取 -1 or +1 和 ωTx+b = -1(+1)的好处了,把约束条件糅合到一个不等式中】
所以线性SVM优化数学的描述是
s. t. 表示约束条件,在这个不等式条件下,最小化 1 / 2 *ω2
这就是支持向量机(SupportVector Machine,简称SVM)的基本型
上面已经得到了SVM的基本型,那下一步怎么求呢?我们将利用拉格朗日乘子法得到对偶问题。这样做更高效;后面也可以自然的引入核函数,进而推广到非线性分类问题。
实际上,拉格朗日乘子法也是想把约束条件添加到目标函数里去构建一个新函数,结果虽然有了一些其他的条件,但此时的w,b已经不受限制,已经转移到我们加的一些参数身上。
现在开始SVM的拉格朗日对偶函数求解(这里没有等式约束条件,所以只考虑不等式即可):
第一步,我们就先求括号里的min部分
求min进行w,b的求偏导很容易得到:
再将结果带入前面的式子
最后求解模型(一般的问题都会转化为求min,所以将上式加个负号进行转化,SMO就类似其他算法利用梯度下降得到参数的算法)
【注意】
在前面的讨论中,我们一直假定训练样本在样本空间或特征空间中是线性可分的,即存在一个超平面能将不同类的样本完全划分开.然而,在现实任务中往往很难确定做到。
硬间隔对离群点也比较敏感,如图
第二个图加入了一个离群点,超平面发生了很大的变动,形成的间隔也变得很小,这样泛化效果会变弱。缓解该问题的一个办法是允许支持向量机在一些样本上出错.为此,要引入"软间隔"的概念。这样处理也解决了一定程度上的过拟合。如图
软间隔允许一些样本不满足约束条件 yi*(ωTxi+b)>1,为此对于每个样本引入了松弛变量ξi,优化问题变为:
【注:C>0,被称为惩罚参数,即为 scikit-learn 中的 svm 超参数C。当C设的越大,意味着对离群点的惩罚就越大,最终就会有较少的点跨过间隔边界,模型也会变得复杂。而C设的越小,则较多的点会跨过间隔边界,最终形成的模型较为平滑。】
接下来和硬间隔的求法类似
再进行和上面一样的求导计算,这里就直接给出结果了
代入得到
看到最后的结果,与硬间隔相比,我们仅仅多了一个约束条件
最后模型求解同样可以用SOM算法
现在我们讨论线性不可分的时候,也就是大侠闯的第三关,他无法再单纯的用一根棍子来划分了,所以他往桌子上一拍球飞起来,再用一张纸插到了两种球的中间。大侠把在二维平面的球转化到了三维上从而解决了问题,所以线性不可分的低维特征数据,我们可以将其映射到高维,就能线性可分。
回顾我们的线性可分优化目标函数
注意到上式低维特征仅仅以内积xi ∙ xj的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射ϕ(如2维到5维的映射),将所有特征映射到一个更高的维度,让数据线性可分。也就是说现在的SVM的优化目标函数变成:
可以看到,和线性可分SVM的优化目标函数的区别仅仅是将内积xi ∙ xj替换为ϕ(xi)∙ϕ(xj)。这样子其实并不完美,我们看看,假如是一个2维特征的数据,我们可以将其映射到5维来做特征的内积,如果原始空间是三维,可以映射到到19维空间,似乎还可以处理。但是如果我们的低维特征是100个维度,1000个维度呢?那么我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。
好吧,核函数该隆重出场了!
假设ϕ是一个从低维的输入空间χ(欧式空间的子集或者离散集合)到高维的希尔伯特空间的H映射。那么如果存在函数K(x,z),对于任意x,z∈χ,都有:
K(x,z)=ϕ(x)∙ϕ(z)。 那么我们就称K(x,z)K(x,z)为核函数。
K(x,z)K(x,z)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数好在它在低维上进行计算,而将实质上的分类效果(利用了内积)表现在了高维上。
有了核函数SVM才算是比较完整的。现在我们进行一个总结,不分线性是否可分:
输入是m个样本(x1,y1),(x2,y2),…,(xm,ym),其中x为n维特征向量。y为二元输出,值为1,或者-1。
输出是分离超平面的参数w∗和b∗分类决策函数。
算法过程:
这是一个二次规划问题,可使用通用的二次规划算法来求解;然而该问题的规模正比于训练样本数,这会在实际任务中造成很大的开销。所以我们使用SMO算法。
像神经网络、线性回归都可以使用到梯度下降法求解参数,但SVM用梯度下降法会相当的复杂,所以这里用到了一个叫‘坐标下降’的方法。简单来说,梯度下降每次是将所有的参数都更新,而坐标下降每次就更新两个参数,这样SMO算法将一个复杂的优化算法转化为一个比较简单的两变量优化问题。
为什么选择两个变量?
我们要注意到约束条件:
每次α的更新上面的条件必须要成立的。这下就清楚了,若改变一个α,肯定会破坏条件
;当更新两个时可以起一个调和的作用,就可以保证条件仍成立!
现在选择两个变量,其他变量固定看做常数
我们可以得到(看做常数没有α1,α2的乘积项对优化没有影响可以直接去掉)
之后的大概想法是消元,消去α1变成一个参数的优化问题,先求出α2,进而求出α1。
两个变量的二次规划
每次更新α还得注意α的约束条件,αNew是有一个区间范围的
消去α1,得到结果
经过一番后,得到了α2New.unc,这个还得符合α2的定义域
进行剪辑
更新b,E(每次α1和α2的更新,b和E都会改变。更新b, Ei也为下次计算α更新做准备)
这里更新E时仅仅使用支持向量的集合,而E的定义却是全部样本的。这是因为不是支持向量的样本对应的α都为0。
选择αi和αj
还有一个重要的问题:如何选择α1和α2
有里外两层循环。(注意!刚开始α都初始化为零)
外循环想找到违反KKT条件最严重的αi,直到没有再违反的KKT条件的α。
怎么算违反?如下面
内循环想找到 | E1 - E2|最大(使得目标函数减少的最快,更快的达到收敛)的αj,直到小于我们要求的精度 。
暂时草草地介绍到这里吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。