1. 简介:支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,
  2. 原理:基于训练集在样本空间中寻找一个划分超平面,将不同类别的样本分开。 

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式

 

 

寻找间隔最大的超平面,即:

●  距离计算:点x到超平面(w,b)的距离:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_02

●  间隔计算:两个异类支持向量的差在 w 上的投影,即:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_支持向量机_03

● 由于

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_04


李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_05

表示两个正负支持向量,则两点均满足(其中y表示样本的类比当X为正例的时候Y=+1,当X为负例的时候Y=-1):

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_06

将y的值分别代入上式,并计算其间隔距离:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_07

●  因此,两点之间的间隔距离为:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_核函数_08


 

● 在求最大间隔即:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_09 max(||\omega ||^{-1})\: \: --> min(\frac{1}{2}||\omega ||^{2})" title="max(\frac{2}{||\omega ||})\: \: --> max(||\omega ||^{-1})\: \: --> min(\frac{1}{2}||\omega ||^{2})" style="width: 443px; visibility: visible;" data-type="block">

●  SVM求极小值的问题转换为对偶问题:(为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。)

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_10

对其约束条件添加拉格朗日乘子a后的拉格朗日函数为:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_11

由于求最小值,即

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_12

分别对w,b求偏导等于0得:    

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_13

                        最终带回原公式

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_12

得:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_15

在对这个函数求解,求解方法有SMO方法,也可以通过求极值方法;

设已知a的值,然后再通过

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_支持向量机_16

根据y=wx+b:                 

 

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_17

  1.  核函数:

★针对训练集中原始样本空间无法正确划分两类样本空间问题,将样本从原始样本空间映射到一个更高维的特征空间,映射函数为

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_18

,使得样本线性可分;

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_19

则其对偶函数为:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_20

★针对高维下的特征映射计算即:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_21

xi和xj在高维特征空间的内积通过其在原始样本空间中通过核函数k(xi,xj)计算

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_22

 

常用核函数:

名称

表达式

参数

线性核

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_23



多项式核

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_支持向量机_24

d>1为多项式的次数

高斯核

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_25

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_26

为高斯核的带宽

拉普拉斯核

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_27

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_26

Sigmoid核

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_29

Tanh为双曲正切函数,β>0,θ<0

  1.  软间隔
  • 问题:超平面无法将不同类样本完全划分开
  • 解决方法:允许支持向量机在一些样本出错,即软间隔

★硬间隔:所有样本均满足约束,即所有样本都必须划分正确

★软间隔:允许样本不满足约束条件(最大化间隔的同时不满足约束的样本尽可能少)

因此软间隔优化目标为:C是一个常数, 是“

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_30

损失函数”

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_31

★当C为无穷大时将迫使所有样本均满足约束,则其优化目标满足约束。当C取有限值时,允许一些样本不满足约束。

然而,

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_32

非凸,非连续,数学性质不太好,使得优化函数不易直接求解。因此常用其他一些函数来代替,称为“替代损失”,替代损失函数一般具有较好的数学性质,如它们通常式凸的连续函数且是

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_支持向量机_33

的上界。

三种常用的替代损失函数:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_34

若采用hinge损失,则优化函数:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_35

引入“松弛变量”,可将优化函数重写为:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_36

因此软/硬间隔下的对偶问题:

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_python_37

两者位移的差别就是对偶变量的约束不同;

  1. SVM拓展:支持向量回归SVR

SVR与一般线性回归的区别:

SVR

一般线性回归

数据在间隔带内则不计算损失,当且仅当f(x)与y之间的差距的绝对值大于ϵ 才计算损失

只要f(x)与y不相等时,就计算损失


通过最大化间隔带的宽度与最小化总损失来优化模型

通过梯度下降之后求均值来优化模型


李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_38

 

  1. SVM的Sklearn框架实现:

参数

SVC(软间隔)

C

对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。

kernel

核函数有四种内置选择,‘linear’即线性核函数, ‘poly’即多项式核函数, ‘rbf’即高斯核函数, ‘sigmoid’即sigmoid核函数。默认是高斯核'rbf'。

degree

如果在kernel参数使用了多项式核函数‘poly’,那么需要对degree进行调参;此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_39

 中的d,默认值是3,一般需要通过交叉验证选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_40


gamma

如果在kernel参数中使用了多项式核函数‘poly’,高斯函数‘rbf’,或者singmoid核函数,则需对此参数调参;

★多项式核函数中此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_39

 中的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,一般通过交叉检验选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_40

;★高斯核函数中此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_44

中的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,一般通过交叉检验选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

;★sigmoid核函数中,此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_47

 中的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,一般通过交叉检验选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,r;

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

 默认为‘auto’,即‘1/特征维度’


coef0

如果在kernel参数中使用了多项式核函数‘poly’,或者singmoid核函数,则需对此参数调参;

★多项式核函数中此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_39

 中的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,一般通过交叉检验选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_40

;★sigmoid核函数中,此参数对应  

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_李航 支持向量机 硬间隔支持向量机_47

 中的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,一般通过交叉检验选择一组合适的

李航 支持向量机 硬间隔支持向量机 支持向量机怎么算_多项式_42

,r;

coef0默认为0


class_weight

指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None";

cache_size

在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB.