zoukankan      html  css  js  c++  java
  • SMO(Sequential Minimal Optimization) 伪代码(注释)

    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$


    去吧,去吧,到彼岸去吧,彼岸是光明的世界!
  • 相关阅读:
    [转] css3变形属性transform
    [转] ReactJS之JSX语法
    [转] 那些在使用webpack时踩过的坑
    [转] jQuery的deferred对象详解
    [转] Webpack-CommonsChunkPlugin
    [转] 用webpack的CommonsChunkPlugin提取公共代码的3种方式
    Refs & DOM
    [转] Webpack的devtool和source maps
    [转] 编译输出文件的区别
    GDB && QString
  • 原文地址:https://www.cnblogs.com/lengyue365/p/5043592.html
Copyright © 2011-2022 走看看