zoukankan      html  css  js  c++  java
  • 关于svm

    svm的研究一下,越研究越发现深入。下面谈一些我个人一些拙见。

    svm计算基础是逻辑回归(logistic regression),其实一切二元分类的鼻祖我觉得都是logistic regress。

    公式如下:

    那么当我们谋求一个超平面(在二维里面超"线")y = w.T * x + b来实现分类,其实就是g(w.T *x + b),注意这里有点反人类,在前者y是因变量,但是在g(z)中,y变成了自变量,是一个层级关系;后者意义就是我作为一个函数,函数的意义满足某个计算规则的点,扔到里面去,可以用于做分类;从下图可以看到,下面的三条线(超平面),都符合函数w.T + b的模式,但是扔到g(z)里面的结果预期是不一样,相当于将g(1)和g(-1),g(0)(注意这里的-1和1都是极值,为了保证最大间隔的极值,其实y是连续的,可以取任意实数);那么就是可以实现基于sigmoid函数的分类。当然g的取值也是二元的-1,和+1。

    那么下面就是重点讨论w.T*x + b这个超平面。在讨论这个公式之前,我们首先确定一下概念,有了上图之后,可以简单的解释一下这个问题,所谓的支持向量机,就是实现查找到实现可分间隔最大化的边缘平面的算法;那么支持向量就是分布在变换平面上面的点,之所以称之为支持向量就是因为他么支撑了边缘平面,那么支持向量后面的那些点都不需要关心了,他们的位置对于分类没有任何帮助,所以就属于非支撑(骨干)的点。到此简单讲解了一下支持向量机的概念。

    那么如何来搞掂这个最大化边缘平面呢?我在刚开始接触的时候其实并不是特别理解最大化间距,但是看到上图之后,其实你会发现如果不断的旋转移动这三条线,你会发现为了实现分类,三条线的相对位置其实是在不断变化的,svm的算法的目的就是实现让分类边缘线1)平行,2)间隔最大;那么为什么要最大呢?这样分类倾向性会更加明显一些,一些个似是而非的点可能性将会非常小;极端情况,在逻辑回归的场景下,就是一条线,如果点在这条线上面了,你说怎么分?所以svm通过"宽带"这种分割模式,在很大程度上加强的分类的倾向性。

    关于最大化边缘平面距离就是最大化间隔问题,那么间隔,就要提到两种间隔,分别是函数间隔和几何间隔,函数间隔:

    点x到超平面的间隔,或者说距离就是w.T *x + b,但是因为分类,所以距离有正负,为了获知分类正确性,前面乘以y,y就是分类,只有-1和1两个值,之所以这样处理,如果分类正确,说明y和f(x)的符号一致,距离必然正值,反之负值,所以通过符号就可以判断来准确性。我们让边缘平面的y值取-1和1,所以在边缘超平面的点一定是=1或者=-1,那么y的取值范围是大于1,小于-1的;通过函数间隔,其实我们目标是求出这些点到超平面的距离的最小值:

    这样人为的定义的距离有一个问题,就是如果等比例放大w和b,将会导致距离也变化,但是我们知道等比例改变w和b将会导致距离变化(对应的y值也等比例增加),但是此时超平面并没有变化,但是距离却不再和之前相等;所以此时引入了几何距离:

    下面的是推导过程,可以得出几何距离。

    处于同样的理由,我们让y*r,这个就是最终的几何距离公式:

    这样我们求解最大间隔问题,其实就是求:

    约束条件(s.t)为

    这样,我们其实设r^值为1,并不影响优化效果,来简化处理公式(为什么改成1可以?):

    那么如何求解呢?

    这里有一个非常美妙的变化,就是上面的公式可以变型为min函数:

    更加精妙的变形在于通过下式将约束和min函数包容起来了:

    其实为什么可以把约束和主题函数放在一起?看下面的公式:

    ai是大于0的,yi(w.T*xi+b)一定是>=1,因为为了实现L(w,b,a)的最大化,一定是||w||**2/2的后面部分一定是等于0,才能够实现最大化,所谓约束,拉格朗日对偶的公式里面已经成为了一种前置假设。这个是我之前的理解,但是这里其实牵涉到凸优化的问题,并不是简单的极值。比如下面的变形,其实使用的凸优化的知识:

    然后进行max和min位置交换:

    这种等价交换是有条件的(正常情况下d*<=p*),这种转换使得计算变得简单,但是,为什么变得简单了,为什么先min后max就会简化运算?不懂。

    数学最优化模型是下图所示,f(x)是要求最小化的函数,hj是等式约束,gk是不等式约束。

    有了有了优化模型的描述,我们再来看看min-max等价交换的KKT条件:

    求对偶问题三个步骤:

    1)对w和b求对偶:

    带入到上面L(w,b,a)公式中,可得:

    最后经过推到:

    这里注意,早期全部都是i但是到了推倒的最后几步出现了i,j的分割:

    这里的其实是一个两层循环,外层循环是i,里层循环是j;这个两层循环的累加完成了矩阵间的乘法运算。

    第二步,根据上一步推导出来的公式进行求a值;

    有了a之后,根据偏导数求出的公式可以解出w,然后通过下面的公式可以求出b,从公式上面来看应该是f(x)的最大值和最小值的均值,但是为什么是这个求b值呢?

     

    第三步,即最后一步,通过SMO算法求解a;但是到这里我懵逼了,在第二步的时候,不是已经把a值给求出来了吗,怎么又求了一遍?

    核函数

    其实数据大多数场景都是线性不可分的,就是无法采用一条直线进行分类,需要曲线,曲线就是多项式,计算比较复杂,这个时候,如果是升维,那么很多时候可以简化问题,这个时候,核函数就出现了。

    在讲核函数之前,我们先看一个前置知识:向量内积。

    通过上面公式,可以很清晰的看到转置被处理成了内积,OK,核函数的本质其实就是把低维数据映射高维数据,怎么映射?

    简单讲就是将原来x->φ(x),那么核函数的高明之处在于他的计算并不是在映射到高维之后,再计算,如果那样的话,求解可能会有"维度灾难"。比如:

    这是一个五维空间,计算量比较大了,但是核函数不是对于分解之后在计算,而是找到了一种等价的形式:

    来对其进行计算,这样的话,你会发现计算简单很多。而且核函数的形式和咱么上面提到公式中内积的形式是一致的(注意,核函数可并不是为了svm的内积而生的,而是有气自己数学应用场景的)。所以,你可以指定一些核函数来进行提升维度处理,同时还避免了高维的海量特征的计算。

    常用的核函数包括:

    1. 多项式;上面举例(<x1,x2> + 1)**2就是一个多项式核函数的例子;

    2. 高斯核函数,这个可能是应用最广泛的一种和函数了。

    3. 线性核函数,这个主要就是用于兼容,当不需要提高维度,但是为了计算的统一性,采用这个核函数可以保证计算逻辑的一致性。

     

    关于松弛变量

    svm中对于离群点有专门的处理,所谓离群点是指下图中的蓝色部分。所谓离群点是指貌似对方,但是其实是自己人那些点,但是因为位置比较尴尬,所以svm设置了一个松弛变量,就是允许在一定范围内的离群点,这样可以这样讲,其实允许在"宽带"之间有一些点,这些点将会基于到宽带两边的距离来进行划分。避免宽带间点无法被处理。

    我们继续拿函数距离来做表达(为什么这里又采用了函数距离,而不是集合距离),此时距离赢不再是1,而是减去一个变量。

    ξi不可以任意大的,于是添加了一个C作为限制

    于是我们有了新的L(w,b,a):

    后面处理的流程和上面很类似,首先是求导获取极值取值:

    带入到拉格朗日的公式中,可以求得:

    结果函数和之前是一样的,但是增加了一项约束:ai<=C(因为C-ai-ri=0,所以C必然大于等于ai)

    最后是SMO算法,其实smo算法才是向量机的核心,他解决了如何求解a的关键,但是讲真,我看的资料并没有把smo算法讲明白。下一轮再研究吧。

     

    参考

    https://blog.csdn.net/v_JULY_v/article/details/7624837

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/10456023.html
Copyright © 2011-2022 走看看