您的位置:首页 > 产品设计 > UI/UE

SMO(Sequential Minimal Optimization) 伪代码(注释)

2015-12-13 21:15 387 查看

Algorithm: Simplified SMO

这个版本是简化版的,并没有采用启发式选择,但是比较容易理解。

输入:

C: 调和系数

tol: 容差 (tolerance)

max passes: $\alpha$ 不改变时的最大迭代次数

$(x^{(1)}, y^{(1)}), . . . , (x^{(m)}, y^{(m)})$: 训练样本

输出:

$\alpha\in\mathbf{R}^m$: 所要求解的 Lagrange 乘子, $\alpha=(\alpha_1,\alpha_2,...,\alpha_m)$

$b\in\mathbf{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)}$, 公式为:$$ \begin{align*} f(x^{(i)}) &=\sum_{k=1}^{m}\alpha_k y^{(k)}\langle x^{(k)},x^{(i)} \rangle \\ E_i &= \sum_{k=1}^{m}\alpha_k y^{(k)}\langle x^{(k)},x^{(i)} \rangle-y^{(i)} \end{align*}$$

    ◦ $if$ $((y^{(i)}E_i < −tol$ && $\alpha_i < C)$ || $(y^{(i)}E_i > tol$ && $\alpha_i > 0))$

      ◦ 随机选择 $j \ne i$

      ◦ 计算 $E_j = f(x^{(j)}) − y^{(j)}$, 公式为:$$ \begin{align*} f(x^{(j)}) &=\sum_{k=1}^{m}\alpha_k y^{(k)}\langle x^{(k)},x^{(j)} \rangle \\ E_j &= \sum_{k=1}^{m}\alpha_k y^{(k)}\langle x^{(k)},x^{(j)} \rangle-y^{(j)} \end{align*}$$

      ◦ 保存旧 $\alpha$: $$\begin{align*}\alpha_i^{(old)} &= \alpha_i \\ \alpha_j^{(old)} &=\alpha_j\end{align*}$$

      ◦ 计算下限与上限: $L, H$, 公式为:$$\begin{cases} L=max(0,\alpha_j-\alpha_i),\; H=min(C, C+\alpha_j - \alpha_i) &if \;\; y^{(i)} \ne 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=2\langle x^{(i)},x^{(j)} \rangle - \langle x^{(i)},x^{(i)} \rangle - \langle x^{(j)},x^{(j)} \rangle$$

      ◦ $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)} := \begin{cases}H &if \;\; \alpha_j^{(new,unc)}\gt H \cr \alpha_j &if \;\; L\le\alpha_j^{(new,unc)}\le H \cr L &if \;\; \alpha_j^{(new,unc)}\lt L\end{cases}$$

      ◦ $if$ $(\left|\alpha_j^{(new)} − \alpha_j^{(old)} \right| \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)} \rangle - y^{(j)}(\alpha_j^{(new)} - \alpha_j^{(old)})\langle x^{(i)},x^{(j)} \rangle $

        $ b_2^{(new)} :=b^{(old)} - E_j - y^{(i)}(\alpha_i^{(new)} - \alpha_i^{(old)})\langle x^{(i)},x^{(j)} \rangle - y^{(j)}(\alpha_j^{(new)} - \alpha_j^{(old)})\langle x^{(j)},x^{(j)} \rangle $

      ◦ 计算 b,公式为:$$ b := \begin{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$
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: