机器学习-支持向量机SVM
简介:
支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型。他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的超平面将数据划分开。所以感知机的超平面可以有无数个,但是SVM的超平面只有一个。此外,SVM在引入核函数之后可以处理非线性问题。
SVM根据数据的不同可以分为以下三种形式:
1.线性可分支持向量机,也叫做硬间隔支持向量机,处理的数据是线性可分的,通过硬间隔最大化来学习一个线性可分的模型。
2.线性支持向量机,也叫做软间隔支持向量机,当数据近似线性可分时,通过引入松弛因子,软间隔最大化学习一个线性可分的模型。
3.非线性支持向量机,当数据线性不可分时,通过引入核函数将数据映射到高维空间后,学习得到一个非线性支持向量机。
线性可分支持向量机
考虑一个二分类问题,当数据可以在分布空间中通过一个超平面将正负样例分割开,一面为正类,一面为负类,我们就称数据是线性可分,这个分离超平面的方程为:w*x+b=0。而在线性可分数据中存在着无数个超平面可以将数据分割开(参考感知机),我们要找到其中最好的超平面,这个超平面不仅可以将训练集数据很好的划分开,还有更好的泛化能力。下图中很显然直线B是最好的一条分割线,所以选择间隔最大的一个超平面作为我们需要的最优的超平面。

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

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

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

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

当数据点为正类时,其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,使得γ最大。即:

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

其中目标函数和约束函数都是连续可微的凸函数,并且目标函数是二次函数,约束函数是仿射函数,所以该约束问题是一个凸二次规划问题。
求解凸二次规划约束问题常用的办法是引入拉格朗日乘子,通过求解对偶问题得到原始问题的解。这就是线性可分支持向量机的对偶算法。
首先定义拉格朗日函数,对每个不等式约束引入拉格朗日乘子αi>=0,i=1,2,3....n.拉格朗日函数为:

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

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

以及分类决策函数:

根据图9中w*和b*的结果可以看出,w*和b*只依赖于αi>0对应的(xi,yi)样本点,这些样本点称为支持向量。
线性支持向量机
当数据近似线性可分时,也就是说数据中存在噪声点,我们通过引入松弛因子,使函数间隔加上松弛因子ξ后大于等于1,这样约束条件就变成:

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

其中C>0称为惩罚参数,是超参数需要我们手动调参,C值越大时对误分类的惩罚增大,支持向量机的间隔宽度越窄,C值越小时对误分类的惩罚越小,支持向量机的间隔宽度越宽。而ξ的几何意义代表着,误分类数据点离正确分类一侧的距离,是几何距离。
那么这个松弛因子ξ是怎么来的呢?因为数据是近似可分的存在着许多噪音点,所以当计算代价函数时,这些误分类点要算入代价函数中去。这些误分类点的函数间隔y*(w*x+b)<=-1,所以代价函数可以写成带有0/1损失函数的集合函数,就是当数据点的函数间隔减去1小于0的话(误分类点),需要计算入代价函数,数据点的函数间隔减去1大于0的话(正确分类点),不需要计算入代价函数:

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

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

所以SVM的损失函数也可以看作是带有L2正则项(||w||^2)的hinge损失函数。以上就是线性支持向量机的带有约束条件的优化目标函数,求解w和b的过程与线性可分的方法一致,都是通过引入拉格朗日乘子,这里不再重复。其中一些列需要满足的约束条件称为KKT条件。
非线性支持向量机
当数据样本非线性可分时,也就是在当前的数据空间内(或者说当前维度内)无法找到一个超平面将数据分割开,那么需要我们将数据从当前的维度映射到更高维度后,使数据变成线性可分的,而将数据映射到高维的函数称之为核函数。
为什么在SVM求解带有约束条件的最优化问题时我们使用引入拉格朗日乘子方法,一是因为求解简单,二是可以很方便的引入核函数K(x,z)。
通过引入核函数之后,对偶问题的目标函数就变成:

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

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

高斯核(径向基核):

线性核,sigmoid核以及其他核函数等。通常使用先验知识或者交叉验证的方式选择核函数,但是如果无先验知识的情况下,一般选择高斯核。为什么选择高斯核呢?因为可以将数据映射到无穷维空间。
SMO序列最小最优化
该学习方法是为了简单求解SVM中的参数的一个算法,并不是很重要(调包侠^-^),所以没有很详细的看,以后有时间看完再更新到本文中。
待更新。。
参考书籍:
《统计学习方法》李航 著
《机器学习》 周志华 著
机器学习-支持向量机SVM的更多相关文章
- 机器学习——支持向量机SVM
前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...
- 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...
- 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析
SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...
- coursera机器学习-支持向量机SVM
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- 机器学习——支持向量机(SVM)
支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...
- 机器学习支持向量机SVM笔记
SVM简述: SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机.SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后 ...
- 机器学习——支持向量机(SVM)之核函数(kernel)
对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...
- 机器学习——支持向量机(SVM)之Platt SMO算法
Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...
- 机器学习:Python中如何使用支持向量机(SVM)算法
(简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...
随机推荐
- 协议类接口 - SPI
一.SPI概述 SPI(Serial Peripheral Interface,串行外设接口)总线系统是一种同步串行外设接口,它可以使CPU与各种外围设备以串行方式进行通信以交换信息.一般主控SoC ...
- Unity 游戏框架搭建 (二十一) 使用对象池时的一些细节
上篇文章使用SafeObjectPool实现了一个简单的Msg类.代码如下: class Msg : IPoolAble,IPoolType { #region IPoolAble 实现 public ...
- 08.nextcloud搭建
由于公司用的nfs文件共享系统满足不了权限需求,测试nextcloud是否符合要求 参考博客: https://www.cnblogs.com/davidz/articles/9686716.html ...
- Jquery中绑定事件与普通事件的区别
(“#panel”).bind(“click”,function(){ 与$(“#panel”).click(function(){ 有什么区别 ? 绑定可以同时加多个事件 如:$(“#panel”) ...
- $.extend() 合并问题
- 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情
1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...
- while do while switch语句的简要分析
1 //// while是C语言的一个关键字,其后是使用一个小括号中的条件表达式来做为执行循环的条件, 2 ////也就是说当条件表达式的结果为真时执行大括号里面的的程序内容, 3 ////而当条件表 ...
- idea自动生成方法注释(含参数及返回值)
参考 https://blog.csdn.net/u014044812/article/details/76577479
- go内建容器-Map
1.基础定义 golang中的map如同它的函数一样"纯粹",map就是用来存储键值对的容器,别管什么哈希不哈希的(底层已实现),用就行 //创建一个map m := map[st ...
- msys2-x86_64 Mingw64 编译openssl
windows 刚开始编译时提示找不到gcc 添加环境变量export PATH=$PATH:/mingw64/bin$source /etc/profile 将openssl源码复制到C:\msys ...