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$


    去吧,去吧,到彼岸去吧,彼岸是光明的世界!
  • 相关阅读:
    Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)上
    异步FIFO结构及FPGA设计 跨时钟域设计
    FPGA管脚分配需要考虑的因素
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 上篇)
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 下篇)
    中国通信简史 (下)
    谈谈德国大学的电子专业
    中国通信简史 (上)
    Verilog学习笔记
    Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) 下
  • 原文地址:https://www.cnblogs.com/lengyue365/p/5043592.html
Copyright © 2011-2022 走看看