SMO算法 (Sequential Minimal Optimization)
基本原理: 优化目标函数 Ψ(α⃗ ) 时, 每一次迭代的时候固定其中的大部分乘子 (αi) , 只优化其中两个, 这样优化问题变成求解一个二次型最小值问题, 选择第一个乘子的时候并不是随机选择的, 而是选择违反KKT条件的乘子. 关于推导网上多资料比较多, 下面只给出算法和一些细节.
先给出KKT条件中的互补松驰条件
注意到
1=yiyi
, 把这个式子代入(1)~(3), 移项得KKT条件另一种形式
可以看出当 αi≠0 的时候, Ei 表示 g(x) 对 xi 的预测值与真实值的误差.
现在进入算法, 可能有些简化
取初始值 α⃗ =0⃗ , 这里比较重要, 由KKT条件之互补松驰条件可知, αi=0 所对应的样本点都是在界内的, 在边界上的支持向量只占了很少一部分, 对于分类问题这意味着绝大部分 αi 是等于0的. 这样只需要找出少量的 αi 进行调整即可.
在一定精度 ε 内查找那些违反KKT条件的样本, 综合(4)~(5)就是
αi<CbutyiEi<0−ε
αi>0butyiEi>0+ε其中优先选择 0<αi<C 样本点, 如果这些样本点都满足KKT条件, 则遍历整个样本, 是不是通常第一步都是要遍历样本的.
假设找到了第一个乘子 α1 , 现在选择 α2 , 为了使得 |E1−E2| 比较大, E1 为正, 就取最小的 E2 所对应的 α2 , 若 E1 为负, 就取最大的 E2 所对应的 α2 , 即 max|E1−E2| . 某些神奇的情况下??( Ei 都不知道等于几或者全为0??), 那就先遍历 0<αi<C 的样本点, 不行再遍历全部样本, 再不行重新选 αi .
之后根据无约束求极值的方法可得(相关推导网上书上都有很多, 注意这里的 αold2 是凑出来的)
αnew,unclipped2=αold2+y2(E1−E2)ηη=K11+K22−2K12s.t. η>0然后对 α2 裁剪, 让其满足不等式约束. 先计算边界值:
L=max(0,αold2−αold1),H=min(C,C+αold2−αold1)if y1≠y2L=max(0,αold2+αold1−C),H=min(C,αold2+αold1)if y1=y2之后更新 α2 :
αnew2=⎧⎩⎨⎪⎪⎪⎪Hαnew,unclipped2Lαnew,unclipped2>HL≤αnew,unclipped2≤Hαnew,unclipped2<L
然后更新 α1 :
αnew1=αold1+y1y2(αold2−αnew2)
这里要注意一下 η 恰好是目标函数 Ψ(α2) 的二阶导数, η>0 意味抛物线开口向上, 能取最小值, 这样就用上面的公式算, 如果 η=0 , 目标函数是条直线, η<0 开口向下, 这两种情况最小值都是在边界上取到, 要算一下左边和右边的 Ψ 值, 哪边的小就取哪边的 α1, α2 , 具体参见 Platt的论文.用间隔边界上的样本更新阀值 b :
bnew1=−E1−y1K11(αnew1−αold1)−y2K21(αnew2−α2old)+bold bnew2=−E2−y1K12(αnew1−αold1)−y2K22(αnew2−α2old)+bold如果 αi(i=1,2) 有一个在界内 (0<αi<C) , 则 bnew=bnewi , 否则取 bnew=(bnew1+bnew2)/2 (实际上这里取 bnew1 和 bnew2 之间的数都行).
更新下 Ei 值:
Ei=∑SyiαiK(x⃗ i,x⃗ j)+bnew−yiS 是支持向量的集合, 就是那些
0<αi≤C 所对应的样本点.若所有样本满足KKT条件, 则停止迭代