支持向量机(SVM)是另一类的学习系统,其众多的优点使得他成为最流行的算法之一。其不仅有扎实的理论基础,而且在许多应用领域比大多数其他算法更准确。

 1、线性支持向量机:可分情况

根据公式(1)<w.x>+b=0,我们知道,w定义了垂直于超平面的方向 ,如上图,w被成为超平面的法向量,不改变法向量,可以通过变化b来平移超平面。

因为支持向量机要最大化整理正例和负例的距离,我们找到这个距离2/||W||;支持向量机寻找具有最大边距的分割平面,也就是被称为最大边距超平面,把该平面做为最终的决策平面;

上图 中,H是分类面,H1和H2是平行于H,且过离H最近的两类样本的直线,H1与H,H2与H之间的距离就是几何间隔。几何间隔与样本的误分次数间存在关系:

其中的δ是样本集合到分类面的间隔,,即R是所有样本中向量长度最长的值。从上式可以看出,误分次数的上界由几何间隔决定。因此选择几何间隔来作为评价一个解优劣的指标,几何间隔越大的解,它的误差上界越小。因此最大化几何间隔成了我们训练阶段的目标。

从d=|<w.xs>+b-1|/||w||=1/||W||式可知,几何间隔与||w||是成反比的,因此最大化几何间隔与最小化||w||等价。通常不是固定||w||的大小而寻求最大几何间隔,而是固定间隔(例如固定为1),寻找最小的||w||。

此时变成一个最优化问题,若想寻找一个小||w||,就可以用下面的式子表示:

但实际上对于这个目标,常常使用另一个完全等价的目标函数来代替,如下:

如果直接来解这个求最小值问题,很容易看出当||w||=0的时候就得到了目标函数的最小值。反映在图2中,就是H1与H2两条直线间的距离无限大,这个时候,所有的样本点都位于H1和H2中间,而我们原本的意图是,H1右侧的被分为正类,H2左侧的被分为负类,位于两类中间的样本则拒绝分类。这样,所有样本点都进入了无法分类的灰色地带。造成这种结果的原因是在描述问题的时候只考虑了目标,而没有加入约束条件,于是可以添加约束条件:

(n是总的样本数)

于是可以将两类分类转化成数学形式,如下:

在这个问题中,自变量就是w,而目标函数是w的二次函数,所有的约束条件都是w的线性函数,这种规划问题就是二次规划(Quadratic Programming,QP),由于它的可行域是一个凸集,因此它是一个凸二次规划。

样本确定了w,用数学的语言描述,就是w可以表示为样本的某种组合:

                       

式子中的是拉格朗日乘子,而是样本点,也是向量,n就是总样本点的个数。为了方便描述,以下开始严格区别数字与向量的乘积和向量间的乘积,我会用aw表示数字和向量的乘积,而用<w.x>表示向量的内积。因此公式(1)严格的形式应该是:

w不仅跟样本点的位置有关,还跟样本的类别有关。因此用下面这个式子表示w:

其中的ai就是第i个样本的标签,它等于1或者-1。其实以上式子的拉格朗日乘子中,只有很少的一部分不等于0,这部分不等于0的拉格朗日乘子后面所乘的样本点,其实都落在和上,也正是这部分样本唯一的确定了分类函数。这部分可以确定分类的样本点,就叫做支持向量。因此原来的g(x)表达式可以写为:

,

其中,

上式可以变形为:

  此时消去了上式中的,问题从求变成了求。这样就简化了原问题的求解,以这样的形式描述问题以后,优化问题少了很大一部分不等式约束。

 SVM中的核函数

根据模式识别理论,低维空间线性不可分的模式通过非线性映射到高维特征空间则可能实现线性可分,但是如果直接采用这种技术在高维空间进行分类或回归,则存在确定非线性映射函数的形式和参数、特征空间维数等问题,而最大的障碍则是在高维特征空间运算时存在的“维数灾难”。采用核函数技术可以有效地解决这样问题。

如图3所示,当分类问题在低纬空间无法用线性分类方法解决时,可以通过将低纬空间的数据映射到高纬特征空间中,从而达到线性可分的目的。

图3 低纬度向高纬度空间映射

从低纬度向高纬度转化关键在于寻在一个函数,但对目前没有一个系统的方法。对映射过程推导如下:

从上式可以得出,我们只关心高维空间里内积的值,而核函数就是接受低空间的输入,并计算出在高纬空间的内积值。,就是我们要找的核函数。如图4

图4 在映射过程中的核函数

于是上式,可以表示为。尽管给的问题是线性不可分的,但凡是要求内积的时候我们就选定的核函数来算。这样求出来的α再和你选定的核函数一组合,就可以得到线性分类器。但是任然存在以下两个问题:

1.既然有很多的核函数,针对具体问题该怎么选择?

2.如果使用核函数向高维空间映射后,问题仍然是线性不可分的,那怎么办?

第一个问题:对核函数的选择,现在还缺乏指导原则!各种实验的观察结果的确表明,某些问题用某些核函数效果很好,用另一些就很差,但是一般来讲,径向基核函数是不会出太大偏差的一种,首选。

  对第二个问题的解决用了SVM中的另一个概念:松弛变量。

SVM支持向量机算法的更多相关文章

  1. SVM 支持向量机算法-实战篇

    公号:码农充电站pro 主页:https://codeshellme.github.io 上一篇介绍了 SVM 的原理和一些基本概念,本篇来介绍如何用 SVM 处理实际问题. 1,SVM 的实现 SV ...

  2. SVM(支持向量机)算法

    第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...

  3. 跟我学算法-svm支持向量机算法推导

    Svm算法又称为支持向量机,是一种有监督的学习分类算法,目的是为了找到两个支持点,用来使得平面到达这两个支持点的距离最近. 通俗的说:找到一条直线,使得离该线最近的点与该线的距离最远. 我使用手写进行 ...

  4. SVM 支持向量机算法介绍

    转自:https://zhuanlan.zhihu.com/p/21932911?refer=baina 参考:http://www.cnblogs.com/LeftNotEasy/archive/2 ...

  5. SVM 支持向量机算法-原理篇

    公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...

  6. 深入浅出理解SVM支持向量机算法

      支持向量机是Vapnik等人于1995年首先提出的,它是基于VC维理论和结构风险最小化原则的学习机器.它在解决小样本.非线性和高维模式识别问题中表现出许多特有的优势,并在一定程度上克服了" ...

  7. [分类算法] :SVM支持向量机

    Support vector machines 支持向量机,简称SVM 分类算法的目的是学会一个分类函数或者分类模型(分类器),能够把数据库中的数据项映射给定类别中的某一个,从而可以预测未知类别. S ...

  8. 机器学习--支持向量机 (SVM)算法的原理及优缺点

    一.支持向量机 (SVM)算法的原理 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析.它是将向量映射到一个更高维的 ...

  9. scikit-learn 支持向量机算法库使用小结

    之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...

随机推荐

  1. runtime官方文档

    OC是一种面向对象的动态语言,作为初学者可能大多数人对面向对象这个概念理解的比较深,而对OC是动态语言这一特性了解的比较少.那么什么是动态语言?动态语言就是在运行时来执行静态语言的编译链接的工作.这就 ...

  2. UIScrollView 加载多个view view还可以交换顺序(1)

    #import "ViewController.h" #define kWidthOfScreen self.view.frame.size.width #define kHeig ...

  3. mysql5.7.16安装

    系统:centOS6.5 mysql: 5.7.16 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-linux-glib ...

  4. 单片机上使用TEA加密通信(转)

    源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...

  5. validator验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  6. 如何通过Maven的Jetty插件运行Web工程

    首先建议使用jetty9,因为据官方文档显示,Jetty 7 and Jetty 8 are now EOL (End of Life),如下.但是由于项目使用的版本一般都比较低,这里以jetty8为 ...

  7. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...

  8. OC工程调用Swift方法

    1.建一个OC工程命名为SwiftOC.如图所示: 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名- ...

  9. C#中泛型默认关键字(default)详解

    我们在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:(T 是引用类型还是值类型?)对此我们将如何处理? C#代码实例: /// <summary&g ...

  10. Java Queue 各种方法的区别

    再Java里的某些集合类,其实是实现了多个接口的,所以就会同时又多种方法针对同一种操作,比如LinkedList类. 首先看一下java集合类的继承关系图: 这里简单对其重复的方法做点简单的区分. o ...