今天在看支持向量机通俗导论,被完全震撼到了,这篇文章就记录下一些总结性的内容,具体的推导还要看原文。
支持向量机是一个二分类方法,通过最大化超平面的间隔进行分类,分出的类别用1和-1来表示。这种表示方法起源于逻辑回归。
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
从而,当我们要判别一个新来的特征属于哪个类时,只需求即可,若大于0.5就是y=1的类,反之属于y=0类。
Logistic回归就是要学习得到,使得正例的特征远大于0,负例的特征远小于0,而且要在全部训练实例上达到这个目标。
为了确定这个超平面,也就是最能区分两类点的直线,最直接的办法就是计算点到这条直线的间隔,如果这条直线离两边的点间隔最大,就说明是最合适的直线。因此,就是要找具有最大间隔的超平面。间隔有两种定义方法:
在超平面w*x+b=0确定的情况下,|w*x+b|能够表示点x到距离超平面的远近,由于在SVM里面,将正例和反例用1和-1表示,因此通过观察w*x+b的符号与类标记y的符号是否一致可判断分类是否正确,所以,可以用(y*(w*x+b))的正负性来判定或表示分类的正确性。
定义函数间隔(用表示)为:
这是一个点跟超平面的函数间隔计算方法,而超平面(w,b)关于T中所有样本点(xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:
= mini (i=1,...n)
但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还远远不够。
几何间隔(用表示)的定义:
从上述函数间隔和几何间隔的定义可以看出:几何间隔就是函数间隔除以||w||,而且函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。
所以确定最大间隔分类器的目标函数就变成了
同时需满足一些条件,根据间隔的定义,有
又由于,为了方便计算,我们将函数间隔设为1,从而目标函数变成
这个目标函数便是在相应的约束条件下,最大化这个1/||w||值,而1/||w||便是几何间隔。这样也说明了我们的分类是在-1到1之间的。
下面用图来具体说明一下哪些是支持向量,以及几何间隔的表示:
如下图所示,中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),我们通过计算几何间隔可以画出两条虚线,其到中间实线的距离相等,这个距离便是几何间隔,两条虚线之间的距离等于2,而虚线上的点则是支持向量。由于这些支持向量刚好在边界上,所以它们满足(还记得我们把 functional margin 定为 1 了吗?上节中:处于方便推导和优化的目的,我们可以令=1),而对于所有不是支持向量的点,则显然有。
对于一个数据点 x 进行分类,实际上是通过把 x 带入到算出结果然后根据其正负号来进行类别划分的。而前面的推导中我们将求解
这个目标函数转换成了
求解这个,从而实现目标函数是二次的,约束条件是线性的,最终转换成了一个凸优化的问题。这里通过拉格朗日对偶性变化到对偶变量的优化问题,将每个约束条件都加上一个拉格朗日乘子,定义拉格朗日函数,从而将约束条件融合到目标函数中,只用一个表达式就表示出问题。之后先求L对w,b的极小,再求 对的极大(用一种快速学习算法SMO来做)。
经过一番转化,最终得到
因此分类函数为:
这里的形式的有趣之处在于,对于新点 x的预测,只需要计算它与训练数据点的内积即可(表示向量内积),这一点至关重要,是之后使用 Kernel 进行非线性推广的基本前提。此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非Supporting Vector 所对应的系数都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。
计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function)
核函数在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。
因为训练样例一般是不会独立出现的,它们总是以成对样例的内积形式出现,而用对偶形式表示学习器的优势在为在该表示中可调参数的个数不依赖输入属性的个数,通过使用恰当的核函数来替代内积,可以隐式得将非线性的训练数据映射到高维空间,而不增加可调参数的个数(当然,前提是核函数能够计算对应着两个输入特征向量的内积)。
而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器。
通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:
Outlier是指偏离正常位置很远的点,这些点很可能使本来线性结构的数据变成非线性的,又由于超平面本身就是由很少的几个支持向量决定的,如果这些支持向量里面再有离群点影响就更大了,因此SVM 允许数据点在一定程度上偏离一下超平面。
原来的约束条件为:
现在考虑到outlier问题,约束条件变成了:
其中称为松弛变量 (slack variable) ,对应数据点允许偏离的 functional margin 的量。当然,如果我们运行任意大的话,那任意的超平面都是符合条件的了。所以,我们在原来的目标函数后面加上一项,使得这些的总和也要最小:
其中 是一个参数,用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。注意,其中 是需要优化的变量(之一),而 是一个事先确定好的常量。完整地写出来是这个样子:
监督学习实际上就是一个经验风险或者结构风险函数的最优化问题。风险函数度量平均意义下模型预测的好坏,模型每一次预测的好坏用损失函数来度量。它从假设空间F中选择模型f作为决策函数,对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数来度量预测错误的程度。损失函数记为L(Y, f(X))。