代码改变世界

支持向量机

2012-10-22 00:58  ggzwtj  阅读(530)  评论(0编辑  收藏  举报

机器学习有很多种,大的区分上面有“有监督”、“无监督”和“半监督”。而支持向量机就属于有监督的:给定一个正样本点和负样本点,支持向量机的目的是寻找一个超平面来对样本进行分割,目的是使正例和反例之间的间隔最大。那么该平面可以表示为:

  wTx+b=0

到这里大概就明白了,其实我们想要的是用一个规则去判断未知的节点的性质,但是不知道什么样的规则是准确的,SVM就是帮我门去根据一定的策略找到这条规则。

其实判断切面的优劣很简单:分得越开越好,那么如何衡量间隔的大小。首先根据上面的切面来看判定函数:

  f(x)=wTx+b

那么,|f(x)|越大,也就是说间隔也就越到。设y是节点对应的标志的值(这里说的比较模糊,举个例子就是,正的节点为+1,负的节点为-1),那么间隔就可以表示为:

  yf(x)=y*(wTx+b)

这种表示方法也称为函数间隔。表示非常简单,但是缺点也非常地明显:如果同时增加w、b,虽然还是同一个平面,但这时候指标就不同了。那怎么办呢?在w、b成比例改变的时候平面的位置是不变的,那么每个点到该平面的位置是不会发生变化的,也就是(根据点到直线的距离公式直接得出):

  f(x)/|w|

同函数间隔,考虑样本实际的值y得到评估标准为:

  γ=y*f(x)/|w|

这里可以很清楚地看到函数间隔和几何间隔之间的差别就是这个|w|,在w变化的时候f(x)也会等比例地变化,这样最后的γ就是保持不变的(目的达到)。而最终的目标是最大化间隔,也就是:

  max γ

那这个值是根据哪个点计算出来的?离分割面越近的点越难判断,我们的目的就是尽量准确地去判断出这类的点,那么也就是最大化最近的点,也就是;

  max min(γ)

这样貌似还不怎么直观,用运筹学中的语言描述就是(我们要求的是w而不是γ,所以只需要把γ固定一个值就可以找到w的一个可行值,其他的值可以在这个值的基础上乘一个倍数得到):

  在满足条件:

    yi*(wTxi+b)=γi≥γ=1

  求:

    max 1/|w|

求max 1/|w|也就等价于求min 0.5*|w|2(平方的原因是让该问题变成一个凸优化,0.5则是为了导数整齐- -~)。通过扩展的拉个朗日乘子法得到:

  L(w, b, a) =  0.5*|w|2-Σai(yi*(wTxi+b)-1)

令:θ(x) = max L(w, b, a) a ≥ 0

反证法容易在所有的约束条件都满足的时候(如果有一条不满足,那么让对应的ai设为无穷大,那么L也就无穷大了):

  θ(x) = 0.5*|w|2

这样我们的目标就从min 0.5*|w|2变为:

  min 0.5*|w|2 = min θ(x) = min max L(w, b, a) = p*

  变量为w、b,a为定值

将min max交换位置后得到:

  max min L(w, b, a) = d*   

  变量为a,w、b为定值

上面两种表达的含义是:在所有的a决定的L函数中,在(w、b)的可行域上能取到最大值为p,所有的p的小值为p*。同样,在所有的(w、b)决定的L中,在a的可行域中取到最小值为d,所有(w、b)中的最大值为d*。显然有d*≥p*(互为对偶问题)。关键就是这个=,什么时候才会出现这种情况(如果出现的话求出min max的最优值也就是max min的最优值)?出现的条件是KKT条件。

那么在L的极小值处有:

  ∂L/w = 0

  L/b = 0

对应的得到:

  w = ∑aiyixi

  ∑aiyi = 0

代入L(w, b, a)得到:

  L(w, b, a) = 0.5*∑aiajyiyjxiTxj - ∑aiajyiyjxiTxj - b∑aiyi + ∑ai

               = ∑ai - 0.5*∑aiajyiyjxiTxj

那么现在问题就化为:

  求:max ∑ai - 0.5*∑aiajyiyjxiTxj

  s.t.  ∑aiyi = 0

      ai ≥ 0

这个问题比原问题有更加有效的解决方法,但就此打住。这里再回过头来看分类函数:

  根据: f(x) = wTx + b

           w = ∑aiyixi

  得到: f(x) = (∑aiyixi)Tx + b

           = ∑aiyi<xi,x> + b

这样,在得到对偶函数的最优解之后也就知道如何去判断一个新点属于哪一类了:和所有的向量计算内积就行了。事实上大部分的ai = 0,也就是说在计算的时候只需要计算少数的几个向量的内积就可以了。在前面定义的L(w,b,a)函数中,只有在wTxi + b = 1的情况下ai > 0。而什么时候满足该条件呢?也就是说找到分割切面之后,里切割面最近的点才满足这个条件(也许这就是支持向量机名字的来源)。

对于非线性的情况,支持向量机的吹方法是选择一个核函数将数据映射到高维空间来解决在原始空间中线性不可分的问题,这样的非线性扩展在计算量上并没有比原来复杂多少,任何将计算表示为数据点的内积的方法,都可以使用该方法进行非线性扩展。这样分类函数可以描述为:

  f(x) = ∑wii(x) + b

  其中:Φi(x)表示从x到高维特征空间的映射

在原来的维度为2的时候,比如其中有(x1,x2),可以通过下面“核函数”进行映射:

  z1 = a1*x1, z2 = a2*x12, z3 = a3*x2, z4 = a4*x22, z5 = a5*x1*x2

那么高维内积的形式为:

  x1*y2 + x12*y12 + x2*y2 + x22*y22 + x1*y1*x2*y2

可以看到上面的内积的形式和两个多项式的成绩非常非常像:

  (<x,y> + 1)2 = (x1*y1 + x2*y2 + 1)*(x1*y1 + x2*y2 + 1)

这样也就说明,并不是需要使用“核函数”将原来的样本映射到高纬度的空间中,而是只需要用样本的内积就可以计算出映射之后的内积。在这种映射下,就算是样本是很高的维度产生了组合爆炸,对计算量也没有什么影响。在这个例子中的核函数为:

  kernel(x1, x2) = (<x1, x2> + 1)2

最理想的情况下,我们希望知道数据的具体形状和分布,从而得到一个刚好可以将数据映射成线性可分的核函数(不过这种做法通常是没办法做到的)。常用的核函数如下:

  多项式核:kernel(x1, x2) = (<x1, x2> + R)d

  高斯核:  kernel(x1, x2) = exp(- |x1 - x2|2/(2σ2))

  线性核:  kernel(x1, x2) = <x1, x2>

  sigmoid:  kernel(x1, x2) = tanh(g*u*v + coef 0)

高斯核将原始空间映射到无限维空间,如果σ过大的话,高次特征的权重衰减地非常快,所以实际上相当于一个低维的子空间;而如果σ过小的话,则可将任意地数据映射为线性可分(可能导致非常严重的过拟合问题),也就是说高斯核可以通过调节σ来实现很大的灵活性。

在分类问题中最怕的就是噪声,其实可以大概想一下,噪声就类似于不等式和等式的区别,那么处理方式也就类似了:加入松弛变量ξ,目标函数变为:

  求:min 0.5*|w|2 + C*∑ξi C用于控制目标函数中的两项之间的权重

  s.t.yi*(wTxi + b) ≥ 1 - ξi  

      ξi ≥ 0

这时拉格朗日函数为:

  L(w, b, ξ, r) = 0.5*|w|2 + C*∑ξi - ∑ai*(yi*(wTxi + b) - 1 + ξi) - ∑riξi

分别求偏导数得到:

  ∂L/w  --> w = ∑aiyixi 

  L/b  --> ∑aiyi = 0

  L/ξ --> C - ai - ri = 0

那么得到最终得到的目标约束为:

  求:max ∑ai - 0.5*∑aiajyiyj<xi, yj>

  s.t.0 ≤ ai ≤ C

        ∑aiyi = 0

这就是一个完整的“上得厅堂,下得厨房”的支持向量机的完整的模型了。

------------------------------------------------------

欢迎拍砖。