目录
1. SVM算法简介
1.1 SVM 算法导入
2 SVM算法定义
2.1 定义
2.2 超平面最大间隔介绍
2.3 硬间隔和软间隔
2.3.1 硬间隔
2.3.2 软间隔分类
2.4 小结
3 SVM算法原理
3.1 定义输入数据
3.2 线性可分支持向量机
3.3 SVM的计算过程与算法步骤
3.3.1 推导目标函数
3.4 目标函数的求解
3.4.1 拉格朗日乘子法
3.4.2 对偶问题
4 举例
5 SVM的损失函数
6 SVM的核方法
6. 1 什么是核函数
6.1.1 核函数概念
6.2 核函数举例
6.2.1 核方法举例1:
6.1.2 核方法举例2 :
6.2 常见核函数
7 SVM回归
8 SVM算法api介绍
8.1 SVM算法api综述
8.2 SVC
8.3 NuSVC
8.4 LinearSVC
9 案例:数字识别器
9.1 案例背景介绍
9.2 数据介绍
9.2 案例实现
10 SVM总结
10.1 SVM 基本综述
10.2 SVM优缺点
在很久以前的情⼈节, ⼤侠要去救他的爱⼈, 但魔⻤和他玩了⼀个游戏。
魔⻤在桌⼦上似乎有规律放了两种颜⾊的球, 说:
“你⽤⼀根棍分开它们? 要求: 尽量在放更多球之后, 仍然适⽤。 ”
于是⼤侠这样放, ⼲的不错?
然后魔⻤, ⼜在桌上放了更多的球, 似乎有⼀个球站错了阵营。
怎么办? ?
把分解的⼩棍⼉变粗。
SVM就是试图把棍放在最佳位置, 好让在棍的两边有尽可能⼤的间隙。
然后, 在SVM ⼯具箱中有另⼀个更加重要的技巧( trick) 。 魔⻤看到⼤侠已经学会了⼀个trick, 于是魔⻤给了⼤侠⼀个新的挑战。
现在, ⼤侠没有棍可以很好帮他分开两种球了, 现在怎么办呢?当然像所有武侠⽚中⼀样⼤侠桌⼦⼀拍, 球⻜到空中。 然后, 凭借⼤侠的轻功, ⼤侠抓起⼀张纸, 插到了两种球的中
间。
现在, 从魔⻤的⻆度看这些球, 这些球看起来像是被⼀条曲线分开了。
球—— 「data」 数据
棍⼦—— 「classifier」 分类
最⼤间隙——「optimization」 最优化
拍桌⼦——「kernelling」 核⽅法
纸——「hyperplane」 超平⾯
案例来源: http://bytesizebio.net/2014/02/05/support-vector-machines-explained-well/
SVM: SVM全称是supported vector machine(⽀持向量机) , 即寻找到⼀个超平⾯使样本分成两类, 并且间隔最⼤。
SVM能够执⾏线性或⾮线性分类、 回归, 甚⾄是异常值检测任务。 它是机器学习领域最受欢迎的模型之⼀。 SVM特别适⽤于中⼩型复杂数据集的分类。
上左图显示了三种可能的线性分类器的决策边界:
虚线所代表的模型表现⾮常糟糕, 甚⾄都⽆法正确实现分类。 其余两个模型在这个训练集上表现堪称完美, 但是它们的
决策边界与实例过于接近, 导致在⾯对新实例时, 表现可能不会太好。
右图中的实线代表SVM分类器的决策边界, 不仅分离了两个类别, 且尽可能远离最近的训练实例。
在上⾯我们使⽤超平⾯进⾏分割数据的过程中, 如果我们严格地让所有实例都不在最⼤间隔之间, 并且位于正确的⼀边, 这就是硬间隔分类。
硬间隔分类有两个问题, ⾸先, 它只在数据是线性可分离的时候才有效; 其次, 它对异常值⾮常敏感。
当有⼀个额外异常值的鸢尾花数据: 左图的数据根本找不出硬间隔, ⽽右图最终显示的决策边界与我们之前所看到的⽆异常值时的决策边界也⼤不相同, 可能⽆法很好地泛化。
要避免这些问题, 最好使⽤更灵活的模型。 ⽬标是尽可能在保持最⼤间隔宽阔和限制间隔违例(即位于最⼤间隔之上,甚⾄在错误的⼀边的实例) 之间找到良好的平衡, 这就是软间隔类。。
在Scikit-Learn的SVM类中, 可以通过超参数C来控制这个平衡: C值越⼩, 则间隔越宽, 但是间隔违例也会越多。 上图显示了在⼀个⾮线性可分离数据集上, 两个软间隔SVM分类器各⾃的决策边界和间隔。
左边使⽤了⾼C值, 分类器的错误样本(间隔违例) 较少, 但是间隔也较⼩。
右边使⽤了低C值, 间隔⼤了很多, 但是位于间隔上的实例也更多。 看起来第⼆个分类器的泛化效果更好, 因为⼤多数间隔违例实际上都位于决策边界正确的⼀边, 所以即便是在该训练集上, 它做出的错误预测也会更少。
寻找到一个超平面使样本分成两类,并且间隔最大
硬间隔
1.只有在数据使线性可分离的时候才有效
2. 对异常值非常敏感
软间隔
尽可能在保持最大间隔宽阔和间隔违例之间找到良好的平衡
⾄于为什么正负⽤(-1, 1) 表示呢?
其实这⾥没有太多原理, 就是⼀个标记, 你也可以⽤(2, -3)来标记。 只是为了⽅便, 的过程中刚好可以相等, 便于之后的计算。 )
给定了上⾯提出的线性可分训练数据集, 通过间隔最⼤化得到分离超平⾯为 :
相应的分类决策函数为:
以上决策函数就称为线性可分⽀持向量机。
这⾥解释⼀下这个东东。
这是某个确定的特征空间转换函数, 它的作⽤是将x映射到更⾼的维度, 它有⼀个以后我们经常会见到的专有称号”核函数“。
以上就是线性可分⽀持向量机的模型表达式。 我们要去求出这样⼀个模型, 或者说这样⼀个超平⾯y(x),它能够最优地分离两个集合
其实也就是我们要去求⼀组参数(w,b),使其构建的超平⾯函数能够最优地分离两个集合。
如下就是⼀个最优超平⾯: 又比如说这样:阴影部分是⼀个“过渡带”, “过渡带”的边界是集合中离超平⾯最近的样本点落在的地⽅。
我们知道了⽀持向量机是个什么东⻄了。 现在我们要去寻找这个⽀持向量机, 也就是寻找⼀个最优的超平⾯。于是我们要建⽴⼀个⽬标函数。 那么如何建⽴呢?
再来看⼀下我们的超平⾯表达式:
为了⽅便我们让:Φ(x) = x
则在样本空间中, 划分超平⾯可通过如下线性⽅程来描述:
欲找到具有最⼤间隔的划分超平⾯, 也就是要找到能满⾜下式中约束的参数w和b, 使得γ最⼤。
即:
到这⼀步, 终于把⽬标函数给建⽴起来了。
那么下⼀步⾃然是去求⽬标函数的最优值.
因为⽬标函数带有⼀个约束条件, 所以我们可以⽤拉格朗⽇ 乘⼦法求解
啥是拉格朗日乘子法?
拉格朗日(Lagrange multipliers)是⼀种寻找多元函数在⼀组约束下的极值的⽅法.
通过引⼊拉格朗日乘⼦, 可将有 d 个变量与 k 个约束条件的最优化问题转化为具有 d + k 个变量的无约束优化问题求解。
本⽂希望通过⼀个直观简单的例⼦尽⼒解释拉格朗⽇ 乘⼦法和KKT条件的原理
我们可以直观的从图中得到,
- 对于约束 1) 使⽬标值f(x)最⼩的最优解是x=-2;
- 对于约束 2) 使⽬标值f(x)最⼩的最优解是x=-1。
下⾯我们⽤拉格朗⽇ 乘⼦来求解这个最优解。
当没有约束的时候, 我们可以直接令⽬标函数的导数为0, 求最优值。
可现在有约束, 那怎么边考虑约束边求⽬标函数最优值呢?
- 最直观的办法是把约束放进⽬标函数⾥, 由于本例中只有⼀个约束, 所以引⼊⼀个朗格朗⽇ 乘⼦λ, 构造⼀个新的函数, 拉格朗日函数h(x),
h(x) = f(x) + λg(x)
该拉格朗⽇函数h(x)最优解可能在g(x)<0区域中, 或者在边界g(x)=0上, 下⾯具体分析这两种情况,所以整合这两种情况, 必须满⾜λg(x)=0
因此约束g(x)最⼩化f(x)的优化问题, 可通过引⼊拉格朗⽇ 因⼦转化为在如下约束下, 最小化拉格朗⽇ 函数h(x),
⾛到这⼀步, 这个⽬标函数还是不能开始求解, 现在我们的问题是极⼩极⼤值问题
我们要将其转换为对偶问题,变成极大极小值问题:
对偶问题的参考资料: https://wenku.baidu.com/view/7bf945361b37f111f18583d049649b6649d70975.html
如何获取对偶函数?
3.4.3 整体流程确定
我们用数学表达式来说明上面的过程:
对目标函数添加符号,转换成求极小值:
2) 计算上面式子的极值求出
3) 将代入,计算w,b
4)求得超平面:
给定3个数据点: 正例点x1 = (3, 3), x2 = (4, 3),负例点x3 = (1, 1),求线性可分⽀持向量机。 三个点画出来:
2) 求得⽬ 标函数的极值
对α 1, α 2求偏导并令其为0, 易知s(α1 , α2 ),在点(1.5, -1) 处取极值。
⽽该点不满⾜条件α2 >= 0,所以, 最⼩值在边界上达到。
于是, s(α1 , α2 )在α1 = 0, α2 = 0时达到最⼩, 此时:
3) 将求得的极值代⼊从⽽求得最优参数w,b
α1 = α3 = 1/4对应的点x , x 就是⽀持向量机
代⼊公式:
将α结果代⼊求解:
平⾯⽅程为: 0.5x1 + 0.5x2 - 2 = 0
4) 因此得到分离超平⾯为
0.5x1 + 0.5x2 - 2 = 0
在SVM中, 我们主要讨论三种损失函数:
绿⾊: 0/1损失
蓝⾊: SVM Hinge损失函数
红⾊: Logistic损失函数
【SVM + 核函数】 具有极⼤威⼒。
核函数并不是SVM特有的, 核函数可以和其他算法也进⾏结合, 只是核函数与SVM结合的优势⾮常⼤。
核函数,是将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。
下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时该如何把这两类数据分开呢?
若x, z是X空间中的点, 函数k(x,z)满⾜下述条件, 那么都成⽴, 则称k为核函数, ⽽ϕ为映射函数:
下⾯这张图位于第⼀、 ⼆象限内。 我们关注红⾊的⻔, 以及“北京四合院”这⼏个字和下⾯的紫⾊的字⺟
我们把红⾊的⻔上的点看成是“+”数据, 字⺟上的点看成是“-”数据, 它们的横、 纵坐标是两个特征。
显然, 在这个⼆维空间内, “+”“-”两类数据不是线性可分的。
线性核和多项式核:
RBF核:
Sigmoid核:
总之, 都是在定义距离, ⼤于该距离, 判为正, ⼩于该距离, 判为负。 ⾄于选择哪⼀种核函数, 要根据具体的样本分布情况来确定。
⼀般有如下指导规则:
1) 如果Feature的数量很⼤, 甚⾄和样本数量差不多时, 往往线性可分, 这时选⽤LR或者线性核Linear;
2) 如果Feature的数量很⼩, 样本数量正常, 不算多也不算少, 这时选⽤RBF核;
3) 如果Feature的数量很⼩, ⽽样本的数量很⼤, 这时⼿动添加⼀些Feature, 使得线性可分, 然后选⽤LR或者线性核Linear;
4) 多项式核⼀般很少使⽤, 效率不⾼, 结果也不优于RBF;
5) Linear核参数少, 速度快; RBF核参数多, 分类结果⾮常依赖于参数, 需要交叉验证或⽹格搜索最佳参数, ⽐较耗时;
6) 应⽤最⼴的应该就是RBF核, ⽆论是⼩样本还是⼤样本, ⾼维还是低维等情况, RBF核函数均适⽤。
SVM回归是让尽可能多的实例位于预测线上, 同时限制间隔违例(也就是不在预测线距上的实例) 。
线距的宽度由超参数ε控制。
使用SVM作为模型时,通常采用如下流程:
1.对样本数据进行归一化
2.应用核函数对样本进行映射(最常用的核函数是RBF和Linear, 在样本线性可分时,Linear效果要比RBF好)
3.用cross-vaildation和grid-search对超参数进行优选
4.用最优参数训练得到模型
5. 测试
sklearn中⽀持向量分类主要有三种⽅法: SVC、 NuSVC、 LinearSVC, 扩展为三个⽀持向量回归⽅法: SVR、
NuSVR、 LinearSVR
NuSVC中的nu参数和SVC中的C参数;
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)
C越⼤, 相当于惩罚松弛变量, 希望松弛变量接近0, 即对误分类的惩罚增⼤, 趋向于对训练集全分对的情况, 这样会出现训练集测试时准确率很⾼, 但泛化能⼒弱, 容易导致过拟合。
C值小, 对误分类的惩罚减⼩, 容错能⼒增强, 泛化能⼒较强, 但也可能⽋拟合。
人话: 惩罚因子C的取值权衡了经验风险和结构风险:C越大,经验风险越小,结构风险越大,模型复杂度越高,容易出现过拟合;C越小,模型复杂度越低,容易出现欠拟合。
参数选择有RBF, Linear, Poly, Sigmoid或者⾃定义⼀个核函数。
默认的是"RBF", 即径向基核, 也就是⾼斯核函数;
⽽Linear指的是线性核函数,
Poly指的是多项式核,
Sigmoid指的是双曲正切函数tanh核; 。
当指定kernel为'poly'时, 表示选择的多项式的最⾼次数, 默认为三次多项式;
若指定kernel不是'poly', 则忽略, 即该参数只对'poly'有⽤。多项式核函数是将低维的输⼊空间映射到⾼维的特征空间。
只有‘poly’和‘sigmoid’核函数有, 默认值是0
class sklearn.svm.NuSVC(nu=0.5)
class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)
L1和L2两种参数可选, 仅LinearSVC有。
有hinge和squared_hinge两种可选, 前者⼜称L1损失, 后者称为L2损失, 默认是squared_hinge,
其中hinge是SVM的标准损失, squared_hinge是hinge的平⽅
MNIST(“修改后的国家标准与技术研究所”) 是计算机视觉事实上的“hello world”数据集。 ⾃1999年发布以来, 这⼀经典的⼿写图像数据集已成为分类算法基准测试的基础。 随着新的机器学习技术的出现, MNIST仍然是研究⼈员和学习者的可靠资源。
本次案例中, 我们的⽬标是从数万个⼿写图像的数据集中正确识别数字。
数据⽂件train.csv和test.csv包含从0到9的⼿绘数字的灰度图像。
每个图像的⾼度为28个像素, 宽度为28个像素, 总共为784个像素。
每个像素具有与其相关联的单个像素值, 指示该像素的亮度或暗度, 较高的数字意味着较暗。 该像素值是0到255之间的整数, 包括0和255。
训练数据集(train.csv) 有785列。 第⼀列称为“标签”, 是⽤户绘制的数字。 其余列包含关联图像的像素值。
训练集中的每个像素列都具有像pixelx这样的名称, 其中x是0到783之间的整数, 包括0和783。 为了在图像上定位该像素, 假设我们已经将x分解为x = i * 28 + j, 其中i和j是0到27之间的整数, 包括0和27。 然后, pixelx位于28 x 28矩阵的第i⾏和第j列上(索引为零) 。
例如, pixel31表示从左边开始的第四列中的像素, 以及从顶部开始的第⼆⾏, 如下⾯的ascii图中所示。
代码与数据下载:https://download.csdn.net/download/A496608119/16158355
结果:
1) 当训练样本线性可分时, 通过硬间隔最⼤化, 学习⼀个线性分类器, 即线性可分⽀持向量机;
2) 当训练数据近似线性可分时, 引⼊松弛变量, 通过软间隔最⼤化, 学习⼀个线性分类器, 即线性⽀持向量机;
3) 当训练数据线性不可分时, 通过使⽤核技巧及软间隔最⼤化, 学习⾮线性⽀持向量机。
在⾼维空间中⾮常⾼效;
即使在数据维度⽐样本数量⼤的情况下仍然有效;
在决策函数(称为⽀持向量) 中使⽤训练集的⼦集,因此它也是⾼效利⽤内存的;
通⽤性: 不同的核函数与特定的决策函数⼀⼀对应;
如果特征数量⽐样本数量⼤得多, 在选择核函数时要避免过拟合;
对缺失数据敏感;
对于核函数的⾼维映射解释⼒不强
参考:黑马程序员课程