zoukankan      html  css  js  c++  java
  • SVM

    SVM是一种用于二分类问题的监督学习算法,由Vapnik等人在1995年提出。

    线性可分

    我们的基本问题是:在线性可分的情况下,用哪条直线来区分正负样本效果最好呢?
    在这里插入图片描述
    SVM的思想是找到一条有着maximum margin的超平面,MIT的课里叫做widest street approach:
    在这里插入图片描述
    一个超平面由法向量(vec w)和截距(-b)唯一确定:(a(x-x_1)+b(y-y_1)+c(z-z_1)+...=0),即(w^Tx+b=0)
    接下来的问题就是求解分类超平面方程以及决策函数,不妨规定(vec w)指向的一侧为正类,在正类的支持向量上有(w^Tx+b=1),在负类的支持向量上有(w^Tx+b=-1),对于正负样本:

    [wcdot x_++bgeq 1 \ wcdot x_-+bleq -1 ]

    为了统一表示上面2种情况,引入(y_i=egin{cases} 1,& ext{+sample}\ -1,& ext{-sample} end{cases}),所有样本统一表示为:

    [y_i(wcdot x_i+b)-1geq 0 ]

    如果能确定(b)(w),那么分类超平面和决策函数也就随即确定。
    确定(b)(w)是一个优化问题,即要使得street宽度最大。根据平行平面的距离公式:

    [width=frac{(b+1)-(b-1)}{||w||}=frac{2}{||w||} ag{1} ]

    综上,原优化问题为:

    [egin{array}{ll} min _{w, b} & frac{1}{2}|w|^{2} \ ext { s.t. } & y_{i}left(w cdot x_{i}+b ight)-1 geqslant 0, quad i=1,2, cdots, N end{array} ]

    求解Quadratic Optimization Problem,构造Lagrange Multiplier:

    [L(w,b,alpha)=frac{||w||^2}{2}-sum_{i=1}^{N}alpha_i[y_i(wcdot x_i+b)-1] ]

    根据拉格朗日对偶性,原优化问题与下述问题等价:

    [max _{alpha} min _{w, b} L(w, b, alpha) ]

    先求最小,再求最大:
    分别对(vec{w})(b)求偏导并令其为0:

    [frac{partial L}{partialvec{w}}=vec{w}-Sigmaalpha_iy_ix_i=0, vec{w}=Sigmaalpha_iy_ix_i \ frac{partial L}{partial b}=Sigmaalpha_iy_i=0, Sigmaalpha_iy_i=0]

    与神经网络不同,这里的优化问题是凸二次优化(目标二次,约束线性),意味着不会卡在局部最大,一定可以找到全局最优解。
    决策向量(vec{w})样本的线性和,将(vec{w})代入(L),看看我们的极值会变成什么:

    [L=Sigmaalpha_i-frac{1}{2}Sigma_iSigma_jalpha_ialpha_jy_iy_jx_icdot x_j ag{2} ]

    于是得到原优化问题的对偶问题

    [egin{array}{ll} min _{alpha} & frac{1}{2} sum_{i=1}^{N} sum_{j=1}^{N} alpha_{i} alpha_{j} y_{i} y_{j}left(x_{i} cdot x_{j} ight)-sum_{i=1}^{N} alpha_{i} \ ext { s.t. } & sum_{i=1}^{N} alpha_{i} y_{i}=0 \ & alpha_{i} geqslant 0, quad i=1,2, cdots, N end{array} ]

    利用SMO等算法可以求得最优的(alpha^*),进而求得(w^{*}=sum_{i=1}^{N} alpha_{i}^{*} y_{i} x_{i}),再利用KKT条件求得(b^{*}=y_{j}-sum_{i=1}^{N} alpha_{i}^{*} y_{i}left(x_{i} cdot x_{j} ight))
    最终的超平面为:(w^{*}cdot x+b^{*}=0),分类决策函数为:(f(x)=sign(w^{*}cdot x+b^{*}))

    Soft Margin

    上面讨论了完全线性可分的情况,然而在现实情况中,训练数据会有一些outliers,除去这些点后数据是线性可分的。
    为了处理这种情况,对每个样本点引入松弛因子(xi_{i} geqslant 0),即样本点的函数间隔只需要大于(1-xi_{i}),放松了限制条件,原优化问题变为:

    [egin{array}{ll} min _{w, b, xi} & frac{1}{2}|w|^{2}+C sum_{i=1}^{N} xi_{i} \ ext { s.t. } & y_{i}left(w cdot x_{i}+b ight) geqslant 1-xi_{i}, quad i=1,2, cdots, N \ & xi_{i} geqslant 0, quad i=1,2, cdots, N end{array} ]

    其对偶问题是:

    [egin{array}{ll} min _{alpha} & frac{1}{2} sum_{i=1}^{N} sum_{j=1}^{N} alpha_{i} alpha_{j} y_{i} y_{j}left(x_{i} cdot x_{j} ight)-sum_{i=1}^{N} alpha_{i} \ ext { s.t. } & sum_{i=1}^{N} alpha_{i} y_{i}=0 \ & 0 leqslant alpha_{i} leqslant C, quad i=1,2, cdots, N end{array} ]

    类似地,可以求得:

    [w^{*}=sum_{i=1}^{N} alpha_{i}^{*} y_{i} x_{i} \ b^{*}=y_{j}-sum_{i=1}^{N} alpha_{i}^{*} y_{i}left(x_{i} cdot x_{j} ight) ]

    Kernel Trick

    上面讨论了线性分类问题,对于非线性可分问题,SVM的思想是做一个变换(phi(vec{x})),将样本映射到另外一个空间,也许就线性可分了。
    由于目标函数和决策函数只依赖于样本对之间的点积,所以无需显式定义变换(phi(vec{x})),只要定义一个函数(K(vec{x_i},vec{x_j})=phi(vec{x_i})cdotphi(vec{x_j}))提供新空间的样本点的点积即可,(K)叫做Kernel Function
    此时原优化问题为:

    [egin{array}{ll} min _{w, b, xi} & frac{1}{2}|w|^{2}+C sum_{i=1}^{N} xi_{i} \ ext { s.t. } & y_{i}left(w^T phi(x_{i})+b ight) geqslant 1-xi_{i}, quad i=1,2, cdots, N \ & xi_{i} geqslant 0, quad i=1,2, cdots, N end{array} ]

    对偶问题为:

    [egin{array}{ll} min _{alpha} & frac{1}{2} sum_{i=1}^{N} sum_{j=1}^{N} alpha_{i} alpha_{j} y_{i} y_{j}left(K(x_{i},x_{j}) ight)-sum_{i=1}^{N} alpha_{i} \ ext { s.t. } & sum_{i=1}^{N} alpha_{i} y_{i}=0 \ & 0 leqslant alpha_{i} leqslant C, quad i=1,2, cdots, N end{array} ]

    一种常用的kernel是线性的:((vec{u}cdotvec{v}+1)^n),当前空间的(u)(v)通过简单的点积映射到了另一个空间;
    另一种kernel是高斯核:(e^{-frac{||x_i-x_j||^2}{sigma}}=e^{-gamma{||x_i-x_j||}^2})
    高斯核对应高斯径向基函数分类器,这里有2个参数(C)(gamma)需要调节:惩罚系数(C)表示分类器对于误差的宽容度,(C)越大表示越不能容忍误差,容易过拟合,按照经验可以在([10^{-4},10^4])间调节;(gamma)控制径向作用范围,(gamma)越大,径向作用范围越小,有可能将每个样本点单独形成一个分类,容易过拟合,(gamma)过小,径向范围过大,容易将2个样本映射为同一个点,无法区分,一般(gamma=frac{1}{样本特征数})。另外,这2个参数可以通过交叉验证和grid-search来调整。

    扩展

    SVM处理多分类问题的方式主要有2种:

    • one-against-one
      在每2个类之间都构造一个binary SVM,共有(C_m^2)个SVM,对新数据采用Voting的方式进行分类。
    • one-against-the-rest
      对每个类,将其作为正类,其余(m-1)个类作为负类,共(m)个SVM,对新数据采用winner-takes-all策略。

    如果样本不均衡,目标函数中的惩罚项主要由多数类构成,超平面偏向少数类,甚至将所有样本都分在同一侧。
    此时目标变为了在不严重损失多数类精度的情况下,在少数类上获得尽可能高的分类正确率。一般来讲有2种做法:

    • 数据合成
      对少数类样本进行分析并根据其特点人工插值合成新样本添加到数据集中,构成均衡数据集。比较常用的方法是SMOTE(Synthetic Minority Oversampling Technique)。
    • 加权SVM
      将少数类分错的代价很大,所以在惩罚项中对两个类设置不同的惩罚系数,少数类的系数设置更大,甚至可以对每个样本都设置不同的惩罚系数,此时原优化问题变为:

    [egin{array}{ll} min _{w, b, xi} & frac{1}{2}|w|^{2}+C^+ sum_{y_i=1} xi_{i}+C^-sum_{y_i=-1} xi_{i} \ ext { s.t. } & y_{i}left(w^T phi(x_{i})+b ight) geqslant 1-xi_{i}, quad i=1,2, cdots, N \ & xi_{i} geqslant 0, quad i=1,2, cdots, N end{array} ]

    对偶问题:

    [egin{array}{ll} min _{alpha} & frac{1}{2} sum_{i=1}^{N} sum_{j=1}^{N} alpha_{i} alpha_{j} y_{i} y_{j}left(K(x_{i},x_{j}) ight)-sum_{i=1}^{N} alpha_{i} \ ext { s.t. } & sum_{i=1}^{N} alpha_{i} y_{i}=0 \ & 0 leqslant alpha_{i} leqslant C^+, y_i=+1 \ & 0 leqslant alpha_{i} leqslant C^-, y_i=-1 end{array} ]

  • 相关阅读:
    编程之美---求数组中最长递增子序列
    编程之美----子数组的最大乘积
    编程之美----寻找数组中的最大值和最小值
    编程之美---找符合条件的整数
    编程之美----最大公约数问题
    编程之美----1的数目
    编程之美----寻找发帖“水王”
    C语言 |= &= 位运算
    整型数类型定义
    extern使用方法总结!(转)
  • 原文地址:https://www.cnblogs.com/EIMadrigal/p/13913864.html
Copyright © 2011-2022 走看看