1. 前言

去年由于工作项目的需要实际运用到了SVM和ANN算法,也就是支持向量机和人工神经网络算法,主要是实现项目中的实时采集图片(工业高速摄像头采集)的图像识别的这一部分功能,虽然几经波折,但是还好最终还算顺利完成了项目的任务,忙碌一年,趁着放假有时间好好整理并总结一下,本文的内容包括:前面的部分是对支持向量机原理的分析,后半部分主要直接上手的一些实践的内容。

本文的原理部分针对支持向量机的原理,特别拉格朗日对偶性,求解拉个拉格朗日函数,以及和函数与核技巧再到软间隔和正则化等重要内容做了一些讨论。

实践部分的目标则是通过对实践时碰到的问题,调参的过程的讲解可以对前半部分讲解的SVM原理部分的内容有一个更深入的了解。

  1. SVM、机器学习与深度学习

    1. 人工智能领域

大数据人工智能的时代,深度学习可以说火得一塌糊涂。美国硅谷的大公司都在布局着这个领域,而中国国内,腾讯,百度,阿里巴巴等等知名企业也都在这个领域争先发力,2017年初,百度迎来陆奇-前微软全球执行副总裁,人工智能领域世界级的权威,要知道百度还有人工智能大牛Andrew Ng – 吴恩达。所有迹象表明人工智能必然是继互联网之后的全球各大公司甚至国家必争的高地。

  1. 机器学习与深度学习

由于深度学习在大数据预测能力上的卓越表现,当下出现了深度学习是否会替代传统机器学习算法并淘汰他们的讨论,但是另一方面,大多数人仍然相信深度学习不会代替其他的模型或者算法。对于大多数的应用,像一些简单的算法如逻辑回归、支持向量机表现的已经很不错了,使用深度学习会让问题复杂化。

深度学习是可以应用到大部分领域的,但是就像前面说的,深度学习并非所有问题的最优方案,如果你的工作中有用到机器学习算法,你可以尝试传统的机器学习算法,也可以达到很好的效果。虽然现在已经有一些工作去把各领域的知识融入到深度学习中的,但这并不能完全替代原有的。

上图是一个关于机器学习算法的时间线来自于Eren Golge

就像在20世纪早期SVM一样,深度学习会成为主流,但首先深度学习应当解决其在大数据需求及复杂性方面的问题,这样它才会成为人们的第一选择。

  1. SVM简介

SVM(support vector machine)简单的说是一个分类器,并且是二类分类器。

  • Vector:通俗说就是点,或是数据。
  • Machine:也就是classifier,也就是分类器。

SVM作为传统机器学习的一个非常重要的分类算法,它是一种通用的前馈网络类型,最早是由Vladimir N.Vapnik 和 Alexey Ya.Chervonenkis在1963年提出,目前的版本(soft margin)是Corinna Cortes 和 Vapnik在1993年提出,1995年发表。深度学习(2012)出现之前,SVM被认为是机器学习中近十几年最成功表现最好的算法。

  1. SVM原理分析

    1. 快速理解SVM原理

很多讲解SVM的书籍都是从原理开始讲解,如果没有相关知识的铺垫,理解起来还是比较吃力的,以下的一个例子可以让我们对SVM快速建立一个认知。

给定训练样本,支持向量机建立一个超平面作为决策曲面,使得正例和反例的隔离边界最大化。

决策曲面的初步理解可以参考如下过程,

  1. 如下图想象红色和蓝色的球为球台上的桌球,我们首先目的是找到一条曲线将蓝色和红色的球分开,于是我们得到一条黑色的曲线。

图一.

2) 为了使黑色的曲线离任意的蓝球和红球距离(也就是我们后面要提到的margin)最大化,我们需要找到一条最优的曲线。如下图,

图二.

3) 想象一下如果这些球不是在球桌上,而是被抛向了空中,我们仍然需要将红色球和蓝色球分开,这时就需要一个曲面,而且我们需要这个曲面仍然满足跟所有任意红球和蓝球的间距的最大化。需要找到的这个曲面,就是我们后面详细了解的最优超平面。

4) 离这个曲面最近的红色球和蓝色球就是Support Vector。

  1. 线性可分和线性不可分

线性可分-linearly separable, 在二维空间可以理解为可以用一条直线(一个函数)把两类型的样本隔开,被隔离开来的两类样本即为线性可分样本。同理在高维空间,可以理解为可以被一个曲面(高维函数)隔开的两类样本。

线性不可分,则可以理解为自变量和因变量之间的关系不是线性的。

实际上,线性可不分的情况更多,但是即使是非线性的样本通常也是通过高斯核函数将其映射到高维空间,在高维空间非线性的问题转化为线性可分的问题。

  1. 函数间隔和几何间隔

  • 函数间隔functional margin: 给定一个训练样本有:

函数间隔代表了特征是正例或是反例的确信度。

  • 几何间隔 geometrical margin:

向量点到超平面的距离(其中后面详细介绍)

  1. 超平面分析与几何间隔详解

前面已经对SVM的原理有了一个大概的了解,并且简单介绍了函数间隔和几何间隔的概念,为了更好的理解线性可分模式下超平面,以下将进行深入的剖析推导过程,我们假设有训练样本集,期望的响应为,这里我们用类+1和类-1来代表,以表明样本是线性可分的。

决策曲面方程如下:

其中

x:输入向量,也就是样本集合中的向量;

w:是可调权值向量,每个向量可调权值;

T:转置,向量的转置;

b:偏置,超平面相对原点的偏移。

根据逻辑回归定义展开其实就是:

其中假设约定,于是替换成b;则有:

(T是转置)所以有:

这里假设模式线性可分:

线性可分模式下最优超平面的示意图如下:

如上图所示:

  • 为分离边缘,即超平面和最近数据点的间隔。如果一个平面能使最大,则为最优超平面。
  • 灰色的方形点和原形点就是我们所说的支持向量。

假设和向量和偏置的最优解,则最优超平面的函数为:

相应的判别函数是:

以下是点x到最优超平面的二维示意图:

由上图可知r 为点x到最优超平面的距离:

那么代数距离是如何得到的呢?通过将带入

可以得到r,其中:

  • 为x在最优超平面的正轴投影,
  • 因为在平面上

下面给出一种更为简单且直观的理解:

首先我们必须要知道Euclidean norm范数,即欧几里德范数(以下用w表示多维的向量):

再参考点到面的距离公式

也就是

类似的,扩展到多维的w向量也是一样,代数距离r类似于d,而

类似于 ,所以展开后也就是:

对比点平面的公式,以上的r也就多维度空间向量的到最优超平面的距离。

再看上图,如果x = 0 即原点则有

那么是如何得到的呢?很简单,如上面分析的

因为x = 0,它在原点,它与任意可调权值向量w相乘都等于0,于是有:

注意b为偏置,只是决定了决策曲面相对原点的偏离,结合上图我们可知道:

  • b > 0 则原点在最优超平面的正面;
  • b < 0 则原点在最优超平面的负面;
  • b = 0 则原点就在最优超平面上。

找到的这个最优超平面的参数, 于是在样本向量集中, 有一对一定满足(因为是常数,它只是决定了决策曲面相对原点的偏离):

满足上式的点就是则为支持向量,这些点距离决策曲面也就时超平面最近,时最难区分的点。于是根据点到超平面的距离公式:

在超平面的正面和负面我们有任一支持向量满足代数距离:

如果让表示两个分离边缘的最优值,则根据上式有:

所以我们可以看出,如果要使得最大,则就必须使得最小,也就可以总结为:

最大化两个类之间的分离边缘等价于最小化权值向量w的欧几里得范数。

  1. 二次最优化

回头看我们前面提到的,给定一个训练集,我们的需求就是尝试找到一个决策边界使得几何间隔最大,回归到问题的本质那就是我们如何找到这个最大的几何间隔? 要想要最大化间隔(margin),正如上面提到的:

最大化两个类之间的分离边缘等价于最小化权值向量w的欧几里得范数

即:

其中: 也就是前面提到的函数间隔:,回顾几何间隔:,约束条件就是让函数间隔等于几何间隔。

或是将优化的问题转化为以下式子:

其中,就是将函数间隔和几何间隔联系起来。

我们发现以上两个式子都可以表示最大化间隔的优化问题,但是我们同时也发现无论上面哪个式子都是非凸的,并没有现成的可用的软件来解决这两种形式的优化问题。

于是一个行之有效的优化问题的形式被提出来,注意它是一个凸函数形式,如下:

以上的优化问题包含了一个凸二次优化对象并且线性可分,概括来说就是需找最优超平面的二次最优化,这个优化的问题可以用商业的凸二次规划代码来解。

凸函数:

在凸集中任取两个点连成一条直线,这条直线上的点仍然在这个集合内部,左边

凸函数局部最优就是全局最优,而右边的非凸函数的局部最优就不是全局最优了。

下面要具体介绍的拉格朗日对偶性,它可以引导我们到优化问题的对偶形式,因为对偶形式在高维空间有效的运用核(函数)来得到最优间隔分类器的方法中扮演了非常重要的角色。对偶形式让我们得到一个有效的算法来解决上述的优化问题并且相较通用的二次规划商业软件更好。

优化问题的对偶形式的方法简单来说就是通过Lagrange Duality变换到对偶变量 (dual variable)的优化问题之后,应用拉格朗日对偶性,通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:

  • 一是原问题的对偶问题往往更容易求解
  • 二者可以自然的引入核函数,进而推广到非线性分类问题。

支持向量机通俗导论(理解SVM的三层境界)

http://blog.csdn.net/v_july_v/article/details/7624837

SVM-支持向量机原理详解与实践的更多相关文章

  1. HCNP学习笔记之PXE原理详解及实践

    一.PXE简介 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...

  2. I2C 基础原理详解

    今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...

  3. Zigbee组网原理详解

    Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57   [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...

  4. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  5. SSL/TLS 原理详解

    本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...

  6. 锁之“轻量级锁”原理详解(Lightweight Locking)

    大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...

  7. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

  8. 节点地址的函数list_entry()原理详解

    本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...

  9. WebActivator的实现原理详解

    WebActivator的实现原理详解 文章内容 上篇文章,我们分析如何动态注册HttpModule的实现,本篇我们来分析一下通过上篇代码原理实现的WebActivator类库,WebActivato ...

随机推荐

  1. Vue.js_判断与循环

    一.判断,条件语句 1.一元表达式判断 {{ ok ? 'show' : 'hide' }} 2.if判断 v-if='ok' <ol id="ifGrammar"> ...

  2. xmapp开启https

    在开发微信小程序的时候我们需要开启https本地测试,以下我们说明使用xmapp如何开启https访问 1. php中开启ssl 在php的配置文件中把openssl前面的注释去掉, 大概在配置文件的 ...

  3. python基础之类的封装

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 一 封装什么 你钱包的有多少钱(数据的封装) 你的性取向( ...

  4. TCP原理

    1.http://coolshell.cn/articles/11564.html 2.http://coolshell.cn/articles/11609.html 3.一站式学习wireshark ...

  5. 【Oracle】OGG数据初始化之RMAN

    实验环境: 源端.目标端: DataBase:10.2.0.1.0 OS:OEL5.6 OGG:fbo_ggs_Linux_x86_ora11g_32bit 源端使用rman进行备份全库: RMAN& ...

  6. likely(x)与unlikely(x) __builtin_expect

    本文讲的likely()和unlikely()两个宏,在linux内核代码和一些应用中可常见到它们的身影.实质上,这两个宏是关于GCC编译器内置宏__builtin_expect的使用. 顾名思义,l ...

  7. openCV学习——一、Mat类

    一.Mat数据类型 在以下两个场景中使用 OpenCV 时,我们必须事先知道矩阵元素的数据类型: 使用 at 方法访问数据元素的时候要指明数据类型 做数值运算的时候,比如究竟是整数除法还是浮点数除法. ...

  8. this与super关键字总结

    Ⅰ.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法.类里面也有一个引用来访问自己的属性和方法,这个引用就是 this 对象,它可以在类里面 ...

  9. 卸载OpenJDK安装JDK

    卸载OpenJDK安装JDK rpm -qa | grep java rpm -qa | jdk java rpm -qa | grep java| xargs rpm -e --nodeps rpm ...

  10. Ajax传地址URL编码格式

    当我们用Ajax传递路径的时候,有可能会出错,尤其是路径中有汉字的时候,传递的路径与接收的路径不同.解决方法:在传递路径的时候对路径编码,接收的时候解码存入数据库. 如: <!DOCTYPE h ...