简单理解 SVM

SVM,中文名叫支持向量机。

在深度学习出现以前,它是数据挖掘的宠儿;

SVM具有十分完整的数据理论证明,但同时理论也相当复杂。

初识SVM 

同其他分类算法一样,SVM分类也是寻找合适的决策边界,为方便理解,以二分类为例。

假设存在二分类样本,我们一定可以找到一个超平面将类别分开,但是通常会存在很多这样的超平面。

那取哪个呢?

直观感受

直观来看,应该取中间那条粗线,因为这条线对样本的“容忍性”最好,也就是说样本发生微小变化,不会影响分类结果,但是其他细线,如果样本发生微小变化,都会使得分类结果发生变化,也就是说粗线作为决策边界,其鲁棒性最好。

数学解释

从直观上看,取粗线为宜,但是这条粗线有很多的平行线,都可以实现分类,那么怎么取呢?

我们把这条粗线向两边平移,直至粗线和两边离他最近的样本重合,此时生成了2个新的超平面,记为 b11,b12,然后我们可以把之前的粗线移动到b11和b12的中间,确保粗线到b11和b12的距离相等

假设我们有两条粗线B1,B2,分别完成上述操作,

b11和b12之间的距离,叫做B1这条决策边界的边际(margin),也有叫“间隔”,记为d,当然也有把b11和B1的距离叫边际的,无所谓,不影响理论

显然拥有更大的边际的决策边界泛化能力更强

与b11和b12相交的样本点叫支持向量

数学建模

如何找到具有最大边际的决策边界呢?

假设这个超平面为 wx+b=0

超平面上取两点x1,x2,则

wx1+b=0

wx2+b=0

w(x1-x2)=0,故w与x1-x2垂直,即w为超平面的法向量。

超平面外任意点到平面的距离为

此时把支持向量带入上式,即可得到

d=2r,带有绝对值,不好处理。

解释

1. 上图把超平面的表达形式稍微变化了一下,而且进行了一系列的推导

2. 其实最开始也有解释,如果向两侧平移不同距离,那么应该先调整决策边界到两个新平面的中间,此时3个平面的wb都要做调整。

3. 上图是许多资料未讲明的地方

4. 上图是个变换过程,如果二分类的标签不是-1 1,也可以变换成-1 1

上图的结论是

假设是二分类,那么决策边界 wx+b=0 向两侧平移1,可得

等号成立的条件就是支持向量,此时 |wx+b|=1,那么

这就是边际d。

欲使边际最大,就是 maxd

注意,在训练过程中,我们使用的是全部样本,而不单是支持向量,而全部样本存在约束

综合表示就是 y(wx+b)>1,

那么目标为

最大转换为最小,方便计算

w加了平方,也是方便计算,不影响,w最小,w平方也就最小

以上就是SVM的基础理论。

拉格朗日乘子与对偶问题

其实上面的目标函数已经是个凸函数,可以用梯度下降等优化算法来求解,但是SVM使用了另一种优化算法,即拉格朗日对偶函数,

这部分比较麻烦,如果你不是专门研究SVM,没必要太纠结这块,因为即使你弄明白了,过一段时间就会忘记。

核函数

上面讲到用超平面来划分样本,但现实中很多问题是线性不可分的,此时不存在可划分类别的超平面。

对于这样的问题,需要将样本从原始空间映射到一个更高维的空间,使得样本在新的特征空间线性可分。

如果原始空间有限,那么一定存在一个高维空间使得样本可分。

这种映射其实就是一个函数,我们称之为核函数。

常用的核函数有

 

一般情况下会先用高斯核试试,但经验告诉我们,文本一般使用线性核。

核函数的计算也是可以简化的

软间隔与正则化

SVM总是在寻找超平面使得样本能够完全被分开,但是由于现实中数据杂质很多,完全分开很容易造成过拟合。

缓解这个问题的思路就是允许部分样本被错误划分,于是提出了“软间隔”的概念(相对有“硬间隔”的概念)

可以看到红色样本被错误划分

此时的红色样本实际为1(-1),预测为-1(1),已经不满足 y(wx+b)>1的约束条件,

那对应我们的目标函数怎么改呢?去掉约束吗?显然不能

在分类时,我们虽然容忍部分样本被错误划分,但是我们希望被错误划分的样本越少越好,也就是说我们希望大部分样本仍然满足约束条件。

目标函数可改为

C是个>0的常数,也就是正则项系数,这里叫容忍系数

l0/1是“0/1损失函数”

当样本被错误分类时,y(wx+b)<0,y(wx+b)-1<0,l0/1=1,

当样本被正确分类时,l0/1=0

要使目标函数最小,就要使后面那部分最小,然而当样本被错误划分时,后面为1,如果C很大,那么后面那部分就很大,显然不符合我们的目标,所以需要1尽可能少,也就是错误划分尽可能少。

当C无穷大时,就是不能错误划分,后面那部分是0,目标函数最小,也就是“硬间隔”。

所以C越大,模型越“精确”

由于l0/1函数非凸,非连续,数学性质不太好,所以要用其他函数来替代它,称为“替代损失”

三种常用的替代损失函数

总结

SVM的理论十分复杂,上面只是介绍了冰山一角,有助于你在实际项目中完成调参工作。

参考资料:

周志华 《机器学习》

原文地址:https://www.cnblogs.com/yanshw/p/10681109.html

时间: 2024-11-10 00:00:52

简单理解 SVM的相关文章

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

作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末参考链接),但在描述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整概括和介

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

支持向量机通俗导论(理解SVM的三层境地) 作者:July :致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因非常简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末參考链接),但在描写叙述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通

php类的封装、继承和多态的简单理解

.面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象: 我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性  封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作.  php提供了三种访问控制修饰符  public 表示全局,本类内部,类外部,子类都可以访问  protected 表示受保护的,只有本类或子类可以访问  pr

简单理解计算机通信

简单理解计算机通信 写在前面: 在计算机刚出现的时候,只能在本机进行一些运算处理,想将一台计算机中的数据转移到另一台计算机中,需要通过外部存储介质来传输,例如磁带.软盘.而网络技术的出现,使得计算机间可以通过一些传输介质(网线.光纤等),实现快速的数据传输和信息交互.如今,网络已无处不在,那么,计算机之间究竟是如何通信的呢?下面会通过一些基础的网络知识来简单理解计算机之间的通信过程. 网络通信模型: 网络通信模型是一种概念模型和框架,旨在使各种计算机在世界范围内互连为网络.其中有OSI七层模型和

Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,

回溯法之八皇后问题简单理解

回溯法,简单理解就是有源可溯.基本思想要借鉴穷举法,但是它不是一味地穷举,当发现某一步不符合条件时,这一步后面的穷举操作就不进行了(俗称“剪枝”),我自己把它叫做动态穷举法.假设第一个步骤可行,那么执行第二个步骤,第三个......如果其中第三个步骤不行,那么我们再回过来(回溯),第二个步骤换一种方法尝试,然后再重新第三个步骤,第四个......直到完成任务要求为止. 这里,以八皇后问题为例.试图把回溯法讲清楚. 注意:递归应该是一种算法结构,回溯法是一种算法思想. 何为八皇后问题? (百度百科

Javascript闭包简单理解

提到闭包,想必大家都早有耳闻,下面说下我的简单理解.说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和组件或多或少用到了闭包.所以,了解闭包是非常必要的.呵呵... 一.什么是闭包简而言之,就是能够读取其他函数内部变量的函数.由于JS变量作用域的特性,外部不能访问内部变量,内部可以外部变量. 二.使用场景1. 实现私有成员.2. 保护命名空间,避免污染全局变量.3. 缓存变量. 先看一个封装的例子: var person = function () { // 变量作用域为函

对数据类型封装和数据抽象的简单理解

请特别关注程序设计技术,而不是各种语言特征. --<C++程序设计语言> Bjarne Stroustrup 本文是<C++程序设计语言>(Bjarne Stroustrup )的第二章的读书笔记,例子来源于这本书的第二章. 在程序设计之中,我们倾向于将数据结构(也可以说是数据类型)以及一组对其操作的相关过程组织在一起,在逻辑上可以称将其为模块.此时程序分为一些模块,模块包括一组对数据的操作,数据隐藏于模块之中.以下以栈的设计为例,使用C和C++进行设计,简单理解模块化设计中的数据

Java实现简单版SVM

最近的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,因为没有用到拉格朗日,对偶,核函数等等.而是用最简单的梯度下降法求解.其中的数学原理我参考了http://blog.csdn.net/lifeitengup/article/details/10951655,文中是用matlab实现的svm. 源代码和数据集下载:https://github.com/linger2012/simpleSvm 其中数据集来自于libsvm,我找了其中