• 机器学习:支持向量机


    本文来自同步博客

    P.S. 不知道怎么显示数学公式以及更好的排版内容。所以如果觉得文章下面格式乱的话请自行跳转到上述链接。后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱。看原博客地址会有更好的体验。

    上一篇文章使用KNN算法解决机器学习的分类问题。本文将介绍另一种号称解决分类问题的最佳算法,叫支持向量机SVM(Support Vector Machine)。

    这篇文章将不立即从代码开始介绍SVM,而是从理论知识开始了解其原理,最后用代码实践并验证我们对知识的理解。

    基本原理

    SVM的目标是找到一个超平面,使得超平面到最近样本点之间的间隙最大化,从而把样本点切割成不同的子空间以得到分类的效果。

     
    切割方法的比较

    看上面图片所列举的三种针对同一空间中样本数据的切割方法。最后一种才是符合SVM要求的切割方法。

    需要加深一下大家的印象:

    1. 在一维空间中,这个超平面是一个点;
    2. 在二维空间中,这个超平面是一条线;
    3. 在三维空间中,这个超平面是一个面;
    4. 更多维的空间,呵呵,我想象不了...

    如果仅仅依靠点线面只能处理具有线性可分割特征的数据,而当样本数据无法进行线性切割时,是不是SVM就不适用了呢?不是的,对这种场景,可以通过一些转换函数,把直线或者平面变成曲线或者曲面进行切割。

    本文还是我们先从可以线性切割的简单的场景出发进行推导SVM的基本原理。有关无法进行线性切割的内容,我们将在后面介绍。

    数学推导

    为了找到符合SVM要求的超平面,我们需要先通过数学语言描述它。请看下图:

     
    超平面的数学表示

    在这个空间中有四个样本点分成了两类,红色的表示“+”类,黄色表示“-”类。图中的实线L就是我们在这个空间中根据SVM定义找到的超平面。样本点A、B、C、D等在空间中均用向量表示,特别地,落在虚线上的点A、B、C作为间隙的边界点而存在,将会为计算超平面作出贡献,因此成为Support Vector。这应该就是Support Vector Machine名字的由来。

    现在我们定义一个向量$-vec{w}-$,它垂直于超平面L,是L的法向量。则使用法向量$-vec{w}-$描述超平面L为:

    $$vec{w}^{T}(vec{x} - vec{x_0}) = 0 $$

    其中$-vec{x_0}-$为$-vec{w}-$与超平面的交点。令$-b = -vec{w}vec{x_0}-$,L可以表示为:

    $$式子1: vec{w}^{T}vec{x} + b = 0$$

    针对一个新的数据点$-vec{u}-$,如果点落在超平面L的右上方,则判定这个数据点为“+”类;若是落在L的左下方则判定为“-”类。即决策规则为:

    $$
    Rule: egin{cases}
    vec{w}^{T}vec{u} + b > 0, & mbox{if }vec{u}mbox{ is class '+'} \
    vec{w}^{T}vec{u} + b < 0, & mbox{if }vec{u}mbox{ is class '-'}
    end{cases}
    $$

    我们的目标是确定超平面L。但是由于$-vec{w}-$的长度是不清楚的,$-b-$也受之影响而无法确定。它们可以有太多太多中组合了。所以接下来需要通过样本数据来约束$-vec{w}-$和$-b-$的取值范围,为我们求解提供依据。

    原本对于对所有样本点$-x_i-$,满足:

    $$
    egin{array}{lcl}
    vec{w}^{T}vec{x_i} + b > 0,& mbox{if }vec{x_i}mbox{ is class '+'} \
    vec{w}^{T}vec{x_i} + b < 0,& mbox{if }vec{x_i}mbox{ is class '-'}
    end{array}
    $$

    为了增加约束条件从而限制$-vec{w}-$的取值范围,我们把超平面分别向右上和左下平移,直至到达虚线位置。并且限定右上虚线和左下虚线的表达式为:$-vec{w}^{T}vec{x_i} + b = 1-$和$-vec{w}^{T}vec{x_i} + b = -1-$。能够同时满足超平面以及两个虚线位置的超平面表达式的$-vec{w}-$和$-b-$组合一定是存在的。那么所有的样本点$-x_i-$都将满足下面不等式:

    $$
    式子2: egin{cases}
    vec{w}^{T}vec{x_i} + b ge 1,& mbox{if }vec{x_i}mbox{ is class '+'} \
    vec{w}^{T}vec{x_i} + b leq -1,& mbox{if }vec{x_i}mbox{ is class '-'}
    end{cases}
    $$

    这个不等式组利用了样本点已经确定了所属类这个已知条件来约束$-vec{w}-$的取值范围。选择“1”和“-1”则是一个数学技巧,让后续计算中更加方便,它并不影响计算过程。

    接下来,引入分类变量$-y_i-$:
    $$
    式子3: egin{cases}
    y_i = 1,& mbox{if }vec{x_i}mbox{ is class '+'} \
    y_i = -1,& mbox{if }vec{x_i}mbox{ is class '-'}
    end{cases}
    $$

    式子2和式子3两个方程组分别相乘,并把右边的1移到左边,可以得到一个统一的不等式:

    $$式子4:y_i(vec{w}^{T}vec{x_i} + b) - 1 ge 0$$

    这个不等式只有落在SVM分割间隙的边缘(即图中虚线)的样本点(如:A、B、C)才能使等号成立。

    到这里,请重新回到SVM的原理:寻找让间隙最大化的超平面作为分类的决策边界。我们需要确定分割间隙的宽度的计算函数。假设在间隙两个边缘(两条虚线)处分别取样本$-vec{x_+}-$和$-vec{x_-}-$,对应类型取值为$-y_+ = 1-$、$-y_- = -1-$,可以得到:
    $$
    egin{align}
    width &= frac{vec{w}^{T}}{|vec{w}|}(vec{x_+} - vec{x_-}) \
    &= frac{1}{|vec{w}|}(vec{w}^{T}vec{x_+} - vec{w}^{T}vec{x_-}) \
    &= frac{1}{|vec{w}|}(frac{1-b}{y_+} - frac{1-b}{y_-})\
    &= frac{1}{|vec{w}|}(frac{1-b}{1} - frac{1-b}{-1})\
    &= frac{2}{|vec{w}|}
    end{align}
    $$

    为了让间隙的宽度取得最大,可以推导出:

    $$
    式子5:egin{align}
    & Maximize(width) \
    &Leftrightarrow Maximize(frac{2}{|vec{w}|}) \
    &Leftrightarrow Minimize(|vec{w}|)\
    &Leftrightarrow Minimize(frac{1}{2}|vec{w}|^2)\
    &Leftrightarrow Minimize(frac{1}{2}vec{w}^{T}vec{w})
    end{align}
    $$

    有了这个依据,利用拉格朗日乘子法求不等式约束条件下的极值问题,可以构造这样的函数:

    $$
    L(vec{w}, b, vec{alpha}) = frac{1}{2}vec{w}^{T}vec{w} - sum_{i}{n}{alpha_i[y_i(vec{w}{T}vec{x_i})-1]}, alpha_i ge 0, i = 1,2...n
    $$

    在这里问题的目标是求让$-L(vec{w}, b, vec{alpha})-$最小时的$-vec{w}-$、$-b-$和$-vec{alpha}-$,因此先分别对$-vec{w}-$和$-b-$求偏导:

    $$
    frac{partial L}{partial vec{w}} = vec{w} - sum_{i}^{n}{alpha_i y_i vec{x_i}},
    frac{partial L}{partial b} = - sum_{i}^{n}{alpha_i y_i}
    $$

    让偏导函数等于0,有:

    $$
    vec{w} = sum_{i}^{n}{alpha_i y_i vec{x_i}}, sum_{i}^{n}{alpha_i y_i} = 0
    $$

    在这里先不求出关于$-vec{alpha}-$的偏导,而是把上述两个等式代回拉格朗日函数L,从而可以得到一个关于$-vec{alpha}-$的函数:

    $$
    L(vec{alpha}) = sum_{i}^{n}{alpha_i} - frac{1}{2}sum_{i}{n}{sum_{j}{n}{alpha_i alpha_j y_i y_j vec{x_i}^{T} vec{x_j}}}, sum_{i}^{n}{alpha_i y_i} = 0, alpha_i,alpha_j ge 0, i,j = 1,2...n
    $$

    根据对偶问题的思想,上述最小化问题可转为求使$-L(vec{alpha})-$最大化的$-alpha-$(参考KKT条件问题)。

    对上式两边添加负号,进一步转换问题:求让$- -L(vec{alpha})-$最小化的$-alpha-$。这时有:

    $$
    F(vec{alpha}) = -L(vec{alpha}) = frac{1}{2}vec{alpha}^{T}egin{bmatrix}
    y_{1}y_{1}vec{x_1}^{T}vec{x_1} & y_{1}y_{2}vec{x_1}^{T}vec{x_2} & cdots & y_{1}y_{n}vec{x_1}^{T}vec{x_n} \\
    vdots & vdots & ddots & vdots \\
    y_{n}y_{1}vec{x_n}^{T}vec{x_1} & y_{n}y_{2}vec{x_n}^{T}vec{x_2} & cdots & y_{n}y_{n}vec{x_n}^{T}vec{x_n} \\
    end{bmatrix}vec{alpha}
    + egin{bmatrix}
    -1 & -1 & cdots & -1 \\
    end{bmatrix} vec{alpha}, vec{y}^{T}vec{alpha} = 0, vec{alpha} ge 0
    $$

    啊哈,这是二次规划的形式,可以利用二次规划求解。我们需要求解能够使$-F(alpha)-$最小的$-alpha-$值,然后通过$-alpha-$才可以得到$-vec{w}-$和$-b-$。

    这里提供一个使用scipy求解二次规划的代码示范:

    import numpy as np
    from scipy import optimize
    # 形如:F = (1/2)*x.T*H*x + c*x + c0
    # 约束条件:Ax <= b
    # 现在假设已知参数如下:
    H = np.array([[2., 0.],
                  [0., 8.]])
    c = np.array([0, -32])
    c0 = 64
    A = np.array([[ 1., 1.],
                  [-1., 2.],
                  [-1., 0.],
                  [0., -1.],
                  [0.,  1.]])
    b = np.array([7., 4., 0., 0., 4.])
    
    # 设置初始值
    x0 = np.random.randn(2)
    
    def loss(x, sign=1.):
        return sign * (0.5 * np.dot(x.T, np.dot(H, x))+ np.dot(c, x) + c0)
    
    def jac(x, sign=1.):
        return sign * (np.dot(x.T, H) + c)
    
    cons = {'type':'ineq',
            'fun':lambda x: b - np.dot(A,x),
            'jac':lambda x: -1 * A}
    opt = {'disp':False}
    
    res_cons = optimize.minimize(loss, x0, jac=jac,constraints=cons,
                                     method='SLSQP', options=opt)
    print(res_cons)

    源码见Github

  • 相关阅读:
    构建WebGL目标时的内存考量
    译作感想
    sign
    VS code搭建C环境
    003 总线
    计算机混淆概念(更新……)
    002计算机硬件性能指标
    001计算机基本组成与工作过程
    Linux虚拟机手动安装eclipse
    VMware安装vmtools实现宿主机和虚拟机共享粘贴板
  • 原文地址:https://www.cnblogs.com/developerdaily/p/8979128.html
Copyright © 2020-2023  润新知