机器学习-支持向量机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)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...
随机推荐
- Python之基本排序算法的实现
import cProfile import random class SortAlgorithm: def __init__(self,unsortedlist=[]): self.unsorted ...
- Unity 游戏框架搭建 (二十三) 重构小工具 Platform
在日常开发中,我们经常遇到或者写出这样的代码 var sTrAngeNamingVariable = "a variable"; #if UNITY_IOS || UNITY_AN ...
- Web—05-常用css列表
color 设置文字的颜色,如: color:red; font-size 设置文字的大小,如:font-size:12px; font-family 设置文字的字体,如:font-family:'微 ...
- iOS合并真机和模拟器framework
在实际的项目开发中,我们会碰到某些静态库只能在真机或者模拟器中的一个上可以运行.为了让静态库在模拟器和真机都可以正常的运行,就涉及到如何把一个工程生成的静态库打包以后生成的framework进行合并. ...
- python中 的继承
1.Python的类可以继承多个类,Java和C#中则只能继承一个类. 2.Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先. 当类是经典类时,多继承情况下,会 ...
- <CPP学习 第二天> 字符串的输入 及 String类
今天简单的学习了字符串的输入以及C++的String类. 1.面向行的输入: getline(); getline()函数读取整行,通过回车键输入的换行符来确定输入结尾.要调用这种方法,可以使用cin ...
- 如何创建systemd定时任务
1. 如何创建一个定时任务,通过systemd系统 1. 如何创建一个定时任务,通过systemd系统 1.1. systemd中的timer 1.2. 自定义定时任务 1.2.1. 具体步骤 1.2 ...
- linux下的学习之路下的小困难
centos下源码安装python3wget --no-check-certificate https://www.python.org/ftp/python/3.6.2/Python-3.6.2.t ...
- MYSQL小函数大用途之-------FIND_IN_SET
没有前言和解释,直接看怎么用 当前我所知道两种用法: 第一种:和like的作用有点相似,但用这个函数会比like更准确的查到你想要的数据. 前提是当前的字段满足俩个要求: 类型为字符型. 储存格式为- ...
- PHP基础3--文件加载-错误处理
主要: 1-文件加载 2-错误处理 文件加载 文件加载语句 1) 4个文件加载语句:include, require, include_once, require_once 2) 使用形式 ...