支持向量机(Support Vector machines) 简称SVM是机器学习里面很经典的一个算法,懂了支持向量机你就可以做很多项目了。
先通俗的讲述一下原理,不会提什么"函数间隔”,“几何间隔“”。从最简单的线性二分类问题入手。我们要找到一条直线,能把所有样本分为两类。这样的直线有很多,我们需要选取一条最优的,我们认为分类直线离样本最远就是最优的。因为离的越远,就越不容易误分类,为什么呢?想象一下,如果样本点紧贴着分类直线,新来一个样本略微不同于这个样本,它就很容易被分到另一类。我们怎么达到分类直线离样本最远这一效果呢,需要先找到两类中离分类直线最近的样本点,让它们与分类直线的距离最大来训练参数。这些离分类直线最近的样本点,我们叫它们支持向量,这也是支持向量机名字的由来。这段话看完了,可能还不是很理解,立即看图,你就豁然开朗。
其中红色直线是最优分割线,蓝色直线也可以分类,但不是最优,因为它距离B太近了。图中的A,B两个样本,就是支持向量,也就是离最优分类直线最近的点,怎么找到他们呢,下面会讲到。上面说离支持向量最远的直线就是最优分类直线,是这样理解的,要同时保证它离A和B最远,蓝色线虽然离A很远,但是它离B很近,不满足条件。只有当分类直线距离A,B是等距的时候,才能保证即离A最远,又离B最远。大致原理讲完了,接下来详述SVM的过程。
假定样本集T={(x1,y1),(x2,y2),...,(xn,yn)},其中x表示特征向量,y表示该特征属于的类别。当y=1,x属于正例,当y=-1,x属于负例。注意这里类别y不再是logistic回归里面的0和1了。原因随后你就会明白。这里x是一个向量,所以这里不再是分类直线了,而是分类超平面,什么是超平面呢,一维我们叫线,二维叫面,三维叫体,三维以上就叫超平面。我们仍然假设问题是线性可分的,我们要求的超平面为:
,其中w={w1;w2;...;wn}
其实在机器学习中,向量有一个约定俗成的规矩,一个向量它初始状态就是列向量,这里w是列向量,转置之后是行向量,x也是列向量,相乘得到一个常数,加上常数b等于0;
那么样本空间中任意点到超平面的距离可写为:
(1)
就是初中学的点到直线距离公式。假设超平面能将训练样本正确分类。那么
在y=+1类别这边的点,一定可以使
在y=- 1类别这边的点,一定可以使
又由于同时扩大缩小w和b,仍是同一条直线,所以我们可以令:
, y=+1; (2)
, y=-1 . (3)
那么再结合上面讲得原理,我们的最优超平面所依赖的样本是,距离超平面最近的样本点,那这些样本点一定在
或者上,这里细细品味一下。那这些支持向量到的超平面的距离公式也就可以从(1)式变为下式:
(4)
那么我们要做的就是最大化r,但是有约束条件的 ,就是样本点要满足这个条件,这个公式就是把类别信息与(2)(3)式融合得到的。
总上我们可以列出:
(5)
s.t. , i=1,2,...,m.
这里看不懂的话建议复习一下微积分的拉格朗日乘子法。公式(5)形式,不是一个凸优化问题,不利于我们求解,所以我们稍作转换。
(6)
s.t. , i=1,2,...,m.
最大化分母等于最小化其倒数,加一个1/2是为了求导时约去2。因为w本来就是要训练出来的,所以它前面的系数不会影响到结果。
这个式子要怎么解,就用到拉格朗日乘子法。首先我们构建拉格朗日函数。为此为每个不等式约束条件引进拉格朗日乘子,定义拉格朗日函数:
(7)
然后令,这就是拉格朗日乘子法,可以这样理解,我们最大化L,如果不满足约束条件,那么maxL后它将是无穷大,我们无法再求它的最小值。我们最后得出结果的时候,它必须是满足约束条件的,即的最优值为,接着即为所求。我们这样直接求,过程很麻烦,所以我们要转化为拉格朗日对偶问题,这样做的优点,一是对偶问题往往更容易求解;二是自然引入核的函数,进而推广到非线性分类问题。事实上
maxmin(...)<= minmax(...),这个式子你举个例子就可以证明,你举不出来反例的。另外只要满足KKT条件,等号就成立。我们这个优化函数是满足KKT条件的,可能是SVM的特性正好就满足KKT条件。说个题外话,这里初学者,不必在意为什么为什么KKT条件在这里是怎么用的,我们现在是要理解SVM,我们是要把SVM的过程梳理下来,所谓站在巨人的肩膀上,应该就是这样吧,前人的研究结论,我们拿来用就是了,比如我们写一个C++程序,总不能先要去学会如何编写一个编译器吧。为什么这么说,因为我在KKT条件上花了太多时间,到现在还没有完全明白这里KKT条件是怎么用的,每本书上的说法都不一样,所有关于它的博客也都讲的含糊其辞,研究它我觉得有点得不偿失,毕竟不是数学专业,如果有懂的朋友可以跟我讲讲。所以综上,我们这里的函数满足KKT条件,所以可以将原问题转化为对偶问题且一定有解:
接下来就开始我们牛逼的推导过程。
求L对w和b的极小值,就要分别对w和b求偏导,另其等于0。
(8)
(9)
得到 (10)
代入(7)式得
(11)
再由公式9,化简11式,得
(12)
这里是向量内积表示为<xi,xj>.
接着是极大化过程
s.t.
至于这个问题怎么求解,我们有一个很高效的方法叫序列求解法SMO,下下一篇讲,我们下一篇先引入核函数,将现行分类扩展到非线性分类。
我现在只需知道解出α后,就可以代入值求出w和b。然后新来的要分类的样本根据w和b做一次线性运算,然后看求得结果使否大于0,从而判断是正例还是负例。具体实现
首先我们上面得到 因此在求出α后,新来一个样本的时候,我们和训练数据中所有的样本做内积即可。其实不用这么大的计算量,我们从KKT条件中得到,只有支持向量的α>0,其他情况α=0.因此,我们只需求新来的样本和支持向量的内积,然后运算即可。