SVM问题小结

来源:互联网 发布:千峰php培训多少钱 编辑:程序博客网 时间:2024/06/10 12:35

一 SVM基本介绍

支持向量机(Support Vector Machine)在解决小样本、非线性及高维模式识别中表现出许多特有的优势,是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的。

VC维:对函数类的一种度量,可以简单的理解为问题的复杂程度,VC维越高,一个问题就越复杂。

经验误差/经验风险:使用分类器在样本数据上的分类的结果与真实结果(因为样本是已经标注过的数据,是准确的数据)之间的差值来表示。这个差值叫做经验风险Remp(w)。

真实风险应该由两部分内容刻画,一是经验风险,代表了分类器在给定样本上的误差;二是置信风险,代表了我们在多大程度上可以信任分类器在未知文本上分类的结果。很显然,第二部分是没有办法精确计算的,因此只能给出一个估计的区间,也使得整个误差只能计算上界,而无法计算准确的值(所以叫做泛化误差界,而不叫泛化误差)。

置信风险与两个量有关,一是样本数量,显然给定的样本数量越大,我们的学习结果越有可能正确,此时置信风险越小;二是分类函数的VC维,显然VC维越大,推广能力越差,置信风险会变大。

泛化误差界的公式为:

R(w)≤Remp(w)+Ф(n/h)

公式中R(w)就是真实风险,Remp(w)就是经验风险,Ф(n/h)就是置信风险。统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小,即结构风险最小。

SVM正是这样一种努力最小化结构风险的算法。

小样本,并不是说样本的绝对数量少,而是说与问题的复杂度比起来,SVM算法要求的样本数是相对比较少的,仅仅用到那些称之为“支持向量”的样本。

非线性,是指SVM擅长应付样本数据线性不可分的情况,主要通过松弛变量(也有人叫惩罚变量)和核函数技术来实现,

高维模式识别是指样本维数很高,SVM可以处理文本分类中文本的向量几万维的表示,主要是因为SVM 产生的分类器很简洁,用到的样本信息很少(仅仅用到那些称之为“支持向量”的样本,此为后话),使得即使样本维数很高,也不会给存储和计算带来大麻烦(相对照而言,kNN算法在分类时就要用到所有样本,样本数巨大,每个样本维数再一高,就无法解决了)。

二 最大化几何间隔的原因

之所以如此关心几何间隔这个东西,是因为几何间隔与样本的误分次数间存在关系:
这里写图片描述

其中的δ是样本集合到分类面的间隔,R=max ||xi|| i=1,…,n,即R是所有样本中(xi是以向量表示的第i个样本)向量长度最长的值(也就是说代表样本的分布有多么广)。先不必追究误分次数的具体定义和推导过程,只要记得这个误分次数一定程度上代表分类器的误差。而从上式可以看出,误分次数的上界由几何间隔决定!(当然,是样本已知的时候)

至此我们就明白为何要选择几何间隔来作为评价一个解优劣的指标了,原来几何间隔越大的解,它的误差上界越小。因此最大化几何间隔成了我们训练阶段的目标。

三 线性SVM的求解

在求取有约束条件的优化问题时,拉格朗日乘子法 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值;如果含有不等式约束,可以应用KKT条件去求取。当然,这两个方法求得的结果只是必要条件,只有当是凸函数的情况下,才能保证是充分必要条件

拉格朗日乘子法:
这里写图片描述
不等式约束:
这里写图片描述

为什么拉格朗日乘子法和KKT条件能够得到最优值?
拉格朗日乘子:
如下图所示,目标函数等高线f(x,y),约束条件g(x,y)。假设g(x,y)与等高线f(x,y)=d相交,交点就是同时满足等式约束条件和目标函数的可行域的值,但肯定不是最优值,因为相交意味着肯定还存在其它的等高线在该条等高线的内部或者外部,使得新的等高线与目标函数的交点的值更大或者更小,只有到等高线与目标函数的曲线相切的时候,可能取得最优值,
这里写图片描述

KKT条件:
这里写图片描述

四 SVM处理离群点

这里写图片描述

这里写图片描述
对偶优化函数的目标形式:
这里写图片描述

支持向量:
根据软间隔最大化时KKT条件,可以而出:
这里写图片描述
这里写图片描述    

注意
1)并非所有的样本点都有一个松弛变量与其对应。实际上只有“离群点”才有,所有没离群的点松弛变量都等于0。
2)松弛变量的值实际上标示出了对应的点到底离群有多远,值越大,点就越远。
3)惩罚因子C决定了对离群点带来的损失的惩罚,显然当所有离群点的松弛变量的和一定时,你定的C越大,对目标函数的损失也越大,反之越小。

五 SVM核函数

核函数本质是通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。其优点在于直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果,避免了直接在高维空间中的复杂计算。核函数能简化映射空间中的内积运算,而SVM 里需要计算的地方数据向量总是以内积的形式出现的。

六 SVM的计算复杂度

使用SVM进行分类的时候,实际上是训练和分类两个完全不同的过程,因而讨论复杂度就不能一概而论,我们这里所说的主要是训练阶段的复杂度,即解那个二次规划问题的复杂度。对这个问题的解,基本上要划分为两大块,解析解和数值解。

解析解就是理论上的解,它的形式是表达式,因此它是精确的,一个问题只要有解,那它的解析解是一定存在的。当然存在是一回事,能够解出来,或者可以在可以承受的时间范围内解出来,就是另一回事了。对SVM来说,求得解析解的时间复杂度最坏可以达到O(Nsv3),其中Nsv是支持向量的个数,而虽然没有固定的比例,但支持向量的个数多少也和训练集的大小有关。

数值解就是可以使用的解,是一个一个的数,往往都是近似解。求数值解的过程非常像穷举法,从一个数开始,试一试它当解效果怎样,不满足一定条件就试下一个,当然下一个数不是乱选的,也有一定章法可循。有的算法,每次只尝试一个数,有的就尝试多个,而且找下一个数字(或下一组数)的方法也各不相同,停机条件也各不相同,最终得到的解精度也各不相同,可见对求数值解的复杂度的讨论不能脱开具体的算法。

一个具体的算法,Bunch-Kaufman训练算法,典型的时间复杂度在O(Nsv3+LNsv2+dLNsv)和O(dL2)之间,其中Nsv是支持向量的个数,L是训练集样本的个数,d是每个样本的维数(原始的维数,没有经过向高维空间映射之前的维数)。复杂度会有变化,是因为它不光跟输入问题的规模有关(不光和样本的数量,维数有关),也和问题最终的解有关(即支持向量有关),如果支持向量比较少,过程会快很多,如果支持向量很多,接近于样本的数量,就会产生O(dL2)这个十分糟糕的结果。

七 SVM的两种损失函数

这里写图片描述