zoukankan      html  css  js  c++  java
  • SVM-非线性支持向量机及SMO算法

    SVM-非线性支持向量机及SMO算法

    如果您想体验更好的阅读:请戳这里littlefish.top

    线性不可分情况

    线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,为了满足函数间隔大于1的约束条件,可以对每个样本$(x_i, y_i)$引进一个松弛变量$xi_i ge 0$,使函数间隔加上松弛变量大于等于1,,

    $$y_i (w cdot x_i + b) ge 1 - xi_i$$

    目标函数变为

    $$frac 1 2 {||w||^2} + C sum_{j=1}^N xi_i$$

    其中,C>0称为惩罚参数,值越大对误分类的惩罚越大,值越小对误分类的惩罚越小。

    因此,最小化目标函数也就是使$frac 1 2 {||w||^2}$尽量小(间隔尽量大),同时使误分类点的个数尽量小。

    线性不可分的线性支持向量机的学习问题变成如下凸二次规划问题:

    $$ min_{w,b,xi}frac 1 2 {||w||}^2 + C sum_{i=1}^N xi_i
    s.t. quad y_i(w cdot x_i + b) ge 1 - xi_i, quad i=1,2,...,N, xi_i ge 0, i=1,2,...,N$$

    线性支持向量学习算法

    • 选择惩罚参数C>0,构造并求解凸二次规划问题

    $$ min_alpha frac 1 2 sum_{i=1}^N sum_{j=1}^N alpha_i alpha_j y_i y_j (x_i cdot x_j) - sum_{i=1}^N alpha_i
    s.t. quad sum_{i=1}^N alpha_i y_i = 0
    0 le alpha_i le C, i=1,2,...,N$$

    求得最优解$alpha*=(alpha_1*, alpha_2^*, ... , alpha_N*)T$

    • 计算$w*=sum_{i=1}N alpha_i^* y_i x_i$

    选择$alpha*$的一个分量$alpha_j*$适合条件$0<alpha_j^*<C$,计算

    $$b^*=y_i - sum_{i=1}^N y_i alpha_i^*(x_i cdot x_j)$$

    • 求得分离超平面

    $$w^* cdot x + b^* = 0$$

    分类决策函数:

    $$f(x) = sign(w^* cdot x + b^*)$$

    核函数

    用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原空间的数据映射到新空间;然后在新空间里用线性分类学习方法从训练数据中学习分类模型。

    核函数的空间转换

    核技巧应用在支持向量机的基本思想:通过一个非线性变换将输入空间(欧式空间$Rn$或离散集合)对应于一个特征空间(希尔伯特空间H),使得在输入空间$Rn$中的超曲面模型对应于特征空间H中的超平面模型(支持向量机)。

    非线性支持向量分类机

    非线性支持向量机

    从非线性分类训练集,通过核函数与间隔最大化或凸二次规划,学习得到的分类决策函数:

    $$f(x)=sign(sum_{i=1}^N alpha_i^*y_i K(x,x_i) + b^*)$$

    称为非线性支持向量,$K(x,z)$是正定核函数。

    学习算法

    • 选择适当的核函数$K(x,z)$和适当的参数C,构造并求解最优化问题

    $$min_alpha frac 1 2 sum_{i=1}^N sum_{j=1}^N alpha_i alpha_j y_i y_j K(x_i, x_j) - sum_{i=1}^N alpha_i
    s.t. quad sum_{i=1}^N alpha_i y_i = 0, 0<alpha_i<C,i=1,2,...,N$$

    求解最优解$alpha*=(alpha_1*, alpha_2*,...,alpha_N*)$

    • 选择$alpha*$的第一个正分量$0<alpha_j*<C$,计算

    $$b^*=y_i - sum_{i=1}^N alpha_i^* y_i K(x_i cdot x_j)$$

    • 构造决策函数

    $$f(x)=sign(sum_{i=1}^N alpha_i^* y_i K(x cdot x_i) + b^*)$$

    序列最小优化算法

    SMO算法是一种启发式算法。如果所有变量都满足KKT条件,那么这个最优化问题就解决了(KKT问题是该最优化问题的充要条件),否则,选择两个变量,固定其他变量,针对这两个变量构造二次规划问题。该方法会使原始二次规划问题的目标函数变小,不断分解自问题并对子问题求解进而达到求解原问题的目的。

    由于

    $$sum_{i=1}^N alpha_i y_i = 0$$

    所以

    $$alpha_i = - frac 1 {y_i} sum_{i=2}^N alpha_i y_i$$

    两个变量的二次规划求解

    假设选择两个变量$alpha_1,alpha_2$,

    $$min_{alpha_1alpha_2} quad = frac 1 2 K_{11} alpha_1^2 + frac 1 2 K_{22} alpha_2^2 + y_1 y_2 K_{12} alpha_1 alpha_2
    quad (alpha_1 + alpha_2) + y_1 alpha_1 sum_{i=3}^N y_i alpha_i K_{i1} + y_2alpha_2sum_{i=3}^N y_i alpha_i K_{12}
    s.t. quad alpha_1 y_1 + alpha_2 y_2 = - sum_{i=3}^N y_i alpha_i = xi
    0 le alpha_i le C, i=1,2$$

    由于只有两个变量$(alpha_i,alpha_j)$,因此根据两变量的符号情况约束条件可用二位空间中的图表示(参考$alpha_1 y_1 + alpha_2 y_2 = xi(常数)$),

    二变量优化问题

    L和H是$alpha$取值的最小和最大值,如果$y_i != y_j$,则

    $$L=max(0,alpha_2 - alpha_1), H=min(C,C+alpha_2-alpha_1)$$

    如果$y_i = y_j$,则

    $$L=max(0,alpha_2 + alpha_1 + C), H=min(C,alpha_2+alpha_1)$$

    $$g(x) = sum_{i=1}^N alpha_i y_i K(x_i, x) + b$$

    得到误差值:

    $$E_i = g(x_i) - y_i = ( sum_{i=1}^N alpha_i y_i K(x_i, x) + b) - y_i$, quad i = 1,2$$

    此最优问题的解是:

    $$alpha_2^{new} = alpha_2^{old} + y_2 frac {(E_1 - E_2)} eta$$

    其中,

    $$eta = K_{11} + K_{22} - 2K_{12} = {||phi(x_1) - phi(x_2)||}^2$$

    $phi(x)$为输入空间到特征空间的映射,经过剪辑后是

    $$f(n)=egin{cases}
    H,quad alpha_2^{new} > H
    alpha_2^{new}, quad L le alpha_2^{new} le H
    L,quad alpha_2^{new} < L end{cases}$$

    则$alpha_1^{new}$为

    $$alpha_1^{new} = alpha_1^{old} + y_1 y_2 (alpha_2^{old} - alpha_2^{new})$$

    变量的选择方法

    SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的。

    1.第1个变量的选择

    SMO算法在外层循环中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量,KKT条件如下

    $$alpha_i = 0 <=> y_i g(x_i) ge 1
    0 < alpha_i < C <=> y_i g(x_i)=1
    alpha_i = C <=> y_i g(x_i) le 1$$

    其中,$g(x_i) = sum_{j=1}^N alpha_j y_j K(x_i,x_j)+b$。

    该检验在$epsilon$范围内进行的,在校验过程中,外层循环首先遍历所有满足条件$0<alpha_i<C$的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。

    2.第2个变量的选择

    SMO算法在内层循环,假设在外层循环中已经找到第一个变量$alpha_1$,现在要在内层循环中找到第2个变量$alpha_2$,第2个变量选择的标准是希望能使$alpha_2$有足够的变化。根据上一节可知,$alpha_2^{new}$是依赖$|E_1 - E_2|$的,为了加快计算速度,最简单的做法是选择$|E_1 - E_2|$最大的(如果$E_1$为负值,则选择最大的$E_i$作为$E_2$,否则选择最小的$E_i$为$E_2$,需要保存所有的$E_i$)。

    3.计算阈值b和差值$E_i$

    在每次完成两个变量优化后,都要重新计算阈值b。

    由KKT条件得

    $$sum_{i=1}^N alpha_i y_i K_{i1} + b = y_i$$

    从而

    $$b_1^{new} = y_1 - sum_{i=3}^N alpha_i y_i K_{i1} - alpha_1^{new} y_1 K_{11} - alpha_2^{new} y_2 K_{21}$$

    由于$E_i = g(x_i) - y_i = ( sum_{i=1}^N alpha_i y_i K(x_i, x) + b) - y_i$, quad i = 1,2$,则

    $$E_1 = g(x_1) - y_1 = sum_{i=3}^N alpha_i y_i K_{i1} + alpha_1^{old} y_1 K_{11} + alpha_2^{old} y_2 K_{21} + b^{old} - y_1$$

    将上式中的$y_i - sum_{i=3}^N alpha_i y_i K_{i1} $代入$b_1^{new}$的公式中,得到

    $$b_1^{new} = -E_1 - y_1 K_{11} (alpha_1^{new} - alpha_1^{old} ) - y_2 K_{21} (alpha_2^{new} - alpha_2^{old} ) + b^old$$

    对于b的取值:

    $$b{new}=egin{cases}b_1{new}=b_2^{new}, quad 0 < alpha_i^{new} < C, i =1,2
    frac {b_1^{new} + b_2^{new}} 2,quad alpha_i^{new} == 0 or C,满足KKT条件end{cases}$$

  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/coder2012/p/4589963.html
Copyright © 2011-2022 走看看