• svm算法介绍


    在一个理想的分类当中,我们想要用一个超平面来将正类样本和负类样本划分开来。这个超平面的方程为 $mathbf{w}^Tmathbf{x}+b=0$ 我们希望这个超平面能够使得划分更加的鲁棒,在图形上表现为超平面正好位于正类样本和负类样本的正中间,运用这种思想,我们引入了svm算法。

    为什么正分类大于等于1而不是0

    对于超平面$mathbf{w}^Tmathbf{x}+b=0$,

    分类为正的样本在平面的一侧,满足$mathbf{w}^Tmathbf{x}_i+b  > 0 , y_i = +1$

    分类为负的样本在平面的另一侧,满足为$mathbf{w}^Tmathbf{x}_i+b  < 0 , y_i = -1$

    我们总是能够找出一个正数t,无论t是0.001,还是1000或者其它的数字, 使得

    分类为正的样本为$mathbf{w}^Tmathbf{x}_i+b  geq t , y_i = +1$

    分类为负的样本为$mathbf{w}^Tmathbf{x}_i+b  leq -t , y_i = -1$

    然后我们将式子两边同时除以t,也就是通过缩放变换

    分类为正的样本为$mathbf{w’}^Tmathbf{x}_i+b’  geq 1, y_i = +1$

    分类为负的样本为$mathbf{w’}^Tmathbf{x}_i+b’  leq -1 , y_i = -1$

    而对于超平面$mathbf{w}^Tmathbf{x}+b=0$, 和$mathbf{w’}^Tmathbf{x}+b’=0$,两者表示的是一个平面。

    上面的这些说明解释了一个问题:我们明明知道分类为正的样本是大于等于0,分类为负的样本小于等于0,但是很多推导当中写成了大于等于+1,小于等于-1。 原因是经过了缩放处理。

    经过缩放处理以后,我们下面的式子为了方便依然用符号$mathbf{w} 和 b 而不是 mathbf{w’}、b’$。

    假如我们把这个问题再深入思考一点,有两个平面 x+y+z-3=0 和 2x+2y+2z-6=0 表示的是同一个平面,但是代入同一个数字以后,如(2,2,2),得到的结果是不一样的,一个是3,一个是6. 如果按照这样算的话的确是不一样的,但是出现这个的原因是我们的坐标系缩放比例不一样了,前面那个3假如需要和2比较的话能够划分为正类,那么后面的6就需要和4进行比较能够划分为正类。

    而我们上面的缩放处理以后,就是把所有得到的结果和1进行比较,并且两个最近的异类点距离超平面的距离之和为$frac{2}{Vertmathbf{w}Vert}$,我们的目标函数就是使得这个值最大。 经过一些列处理,我们得到了支持向量最初的优化式子

        $min limits_{mathbf{w}, b} frac{1}{2}{Vert mathbf{w} Vert}^2 $

        $s.t.    y_i(mathbf{w}^Tmathbf{x}_i+b)  geq 1, i=1,2,…,m $

    使用对偶方法和SMO方法进行优化求解

    再求解上述的问题的时候,我们要用到一些优化的知识。首先是利用拉格朗日乘子法求它的对偶问题(注:下面不加下标的$alpha$均为矢量)

    $L(mathbf{w},b, {alpha}) = frac{1}{2} {Vert mathbf{w} Vert}^2 + sum limits_{i=1}^{m}alpha_i (1-y_i(mathbf{w}^T mathbf{x}_i +b))$

    用$L(mathbf{w},b, mathbf{alpha}) $ 对 $mathbf{w} 和 b$求偏导,并且为0可以得到:

    $mathbf{w} = sumlimits_{i=1}^{m} alpha_i y_i mathbf{x}_i$

    $0 = sum limits_{i=1}^{m}alpha_i y_i$

    将上面两个式子带入拉格朗日函数,

    求出对偶问题的如下:

    $max limits_alpha sumlimits_{i=0}^{m} alpha _i  - frac{1}{2}sumlimits_{i=1}^msumlimits_{j=1}^malpha_i alpha_j y_i y_j mathbf{x}_i^T mathbf{x}_j $

    $s.t. sum limits_{i=1}^{m}alpha_i y_i = 0$

         $alpha_i geq 0 , i=1,2,3,…,m$

    若求得$alpha$ 以后,能够求得$mathbf{w}和b$,带入可以得到如下结果:

    $f(x)=mathbf{w}^T mathbf{x} +b$

           $=sum limits_{i=1}^{m}alpha_i y_i mathbf{x}_i^T x +b$

    下面是用序列最小优化算法(Sequential minimal optimization, SMO) 来求解其中的$alpha$

    SMO的思想是这样的,固定$alpha_i$之外的其他参数,优化出$alpha_i$的值,由于固定除$alpha_i$以外的其它变量的时候,根据公式$sum limits_{i=1}^{m}alpha_i y_i = 0$ 可以唯一确定$alpha_i$ ,所以我们一次选择两个参数$alpha_i$和$alpha_j$进行优化,这样就能够求出所有的$alpha$

    求b的值的时候,可以根据所有支持向量$y_s f(mathbf{x}_s)=1$ 这一约束来进行求解。

    核函数:

      理想情况下,我们的原始空间当中存在一个平面能够将正类和负类进行划分,但是实际情况下很难做到。我们可以寻找一个更高维平面,将数据映射到更高维上面进行划分。 比如在异或问题当中我们没有办法在二维平面上面找到一条直线,在这个时候,我们把数据映射到三维,在三维空间当中能够找到一个平面将数据进行划分。

      所以,当我们对我们的问题重新进行优化的时候,我们想要使用一个函数$phi 来将 mathbf{x}_i $映射到高维空间。于是上面的对偶问题变为了这样:

    $max limits_alpha sumlimits_{i=0}^{m} alpha _i  - frac{1}{2}sumlimits_{i=1}^msumlimits_{j=1}^malpha_i alpha_j y_i y_j  phi{ (mathbf{x}_i ) }^T phi (mathbf{x}_j) $

    但是,映射到高维有一个问题,那就是计算量太大了,这个时候我们想要寻找一个函数$kappa$在低维上面进行运算,它运算的结果和映射到高维上再进行计算的结果是一样的。即$kappa(mathbf{x}_i, mathbf{x}_j) =phi{ (mathbf{x}_i ) }^T phi (mathbf{x}_j) $。幸运的是,我们根据一些条件能够找到这样一些函数,这些函数就是核函数。每一个核函数$kappa$也对应着一种映射$phi$。

    常用的核函数:

    线性核        $kappa(mathbf{x}_i, mathbf{x}_j) = mathbf{x}_i^T mathbf{x}_j$

    多项式核     $kappa(mathbf{x}_i, mathbf{x}_j) ={( mathbf{x}_i^T mathbf{x}_j )}^d$            $d geq 1$为多项式的次数

    高斯核        $kappa(mathbf{x}_i, mathbf{x}_j)  = exp (-frac{{Vert mathbf{x}_i – mathbf{x}_jVert}^2}{2 sigma ^2})$      $sigma >0$为高斯核的带宽(width) 

    拉普拉斯核    $kappa(mathbf{x}_i, mathbf{x}_j)  = exp (-frac{Vert mathbf{x}_i – mathbf{x}_jVert }{2 sigma })$      $sigma >0$

    Sigmoid核    $kappa(mathbf{x}_i, mathbf{x}_j) =  tanh(eta mathbf{x}_i^T mathbf{x}_j + heta) $     tanh为双曲正切函数 $eta >0 , heta <0$

    其中线性核表示的是不进行变换,$mathbf{x}_i^T mathbf{x}_j$ 就映射为$mathbf{x}_i^T mathbf{x}_j$

    以二次多项式核为例,我们可以得到它的映射函数:

    $kappa(mathbf{x}, mathbf{z}) = (mathbf{x}^Tmathbf{z})^2$

    = $mathbf{x}^Tmathbf{z}mathbf{x}^Tmathbf{z}$

    = $left( sum limits_{i=1}^{m} x_i z_i  ight) left(sum limits_{j=1}^{m} x_j z_j ight)$

    = $sum limits_{i=1}^{m} sum limits_{j=1}^{m}x_i x_j z_i z_j$

    = $sum limits_{i=1}^{m} sum limits_{j=1}^{m}(x_i x_j)( z_i z_j)$

    = $phi(mathbf{x})^T phi(mathbf{z})$

    其中$phi(mathbf{x}) = sum limits_{i=1}^{m} sum limits_{j=1}^{m}x_i x_j $

    比如一个向量为$(x_1; x_2; x_3)$映射以后变为$(x_1x_1 ;x_1x_2 ; x_1x_3 ;x_2x_1 ;x_2x_2   ;x_2x_3 ;x_3x_1 ;x_3x_2 ;x_3x_3)$   把一个3维的向量映射到9维上面。

    幸而我们有了核函数,只需要在3维上面进行计算,而不是映射到9维上面然后再进行计算,这节省了很多的计算量。

    软间隔和hinge损失

    上面所讨论的问题都属于“硬间隔”,也就是把所有的样本都分类正确。 在实际过程当中,我们放宽这条限制,不一定让所有的样本满足$  y_i(mathbf{w}^Tmathbf{x}_i+b)  geq 1, i=1,2,…,m $  但是我们还是希望这类样本越少越好,于是我们对不满足上面条件的样本进行惩罚,引入损失函数的概念。

    我们利用上面的思想来对我们的目标函数进行优化,能够推导出来我们的svm算法其实使用的损失函数叫做hinge损失。这一部分内容在我的博客损失函数 svm和Hinge损失小节里面有介绍。

    sklean中SVC的参数

    我们来看一下sklearn.svm.SVC里面常用的参数

    C:惩罚因子。 默认的情况是1.0。 C的值越大,对于误分类的惩罚越大,当C的值为无穷大的时候表示全部正确分类。 C的值越小,对于误分类的惩罚越小。

    kernel: 核函数。 可以的取值为 线性核:‘linear’,多项式核:‘poly’,径向基核:‘rbf’,sigmoid核:‘sigmoid’,预定义核:‘precomputed’或者其它的可调用函数。

    degree: 度。 多项式核‘poly’的度,默认为3,其它核忽略。

    gamma:   ‘rbf’, ‘poly’ and ‘sigmoid’核的参数。如果gamma=‘auto’那么,将会使用1/n_features的值。

    coef0:  核函数中的独立项,只在‘poly’ and ‘sigmoid’中有用。

    参考:

    支持向量机(三)核函数

    《机器学习》 周志华

  • 相关阅读:
    【初码干货】使用阿里云开放搜索服务快速搭建资源搜索网站
    很认真的聊一聊程序员的自我修养
    【初码干货】使用阿里云邮件推送服务架设自己邮件验证与推送体系
    Supervisor 修改配置文件中的参数值,需要更新服务才能生效
    如何关闭 IntelliJ IDEA 的 Find in Path ?
    Jenkins 服务启动/关闭/重启命令,设置端口
    java.util.ConcurrentModificationException 问题处理
    MySQL 将字符串类型的小数转换为保留位数的小数类型
    Apache Tomcat 文件包含漏洞(CVE-2020-1938)
    Error EElFTPSError: Data channel transfer error (error code is 10054) MobaXterm
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8647237.html
Copyright © 2020-2023  润新知