Algorithm: Simplified SMO
这个版本是简化版的,并没有采用启发式选择,但是比较容易理解。
输入:
C: 调和系数
tol: 容差 (tolerance)
max passes: $alpha$ 不改变时的最大迭代次数
$(x^{(1)}, y^{(1)}), . . . , (x^{(m)}, y^{(m)})$: 训练样本
输出:
$alphainmathbf{R}^m$: 所要求解的 Lagrange 乘子, $alpha=(alpha_1,alpha_2,...,alpha_m)$
$binmathbf{R}$ : 阈值 b
采用的数学符号标准为:
1、上标表示序数(例如 $(x^{(m)},y^{(m)})$ 表示输入的第m个样本点与类别)
2、下标表示向量的分量或者维度(例如 $w_i$ 表示 w 的第 i 个分量)
伪代码中的变量说明:
num_changed_alphas: 改变的 $alpha$ 分量的数目
m: 训练样本的数目
$varepsilon$: 指定的精度
下面是伪代码($alpha$ 初始值都为0,b 初始值也为0)
◦ 初始化 $alpha_i = 0, i=1 ldots m, b = 0$
◦ 初始化 passes = 0, max_passes=20
◦ 初始化 $varepsilon = 10^{-5}$
◦ $while$ (passes < max_passes)
◦ num_changed_alphas = 0
◦ $for$ $i = 1 ldots m$,
◦ 计算 $E_i = f(x^{(i)}) − y^{(i)}$, 公式为:$$ egin{align*} f(x^{(i)}) &=sum_{k=1}^{m}alpha_k y^{(k)}langle x^{(k)},x^{(i)} angle \ E_i &= sum_{k=1}^{m}alpha_k y^{(k)}langle x^{(k)},x^{(i)} angle-y^{(i)} end{align*}$$
◦ $if$ $((y^{(i)}E_i < −tol$ && $alpha_i < C)$ || $(y^{(i)}E_i > tol$ && $alpha_i > 0))$
◦ 随机选择 $j e i$
◦ 计算 $E_j = f(x^{(j)}) − y^{(j)}$, 公式为:$$ egin{align*} f(x^{(j)}) &=sum_{k=1}^{m}alpha_k y^{(k)}langle x^{(k)},x^{(j)} angle \ E_j &= sum_{k=1}^{m}alpha_k y^{(k)}langle x^{(k)},x^{(j)} angle-y^{(j)} end{align*}$$
◦ 保存旧 $alpha$: $$egin{align*}alpha_i^{(old)} &= alpha_i \ alpha_j^{(old)} &=alpha_jend{align*}$$
◦ 计算下限与上限: $L, H$, 公式为:$$egin{cases} L=max(0,alpha_j-alpha_i),; H=min(C, C+alpha_j - alpha_i) &if ;; y^{(i)} e y^{(j)} cr L=max(0,alpha_j+alpha_i-C),; H=min(C, alpha_j + alpha_i) &if ;; y^{(i)} = y^{(j)} end{cases}$$
◦ $if ; (L == H)$
$continue$
◦ 计算 $eta$, 公式为: $$eta=2langle x^{(i)},x^{(j)} angle - langle x^{(i)},x^{(i)} angle - langle x^{(j)},x^{(j)} angle$$
◦ $if$ $(eta ge 0)$
$continue$
◦ 计算新的 $alpha_j$, 公式为: $$alpha_j^{(new,unc)} := alpha_j - frac{y^{(j)}(E_i - E_j)}{eta}$$
◦ 剪辑新的 $alpha_j$, 公式为:$$alpha_j^{(new)} := egin{cases}H &if ;; alpha_j^{(new,unc)}gt H cr alpha_j &if ;; Llealpha_j^{(new,unc)}le H cr L &if ;; alpha_j^{(new,unc)}lt Lend{cases}$$
◦ $if$ $(left|alpha_j^{(new)} − alpha_j^{(old)} ight| lt varepsilon)$
$continue$
◦ 计算 $alpha_i^{(new)}$, 公式为:$$alpha_i^{(new)} := alpha_i^{(old)}+y^{(i)}y^{(j)}(alpha_j^{(old)}-alpha_j^{(new)})$$
◦ 分别计算 $b_1$ 和 $b_2$,公式为:
$ b_1^{(new)} :=b^{(old)} - E_i - y^{(i)}(alpha_i^{(new)} - alpha_i^{(old)})langle x^{(i)},x^{(i)} angle - y^{(j)}(alpha_j^{(new)} - alpha_j^{(old)})langle x^{(i)},x^{(j)} angle $
$ b_2^{(new)} :=b^{(old)} - E_j - y^{(i)}(alpha_i^{(new)} - alpha_i^{(old)})langle x^{(i)},x^{(j)} angle - y^{(j)}(alpha_j^{(new)} - alpha_j^{(old)})langle x^{(j)},x^{(j)} angle $
◦ 计算 b,公式为:$$ b := egin{cases} b_1 &if ;; 0 lt alpha_i^{(new)} lt C cr b_2 &if ;;0 lt alpha_j^{(new)} lt C cr frac{b_1+b_2}{2} &otherwise end{cases} $$
◦ num_changed_alphas := num_changed_alphas + 1
◦ $end$ $if$
◦ $end$ $for$
◦ $if$ (num changed alphas == 0) //此时 $alpha$ 的每一个分量都不发生变化了,然后看外层循环(第一个变量)发生变化后的状况
passes := passes + 1
◦ $else$
passes := 0
◦ $end$ $if$
◦ $end ; while$