- 简介:支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,
- 原理:基于训练集在样本空间中寻找一个划分超平面,将不同类别的样本分开。
寻找间隔最大的超平面,即:
● 距离计算:点x到超平面(w,b)的距离:
● 间隔计算:两个异类支持向量的差在 w 上的投影,即:
● 由于
和
表示两个正负支持向量,则两点均满足(其中y表示样本的类比当X为正例的时候Y=+1,当X为负例的时候Y=-1):
将y的值分别代入上式,并计算其间隔距离:
● 因此,两点之间的间隔距离为:
;
● 在求最大间隔即:
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求极小值的问题转换为对偶问题:(为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。)
对其约束条件添加拉格朗日乘子a后的拉格朗日函数为:
由于求最小值,即
分别对w,b求偏导等于0得:
最终带回原公式
得:
在对这个函数求解,求解方法有SMO方法,也可以通过求极值方法;
设已知a的值,然后再通过
根据y=wx+b:
- 核函数:
★针对训练集中原始样本空间无法正确划分两类样本空间问题,将样本从原始样本空间映射到一个更高维的特征空间,映射函数为
,使得样本线性可分;
则其对偶函数为:
★针对高维下的特征映射计算即:
xi和xj在高维特征空间的内积通过其在原始样本空间中通过核函数k(xi,xj)计算
常用核函数:
名称 | 表达式 | 参数 |
线性核 | ||
多项式核 | d>1为多项式的次数 | |
高斯核 | 为高斯核的带宽 | |
拉普拉斯核 | ||
Sigmoid核 | Tanh为双曲正切函数,β>0,θ<0 |
- 软间隔
- 问题:超平面无法将不同类样本完全划分开
- 解决方法:允许支持向量机在一些样本出错,即软间隔
★硬间隔:所有样本均满足约束,即所有样本都必须划分正确
★软间隔:允许样本不满足约束条件(最大化间隔的同时不满足约束的样本尽可能少)
因此软间隔优化目标为:C是一个常数, 是“
损失函数”
★当C为无穷大时将迫使所有样本均满足约束,则其优化目标满足约束。当C取有限值时,允许一些样本不满足约束。
然而,
非凸,非连续,数学性质不太好,使得优化函数不易直接求解。因此常用其他一些函数来代替,称为“替代损失”,替代损失函数一般具有较好的数学性质,如它们通常式凸的连续函数且是
的上界。
三种常用的替代损失函数:
若采用hinge损失,则优化函数:
引入“松弛变量”,可将优化函数重写为:
因此软/硬间隔下的对偶问题:
两者位移的差别就是对偶变量的约束不同;
- SVM拓展:支持向量回归SVR
SVR与一般线性回归的区别:
SVR | 一般线性回归 |
数据在间隔带内则不计算损失,当且仅当f(x)与y之间的差距的绝对值大于ϵ 才计算损失 | 只要f(x)与y不相等时,就计算损失 |
通过最大化间隔带的宽度与最小化总损失来优化模型 | 通过梯度下降之后求均值来优化模型 |
- SVM的Sklearn框架实现:
参数 | SVC(软间隔) |
C | 对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。 |
kernel | 核函数有四种内置选择,‘linear’即线性核函数, ‘poly’即多项式核函数, ‘rbf’即高斯核函数, ‘sigmoid’即sigmoid核函数。默认是高斯核'rbf'。 |
degree | 如果在kernel参数使用了多项式核函数‘poly’,那么需要对degree进行调参;此参数对应 中的d,默认值是3,一般需要通过交叉验证选择一组合适的 |
gamma | 如果在kernel参数中使用了多项式核函数‘poly’,高斯函数‘rbf’,或者singmoid核函数,则需对此参数调参; ★多项式核函数中此参数对应 中的 ,一般通过交叉检验选择一组合适的 ;★高斯核函数中此参数对应 中的 ,一般通过交叉检验选择一组合适的 ;★sigmoid核函数中,此参数对应 中的 ,一般通过交叉检验选择一组合适的 ,r; 默认为‘auto’,即‘1/特征维度’ |
coef0 | 如果在kernel参数中使用了多项式核函数‘poly’,或者singmoid核函数,则需对此参数调参; ★多项式核函数中此参数对应 中的 ,一般通过交叉检验选择一组合适的 ;★sigmoid核函数中,此参数对应 中的 ,一般通过交叉检验选择一组合适的 ,r; coef0默认为0 |
class_weight | 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None"; |
cache_size | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB. |