SVM 支持向量机(3) SMO算法小结

来源:互联网 发布:二级备案域名 编辑:程序博客网 时间:2024/06/05 03:42

SMO算法 (Sequential Minimal Optimization)

基本原理: 优化目标函数Ψ(α⃗ )时, 每一次迭代的时候固定其中的大部分乘子(αi), 只优化其中两个, 这样优化问题变成求解一个二次型最小值问题, 选择第一个乘子的时候并不是随机选择的, 而是选择违反KKT条件的乘子. 关于推导网上多资料比较多, 下面只给出算法和一些细节.

先给出KKT条件中的互补松驰条件

αi=0yig(x⃗ i)1(1)

0<αi<Cyig(x⃗ i)=1(2)

αi=Cyig(x⃗ i)1(yig(x⃗ i)=1ξi)(3)

g(x⃗ )=jαjK(x⃗ j,x⃗ )+b

注意到1=yiyi, 把这个式子代入(1)~(3), 移项得KKT条件另一种形式

αi=0yiEi0(4)

0<αi<CyiEi=0(5)

αi=CyiEi0(6)

Ei=g(x⃗ i)yi

可以看出当αi0的时候, Ei表示g(x)xi的预测值与真实值的误差.

现在进入算法, 可能有些简化

  1. 取初始值α⃗ =0⃗ , 这里比较重要, 由KKT条件之互补松驰条件可知, αi=0所对应的样本点都是在界内的, 在边界上的支持向量只占了很少一部分, 对于分类问题这意味着绝大部分αi是等于0的. 这样只需要找出少量的αi进行调整即可.

  2. 在一定精度ε内查找那些违反KKT条件的样本, 综合(4)~(5)就是

    αi<CbutyiEi<0ε

    αi>0butyiEi>0+ε

    其中优先选择0<αi<C样本点, 如果这些样本点都满足KKT条件, 则遍历整个样本, 是不是通常第一步都是要遍历样本的.

  3. 假设找到了第一个乘子α1, 现在选择α2, 为了使得|E1E2|比较大, E1为正, 就取最小的E2所对应的α2, 若E1为负, 就取最大的E2所对应的α2, 即max|E1E2|. 某些神奇的情况下??(Ei都不知道等于几或者全为0??), 那就先遍历0<αi<C的样本点, 不行再遍历全部样本, 再不行重新选αi.

    之后根据无约束求极值的方法可得(相关推导网上书上都有很多, 注意这里的αold2是凑出来的)

    αnew,unclipped2=αold2+y2(E1E2)η

    η=K11+K222K12s.t. η>0

    然后对α2裁剪, 让其满足不等式约束. 先计算边界值:

    L=max(0,αold2αold1),H=min(C,C+αold2αold1)if  y1y2

    L=max(0,αold2+αold1C),H=min(C,αold2+αold1)if  y1=y2

    之后更新α2:

    αnew2=Hαnew,unclipped2Lαnew,unclipped2>HLαnew,unclipped2Hαnew,unclipped2<L

    然后更新α1:
    αnew1=αold1+y1y2(αold2αnew2)

    这里要注意一下η恰好是目标函数Ψ(α2)的二阶导数, η>0意味抛物线开口向上, 能取最小值, 这样就用上面的公式算, 如果η=0, 目标函数是条直线, η<0开口向下, 这两种情况最小值都是在边界上取到, 要算一下左边和右边的Ψ值, 哪边的小就取哪边的α1, α2, 具体参见 Platt的论文.

  4. 用间隔边界上的样本更新阀值b:

    bnew1=E1y1K11(αnew1αold1)y2K21(αnew2α2old)+bold

    bnew2=E2y1K12(αnew1αold1)y2K22(αnew2α2old)+bold

    如果αi(i=1,2)有一个在界内(0<αi<C), 则bnew=bnewi, 否则取bnew=(bnew1+bnew2)/2(实际上这里取bnew1bnew2之间的数都行).

  5. 更新下Ei值:

    Ei=SyiαiK(x⃗ i,x⃗ j)+bnewyi

    S是支持向量的集合, 就是那些0<αiC所对应的样本点.

  6. 若所有样本满足KKT条件, 则停止迭代

0 0
原创粉丝点击