简介:

支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型。他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的超平面将数据划分开。所以感知机的超平面可以有无数个,但是SVM的超平面只有一个。此外,SVM在引入核函数之后可以处理非线性问题。

SVM根据数据的不同可以分为以下三种形式:

1.线性可分支持向量机,也叫做硬间隔支持向量机,处理的数据是线性可分的,通过硬间隔最大化来学习一个线性可分的模型。

2.线性支持向量机,也叫做软间隔支持向量机,当数据近似线性可分时,通过引入松弛因子,软间隔最大化学习一个线性可分的模型。

3.非线性支持向量机,当数据线性不可分时,通过引入核函数将数据映射到高维空间后,学习得到一个非线性支持向量机。

线性可分支持向量机

考虑一个二分类问题,当数据可以在分布空间中通过一个超平面将正负样例分割开,一面为正类,一面为负类,我们就称数据是线性可分,这个分离超平面的方程为:w*x+b=0。而在线性可分数据中存在着无数个超平面可以将数据分割开(参考感知机),我们要找到其中最好的超平面,这个超平面不仅可以将训练集数据很好的划分开,还有更好的泛化能力。下图中很显然直线B是最好的一条分割线,所以选择间隔最大的一个超平面作为我们需要的最优的超平面。

图1

求解超平面w*x+b=0就是求w和b,以及对应的分类决策函数f(x)=sign(w*x+b),称之为线性可分支持向量机。

根据点到直线距离公式:

图2

其中A为w向量,C为b,因为超平面的y值为0,所以对于支持向量机的点到超平面距离可以写作:

图3

又因为w*x+b的边界为正负1,两个边界到超平面的距离和γ等于2倍的r,所以图3又可以写作:

图4

这就是几何间隔。下图是支持向量机的各个概念图:

图5

当数据点为正类时,其y=+1,w*x+b>=+1,当数据点为负类时y=-1,w*x+b<=-1,所以y*(w*x+b)始终大于等于1,其中y*(w*x+b)成为函数间隔。

要找到间隔最大的超平面,也就是要找到满足y*(w*x+b)>=1约束条件的参数w和b,使得γ最大。即:

图6

显然为了最大化间隔,仅需最大化||w||,这等价于最小化||w||的2次方,所以可以重写为:

图7

其中目标函数和约束函数都是连续可微的凸函数,并且目标函数是二次函数,约束函数是仿射函数,所以该约束问题是一个凸二次规划问题。

求解凸二次规划约束问题常用的办法是引入拉格朗日乘子,通过求解对偶问题得到原始问题的解。这就是线性可分支持向量机的对偶算法。

首先定义拉格朗日函数,对每个不等式约束引入拉格朗日乘子αi>=0,i=1,2,3....n.拉格朗日函数为:

图8

这样就把带有约束问题的求极值问题转为无约束求极值问题,接下来根据拉格朗日对偶性求解原始问题的对偶问题:

图9

以上就是求解线性可分支持向量机的全部过程,求解得到w和b之后就可以得到分类超平面:

图10

以及分类决策函数:

图11

根据图9中w*和b*的结果可以看出,w*和b*只依赖于αi>0对应的(xi,yi)样本点,这些样本点称为支持向量。

线性支持向量机

当数据近似线性可分时,也就是说数据中存在噪声点,我们通过引入松弛因子,使函数间隔加上松弛因子ξ后大于等于1,这样约束条件就变成:

图12

对于每个松弛因子ξi需要支付一个代价,所以目标函数也就是代价函数变为:

图13

其中C>0称为惩罚参数,是超参数需要我们手动调参,C值越大时对误分类的惩罚增大,支持向量机的间隔宽度越窄,C值越小时对误分类的惩罚越小,支持向量机的间隔宽度越宽。而ξ的几何意义代表着,误分类数据点离正确分类一侧的距离,是几何距离。

那么这个松弛因子ξ是怎么来的呢?因为数据是近似可分的存在着许多噪音点,所以当计算代价函数时,这些误分类点要算入代价函数中去。这些误分类点的函数间隔y*(w*x+b)<=-1,所以代价函数可以写成带有0/1损失函数的集合函数,就是当数据点的函数间隔减去1小于0的话(误分类点),需要计算入代价函数,数据点的函数间隔减去1大于0的话(正确分类点),不需要计算入代价函数:

图14

但是0/1损失函数的数学性质不好,非凸非连续性。所以一般使用他的代替损失函数“hinge损失max(0,1-z)”代替它,则代价函数也就是目标函数变为:

图15

用ξ替代max部分,就是ξ<=1-y*(w*x+b),所以带有约束条件的目标(代价)函数就变为下面的形式:

图16

所以SVM的损失函数也可以看作是带有L2正则项(||w||^2)的hinge损失函数。以上就是线性支持向量机的带有约束条件的优化目标函数,求解w和b的过程与线性可分的方法一致,都是通过引入拉格朗日乘子,这里不再重复。其中一些列需要满足的约束条件称为KKT条件。

非线性支持向量机

当数据样本非线性可分时,也就是在当前的数据空间内(或者说当前维度内)无法找到一个超平面将数据分割开,那么需要我们将数据从当前的维度映射到更高维度后,使数据变成线性可分的,而将数据映射到高维的函数称之为核函数。

为什么在SVM求解带有约束条件的最优化问题时我们使用引入拉格朗日乘子方法,一是因为求解简单,二是可以很方便的引入核函数K(x,z)。

通过引入核函数之后,对偶问题的目标函数就变成:

图17

最后求解出w*和b*之后的决策分类函数:

图18

这样通过核函数的引入,可以用求解线性支持向量机的方法求解非线性支持向量机。学习是隐式的,不是了解核函数是如何计算以及数据到底被映射到哪一维空间的,但是需要我们手动的选择核函数。常用的核函数有:

多项式核:

图19

高斯核(径向基核):

图20

线性核,sigmoid核以及其他核函数等。通常使用先验知识或者交叉验证的方式选择核函数,但是如果无先验知识的情况下,一般选择高斯核。为什么选择高斯核呢?因为可以将数据映射到无穷维空间。

SMO序列最小最优化

该学习方法是为了简单求解SVM中的参数的一个算法,并不是很重要(调包侠^-^),所以没有很详细的看,以后有时间看完再更新到本文中。

待更新。。

参考书籍:

《统计学习方法》李航 著

《机器学习》 周志华  著

机器学习-支持向量机SVM的更多相关文章

  1. 机器学习——支持向量机SVM

    前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...

  2. 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...

  3. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  4. coursera机器学习-支持向量机SVM

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  5. 机器学习——支持向量机(SVM)

    支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...

  6. 机器学习支持向量机SVM笔记

    SVM简述: SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机.SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后 ...

  7. 机器学习——支持向量机(SVM)之核函数(kernel)

    对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...

  8. 机器学习——支持向量机(SVM)之Platt SMO算法

    Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...

  9. 机器学习:Python中如何使用支持向量机(SVM)算法

    (简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...

随机推荐

  1. 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f12-dash/ 本文出自方志朋的博客 在我的第四篇文章断路 ...

  2. Oracle 体系结构二 内存结构

    Oracle实例由共享内存块(SGA)以及大量的后台进程构成. SGA必须包含的数据结构: 数据库缓冲区缓存 日志缓冲区 共享池 可选的数据结构: 大池 JAVA池 流池 其他缓冲区缓存池 用户会话还 ...

  3. Deepin深度Linux系统安装记录

    测试设备:小米游戏本,最新版15.6进入安装后发现黑屏,所以使用15.5安装 Deepin 15.5 官方介绍页 官方下载 百度云下载 下载后得到文件夹15.5 Release 将里面的ISO镜像文件 ...

  4. python多线程知识-实用实例

    python多线程使用场景:IO操作,不适合CPU密集操作型任务   1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...

  5. Oracle批量删除表格数据

    在开发阶段往Oracle数据库中多个表格中导入了许多测试数据,倘若一张张表执行"truncate table tablename"语句显得十分繁琐.在PL/SQL中可以用代码进行批 ...

  6. Enable directory listing on Nginx Web Server

    1:Test environment [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core ...

  7. MySQL---数据表基本操作(增删改查、排序、分组、连表)

    一.表操作 1.创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 是否可空,nul ...

  8. Tornado用户指引(一)-----------异步和非阻塞I/O

    摘要:异步和非阻塞I/O实时WEB的特性是经常需要为每个用户端维持一个长时间存活但是大部分时候空闲的连接.在传统的同步式web服务器中,这主要通过为每个用户创建一个线程来实现,这样的代价是十分昂贵的. ...

  9. Git 学习笔记–基本操作

    Git 与 SVN 不同,是分布式的版本控制系统,不需要主服务器即可工作,实际中为了方便各个工作者间同步工作,通常还是会设置主服务器. Git的设置及初始化: 设置全局用户信息: luojiahu@u ...

  10. PHP基础1--环境搭建

    主要: 环境搭建 站点配置 环境搭建 web运行流程: 1. 浏览器输入地址,回车(发送请求) 2. 根据规则找到对应web服务器.规则如下: 首先在本机hosts文件中找对应IP hosts位置: ...