• svm中的数学和算法


    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到函数拟合等其它机器学习问题中。

    一、数学部分

    1.1二维空间

    支持向量机的典型应用是分类,用于解决这种问题:有一些事物是能够被分类的,可是详细怎么分类的我们又说不清楚,比方说下图中三角的就是C1类,圆圈的就是C2类,这都是已知的,好,又来了一个方块,这个方块是属于C1呢还是属于C2呢,说不清楚。SVM算法就是试着帮您把这件事情说清楚的。

    1在二维空间里(这时候样本有两个參照属性),SVM就是在C1和C2中间划一条线g(x)=0,线儿上边的属于C1类,线儿下边的属于C2类,这时候方块再来,咱就有章程了。

    2     

    关于g(x) = 0得再啰嗦几句,g(x)里边的x不是横坐标,而是一个向量,clip_image002[4]也不是解析几何里边的斜率,也是向量。clip_image004是一个向量积。比方在解析几何意义上的直线y = -x-b,换成向量表示法就是clip_image002[12] ,这里w就是那个clip_image008,x就是那个clip_image010

    对C1类中的点:g(x) > 0;对于 C2类中的点:g(x) < 0 ;

    假设我们用y来表示类型,+1代表C1类,-1代表C2类。

    那么对于全部训练样本而言,都有:clip_image012,那么g(x) = 0 就行正确切割全部训练样本的那条线,仅仅要把g(x) = 0这条线给找出来就能凑合用了。

    这也就仅仅能凑合用,由于满足这个条件的g(x) = 0 太多了,追求完美的我们要的是最优的那条线。怎么才是最优的呢?直觉告诉我们g(x) = 0这条线不偏向C1那边,也不偏向C2那边,就应该是最优的了吧。对,学名叫分类间隔,下图红线的长度就是分类间隔。

    3

    在二维空间中,求分类间隔,能够转化为求点到线的距离,点到线的距离能够表示为clip_image002[6](向量表示)。为简单计,把整个二维空间归一化(等比放大或缩小),使得对于全部的样本,都有|g(x)|>=1,也就是让C1和C2类中离g(x)=0近期的训练样本的|g(x)|=1,这时分类间隔就是clip_image004[4],这个间隔越大越好,那么|clip_image006[8]|越小越好。

    1.2多维空间

    如今我们已经在2维空间中抽象出一个数学问题,求满足例如以下条件的g(x)=0:

    clip_image008[4],即在满足clip_image010[4]条件下能使clip_image012[4]取最小值的那个w。在二维空间中,w能够近似的理解为斜率,在样本确定,斜率确定的情况下,clip_image014中的那个b也是能够确定的,整个clip_image016 = 0也就确定了。

    如今我们讨论的仅仅是二维空间,可是我们惊喜的发现,在二维空间中的结论能够非常easy的推广到多维空间。比方说:

    我们仍然能够把多维空间中的切割面(超平面)表示为clip_image018

    多维空间中点到面的距离仍然能够表示为clip_image002[7]。例如以下图,平面表示为clip_image018[1],x是clip_image020在面上的投影,r是x到面的距离,简单推导例如以下:

    w向量垂直于平面clip_image022,有:clip_image024,把上式带入clip_image018[2]中得到clip_image026,化简得到clip_image028,所以clip_image030,向量x到平面clip_image018[3]的距离clip_image032,这和二维空间中结论也是一致的。

    clip_image034

    如今我们把SVM从2维空间推广到多维空间,即求满足例如以下条件的g(x)=0:

    clip_image036

    1.3拉格朗日因子

    这是一个典型的带约束条件的求极值问题,目标函数是clip_image006[9]的二次函数,约束函数是clip_image006[10]的线性函数:二次规划问题。求解二次规划问题的一般性方法就是加入拉格朗日乘子,构造拉格朗日函数(理论上这儿应该另一些额外的数学条件,拉格朗日法才是可用,就略过了)。

    详细求解过程例如以下:

    1、构造拉格朗日函数

             clip_image038

    当中clip_image006[11]和b是未知量。

    2、对clip_image006[12]和b求偏导数,令偏导数为0。

    clip_image040, 即clip_image042

    clip_image044

    3、把上式带回拉格朗日函数,得到拉格朗日对偶问题,把问题转化为求解clip_image046

    clip_image048

    4、最后把问题转化为求解满足下列等式的clip_image046[1]

    clip_image050

    1.4线性化

    好,如今我们再来梳理一下svm的分类逻辑,在空间中找一个切割面(线)把样本点分开,切割面(线)的最优条件就是分类间隔最大化,分类间隔是基于点到平面(直线)的距离来计算的。问题是全部的切割面都是平面,全部的切割线都是直线吗?显然不是。

    比方特征是房子的面积x,这里的x是实数,结果y是房子的价格。如果我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。

    在二维空间中这是非线性的,这样我们前面的推理都没法用了------点到曲线的距离?不知道怎么算。可是假设把x映射到3维空间clip_image052,那么对于clip_image054来说,clip_image056就是线性的,也就是说,对于低维空间中非线性的线(面),在映射到高维空间中时,就能变成线性的。于是我们还须要把问题做一个小小的修正,我们面临的问题是求解:

    clip_image050[1],这里面引入了一个Kernel,核函数,用于样本空间的线性化。

    1.5松弛变量

          上面就是一个比較完整的推导过程,可是经验表明把上述条件丢给计算机进行求解,基本上是无解的,由于条件太苛刻了。实际上,最常常出现的情况例如以下图红色部分,在分类过程中会出现噪声,假设对噪声零容忍那么非常有可能导致分类无解。

    5      

    为了解决问题又引入了松弛变量。把原始问题修正为:

    clip_image002[10]

    依照拉格朗日法引入拉格朗日因子:

    clip_image004[6]

    对上式分别求clip_image006[18]的导数得到:

    clip_image008[6], 即clip_image010[6]

    clip_image012[6]

    clip_image014[4]

    带回clip_image016[4]得到拉格朗日的对偶问题:

    clip_image018[10]

    另外当目标函数取极值时,约束条件一定是位于约束边界(KKT条件),也就是说:

    clip_image020[4]

    clip_image022[4]

    分析上面式子能够得出下面结论:

    clip_image024[4]时:clip_image026[4]能够不为零,就是说该点到切割面的距离小于clip_image028[4],是误分点。

    clip_image030[4]时:clip_image026[5]为零,clip_image032[4]大于零:表示该点到切割面的距离大于clip_image028[5]是正确分类点。

    clip_image034时:clip_image026[6]为零,clip_image036[4],该点就是支持向量。

    再用数学语言提炼一下:

    clip_image038[4],其对clip_image040[4]的偏导数为:

    clip_image042[4]

    KKT条件能够表示为:

    clip_image044[4]

    clip_image046[6]表示该KKT条件就是:

    clip_image048[9]

    clip_image050[6],则

    全部的clip_image052[4] 大于全部的clip_image054[4]。这里b作为中间数被忽略了,由于b是能够由clip_image056[4]推导得到的。

    二、算法部分

    对于样本数量比較多的时候(几千个),SVM所须要的内存是计算机所不能承受的。眼下,对于这个问题的解决方法主要有两种:块算法和分解算法。这里,libSVM採用的是分解算法中的SMO(串行最小化)方法,其每次训练都仅仅选择两个样本。基本流程例如以下:

    image

    这里有两个重要的算法,一个是clip_image060的选择,还有一个是clip_image060[1]的更新。

    2.1clip_image062的选择算法

    选择两个和KKT条件违背的最严重的两个clip_image056[5],包括两层循环:

    外层循环:优先选择遍历非边界样本,由于非边界样本更有可能须要调整,而边界样本经常不能得到进一步调整而留在边界上。在遍历过程中找出clip_image064的全部样本中clip_image066值最大的那个(这个样本是最有可能不满足clip_image068条件的样本。

    内层循环:对于外层循环中选定的那个样本clip_image056[6],找到这种样本clip_image070,使得:

    clip_image072

    clip_image074最大,上式是更新clip_image060[2]中的一个算式,表示的是在选定clip_image056[7]clip_image070[1]最为更新算子的情况下,clip_image076最大。

    假设选择clip_image060[3]的过程中发现KKT条件已经满足了,那么算法结束。

    2.2clip_image062[1]的更新算法

    因为SMO每次都仅仅选择2个样本,那么等式约束能够转化为直线约束:

    clip_image078

    转化为图形表示为:

    clip_image079

    那么clip_image081的取值范围是:

    clip_image083

    clip_image085带入clip_image087中,得到一个一元二次方程,求极值得到:

    clip_image089

    终于:

    clip_image091

    2.3其它

    上面说到SVM用到的内存巨大,还有一个缺陷就是计算速度,由于数据大了,计算量也就大,非常显然计算速度就会下降。因此,一个好的方式就是在计算过程中逐步去掉不參与计算的数据。由于,实践证明,在训练过程中,clip_image095一旦达到边界(clip_image095[1]=0或者clip_image095[2]=C),clip_image095[3]的值就不会变,随着训练的进行,參与运算的样本会越来越少,SVM终于结果的支持向量(0<clip_image095[4]

    LibSVM採用的策略是在计算过程中,检測active_size中的clip_image095[5]值,假设clip_image095[6]到了边界,那么就应该把对应的样本去掉(变成inactived),并放到栈的尾部,从而逐步缩小active_size的大小。

    b的计算 ,基本计算公式为:clip_image097

    理论上,b的值是不定的。当程序达到最优后,仅仅要用随意一个标准支持向量机(0<clip_image095[7]<C)的样本带入上式,得到的b值都是能够的。眼下,求b的方法也有非常多种。在libSVM中,分别对y=+1和y=-1的两类全部支持向量求b,然后取平均值。

  • 相关阅读:
    System.Diagnostics.Conditional 的妙用 -- 把文档放在代码中
    UGUI 特效怎样在UI上裁剪
    通过GL函数处理图片以及其它相关功能
    每次都能让人头大的 Shader -- 从整合说起
    每次都能让人头大的 Shader -- 从一次简单的功能说起
    由于闭包引起的内存泄漏
    较为激进的基础框架
    UGUI 逻辑以及实用性辅助功能
    单相机做分屏混合
    AssetBundleMaster_ReadMe_EN
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3832331.html
Copyright © 2020-2023  润新知