支持向量机(SVM)与案列讲解(Python 实现案列)

 

目录

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优缺点



1. SVM算法简介

1.1 SVM 算法导入

在很久以前的情⼈节, ⼤侠要去救他的爱⼈, 但魔⻤和他玩了⼀个游戏。
魔⻤在桌⼦上似乎有规律放了两种颜⾊的球, 说:
“你⽤⼀根棍分开它们? 要求: 尽量在放更多球之后, 仍然适⽤。 ”
支持向量机(SVM)与案列讲解(Python 实现案列)_第1张图片

于是⼤侠这样放, ⼲的不错?

支持向量机(SVM)与案列讲解(Python 实现案列)_第2张图片

然后魔⻤, ⼜在桌上放了更多的球, 似乎有⼀个球站错了阵营。
支持向量机(SVM)与案列讲解(Python 实现案列)_第3张图片

怎么办? ?
把分解的⼩棍⼉变粗。
SVM就是试图把棍放在最佳位置, 好让在棍的两边有尽可能⼤的间隙。

现在即使魔⻤放了更多的球, 棍仍然是⼀个好的分界线
支持向量机(SVM)与案列讲解(Python 实现案列)_第4张图片

然后, 在SVM ⼯具箱中有另⼀个更加重要的技巧( trick) 。 魔⻤看到⼤侠已经学会了⼀个trick, 于是魔⻤给了⼤侠⼀个新的挑战。
支持向量机(SVM)与案列讲解(Python 实现案列)_第5张图片

现在, ⼤侠没有棍可以很好帮他分开两种球了, 现在怎么办呢?当然像所有武侠⽚中⼀样⼤侠桌⼦⼀拍, 球⻜到空中。 然后, 凭借⼤侠的轻功, ⼤侠抓起⼀张纸, 插到了两种球的中
间。
支持向量机(SVM)与案列讲解(Python 实现案列)_第6张图片

现在, 从魔⻤的⻆度看这些球, 这些球看起来像是被⼀条曲线分开了。
支持向量机(SVM)与案列讲解(Python 实现案列)_第7张图片

球—— 「data」 数据
棍⼦—— 「classifier」 分类
最⼤间隙——「optimization」 最优化
拍桌⼦——「kernelling」 核⽅法
纸——「hyperplane」 超平⾯
案例来源: http://bytesizebio.net/2014/02/05/support-vector-machines-explained-well/


2 SVM算法定义

2.1 定义

SVM: SVM全称是supported vector machine(⽀持向量机) , 即寻找到⼀个超平⾯使样本分成两类, 并且间隔最⼤。
SVM能够执⾏线性或⾮线性分类、 回归, 甚⾄是异常值检测任务。 它是机器学习领域最受欢迎的模型之⼀。 SVM特别适⽤于中⼩型复杂数据集的分类。

支持向量机(SVM)与案列讲解(Python 实现案列)_第8张图片

2.2 超平面最大间隔介绍

支持向量机(SVM)与案列讲解(Python 实现案列)_第9张图片

上左图显示了三种可能的线性分类器的决策边界:
虚线所代表的模型表现⾮常糟糕, 甚⾄都⽆法正确实现分类。 其余两个模型在这个训练集上表现堪称完美, 但是它们的
决策边界与实例过于接近, 导致在⾯对新实例时, 表现可能不会太好。

右图中的实线代表SVM分类器的决策边界, 不仅分离了两个类别, 且尽可能远离最近的训练实例

2.3 硬间隔和软间隔

2.3.1 硬间隔

在上⾯我们使⽤超平⾯进⾏分割数据的过程中, 如果我们严格地让所有实例都不在最⼤间隔之间, 并且位于正确的⼀边, 这就是硬间隔分类。
硬间隔分类有两个问题, ⾸先, 它只在数据是线性可分离的时候才有效; 其次, 它对异常值⾮常敏感。
当有⼀个额外异常值的鸢尾花数据: 左图的数据根本找不出硬间隔, ⽽右图最终显示的决策边界与我们之前所看到的⽆异常值时的决策边界也⼤不相同, 可能⽆法很好地泛化。
支持向量机(SVM)与案列讲解(Python 实现案列)_第10张图片

2.3.2 软间隔分类

要避免这些问题, 最好使⽤更灵活的模型。 ⽬标是尽可能在保持最⼤间隔宽阔和限制间隔违例(即位于最⼤间隔之上,甚⾄在错误的⼀边的实例) 之间找到良好的平衡, 这就是软间隔类。。
支持向量机(SVM)与案列讲解(Python 实现案列)_第11张图片

在Scikit-Learn的SVM类中, 可以通过超参数C来控制这个平衡: C值越⼩, 则间隔越宽, 但是间隔违例也会越多。 上图显示了在⼀个⾮线性可分离数据集上, 两个软间隔SVM分类器各⾃的决策边界和间隔。
左边使⽤了⾼C值, 分类器的错误样本(间隔违例) 较少, 但是间隔也较⼩。
右边使⽤了低C值, 间隔⼤了很多, 但是位于间隔上的实例也更多。 看起来第⼆个分类器的泛化效果更好, 因为⼤多数间隔违例实际上都位于决策边界正确的⼀边, 所以即便是在该训练集上, 它做出的错误预测也会更少。
 

2.4 小结

  • SVM算法定义

     寻找到一个超平面使样本分成两类,并且间隔最大

  • 硬间隔和软间隔

      硬间隔

     1.只有在数据使线性可分离的时候才有效

     2. 对异常值非常敏感

    软间隔

    尽可能在保持最大间隔宽阔和间隔违例之间找到良好的平衡

3 SVM算法原理

3.1 定义输入数据

假设给定⼀个特征空间上的训练集为:

支持向量机(SVM)与案列讲解(Python 实现案列)_第12张图片

⾄于为什么正负⽤(-1, 1) 表示呢?
其实这⾥没有太多原理, 就是⼀个标记, 你也可以⽤(2, -3)来标记。 只是为了⽅便, 的过程中刚好可以相等, 便于之后的计算。 )

3.2 线性可分支持向量机

给定了上⾯提出的线性可分训练数据集, 通过间隔最⼤化得到分离超平⾯为 :

相应的分类决策函数为:

以上决策函数就称为线性可分⽀持向量机。
这⾥解释⼀下这个东东。
这是某个确定的特征空间转换函数, 它的作⽤是将x映射到更⾼的维度, 它有⼀个以后我们经常会见到的专有称号”核函数“
支持向量机(SVM)与案列讲解(Python 实现案列)_第13张图片

以上就是线性可分⽀持向量机的模型表达式。 我们要去求出这样⼀个模型, 或者说这样⼀个超平⾯y(x),它能够最优地分离两个集合
其实也就是我们要去求⼀组参数(w,b),使其构建的超平⾯函数能够最优地分离两个集合。
如下就是⼀个最优超平⾯:                                                                   又比如说这样:阴影部分是⼀个“过渡带”, “过渡带”的边界是集合中离超平⾯最近的样本点落在的地⽅。

支持向量机(SVM)与案列讲解(Python 实现案列)_第14张图片                支持向量机(SVM)与案列讲解(Python 实现案列)_第15张图片

3.3 SVM的计算过程与算法步骤

3.3.1 推导目标函数

我们知道了⽀持向量机是个什么东⻄了。 现在我们要去寻找这个⽀持向量机, 也就是寻找⼀个最优的超平⾯。于是我们要建⽴⼀个⽬标函数。 那么如何建⽴呢?
再来看⼀下我们的超平⾯表达式:

为了⽅便我们让:Φ(x) = x
则在样本空间中, 划分超平⾯可通过如下线性⽅程来描述:

  • 我们知道为法向量, 决定了超平⾯的⽅向;
  • b为位移项, 决定了超平⾯和原点之间的距离。
  • 显然, 划分超平⾯可被法向量w和位移b确定, 我们把其记为(w,b) .

样本空间中任意点x到超平⾯(w,b) 的距离可写成
支持向量机(SVM)与案列讲解(Python 实现案列)_第16张图片

支持向量机(SVM)与案列讲解(Python 实现案列)_第17张图片

欲找到具有最⼤间隔的划分超平⾯, 也就是要找到能满⾜下式中约束的参数w和b, 使得γ最⼤。
支持向量机(SVM)与案列讲解(Python 实现案列)_第18张图片

即:

支持向量机(SVM)与案列讲解(Python 实现案列)_第19张图片

3.4 目标函数的求解

到这⼀步, 终于把⽬标函数给建⽴起来了。
那么下⼀步⾃然是去求⽬标函数的最优值.
因为⽬标函数带有⼀个约束条件, 所以我们可以⽤拉格朗⽇ 乘⼦法求解

3.4.1 拉格朗日乘子法

啥是拉格朗日乘子法?
拉格朗日(Lagrange multipliers)是⼀种寻找多元函数在⼀组约束下的极值的⽅法.
通过引⼊拉格朗日乘⼦, 可将有 d 个变量与 k 个约束条件的最优化问题转化为具有 d + k 个变量的无约束优化问题求解。

本⽂希望通过⼀个直观简单的例⼦尽⼒解释拉格朗⽇ 乘⼦法和KKT条件的原理
支持向量机(SVM)与案列讲解(Python 实现案列)_第20张图片支持向量机(SVM)与案列讲解(Python 实现案列)_第21张图片         

 我们可以直观的从图中得到,

  • 对于约束 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),
支持向量机(SVM)与案列讲解(Python 实现案列)_第22张图片

经过朗格朗⽇ 乘⼦法, 我们可以把⽬标函数转换为:

其中, 要想求得极⼩值, 上式后半部分:
支持向量机(SVM)与案列讲解(Python 实现案列)_第23张图片

⾛到这⼀步, 这个⽬标函数还是不能开始求解, 现在我们的问题是极⼩极⼤值问题


3.4.2 对偶问题

我们要将其转换为对偶问题,变成极大极小值问题:

支持向量机(SVM)与案列讲解(Python 实现案列)_第24张图片变为:

对偶问题的参考资料: https://wenku.baidu.com/view/7bf945361b37f111f18583d049649b6649d70975.html
如何获取对偶函数?

  • ⾸先我们对原⽬标函数的w和b分别求导:

              原⽬标函数:

              对w求偏导:支持向量机(SVM)与案列讲解(Python 实现案列)_第25张图片

              对b求偏导:

  • 然后将以上w和b的求导函数重新代⼊原⽬标函数的w和b中, 得到的就是原函数的对偶函数:
     

支持向量机(SVM)与案列讲解(Python 实现案列)_第26张图片

  • 这个对偶函数其实求的是:中的minL(w,b)部分(因为对w,b求了偏导)
  • 于是现在要求的是这个函数的极大值max(a),写成公式就是:支持向量机(SVM)与案列讲解(Python 实现案列)_第27张图片
  • 好了, 现在我们只需要对上式求出极⼤值α, 然后将α代⼊w求偏导的那个公式:
    支持向量机(SVM)与案列讲解(Python 实现案列)_第28张图片
  • 从⽽求出w。
  • 将w代⼊超平⾯的表达式, 计算b值;
  • 现在的w,b就是我们要寻找的最优超平⾯的参数。
     

3.4.3 整体流程确定

我们用数学表达式来说明上面的过程:

1)首先求的极大值。即:

支持向量机(SVM)与案列讲解(Python 实现案列)_第29张图片

对目标函数添加符号,转换成求极小值:

支持向量机(SVM)与案列讲解(Python 实现案列)_第30张图片

2) 计算上面式子的极值求出

3) 将代入,计算w,b

支持向量机(SVM)与案列讲解(Python 实现案列)_第31张图片

4)求得超平面:

5) 求得分类决策函数:
支持向量机(SVM)与案列讲解(Python 实现案列)_第32张图片

4 举例

给定3个数据点: 正例点x1 = (3, 3), x2 = (4, 3),负例点x3 = (1, 1),求线性可分⽀持向量机。 三个点画出来:
支持向量机(SVM)与案列讲解(Python 实现案列)_第33张图片

1) ⾸先确定⽬ 标函数
支持向量机(SVM)与案列讲解(Python 实现案列)_第34张图片

2) 求得⽬ 标函数的极值

原式:
支持向量机(SVM)与案列讲解(Python 实现案列)_第35张图片

把数据代⼊:

由于:

化简可得:
支持向量机(SVM)与案列讲解(Python 实现案列)_第36张图片

对α 1, α 2求偏导并令其为0, 易知s(α1 , α2 ),在点(1.5, -1) 处取极值。
⽽该点不满⾜条件α2 >= 0,所以, 最⼩值在边界上达到。
支持向量机(SVM)与案列讲解(Python 实现案列)_第37张图片

于是, s(α1 , α2 )在α1 = 0, α2 = 0时达到最⼩, 此时:

3) 将求得的极值代⼊从⽽求得最优参数w,b
α1 = α3 = 1/4对应的点x , x 就是⽀持向量机
代⼊公式:
支持向量机(SVM)与案列讲解(Python 实现案列)_第38张图片

将α结果代⼊求解:
平⾯⽅程为: 0.5x1 + 0.5x2 - 2 = 0
4) 因此得到分离超平⾯为
0.5x1 + 0.5x2 - 2 = 0

5) 得到分离决策函数为:

5 SVM的损失函数

在SVM中, 我们主要讨论三种损失函数:

支持向量机(SVM)与案列讲解(Python 实现案列)_第39张图片

绿⾊: 0/1损失

  • 当正例的点落在y=0这个超平⾯的下边, 说明是分类正确, ⽆论距离超平⾯所远多近, 误差都是0.
  • 当这个正例的样本点落在y=0的上⽅的时候, 说明分类错误, ⽆论距离多远多近, 误差都为1.
  • 图像就是上图绿⾊线蓝.

蓝⾊: SVM Hinge损失函数

  • 当⼀个正例的点落在y=1的直线上, 距离超平⾯⻓度1, 那么1-ξ=1, ξ=0, 也就是说误差为0;
  • 当它落在距离超平⾯0.5的地⽅, 1-ξ=0.5, ξ=0.5, 也就是说误差为0.5;
  • 当它落在y=0上的时候, 距离为0, 1-ξ=0, ξ=1, 误差为1;
  • 当这个点落在了y=0的上⽅, 被误分到了负例中, 距离算出来应该是负的, ⽐如-0.5, 那么1-ξ=-0.5, ξ=-1.5.误差为1.5.
  • 以此类推, 画在⼆维坐标上就是上图中蓝⾊那根线了。

红⾊: Logistic损失函数

  • 损失函数的公式为:
  • 当yi= 0时, 损失等于ln2,这样真丑, 所以我们给这个损失函数除以ln2.
  • 这样到y = 0时, 损失为1, 即损失函数过(0, 1) 点
  • 即上图中的红⾊线。
     

6 SVM的核方法

【SVM + 核函数】 具有极⼤威⼒。
核函数并不是SVM特有的, 核函数可以和其他算法也进⾏结合, 只是核函数与SVM结合的优势⾮常⼤。
 

6. 1 什么是核函数

6.1.1 核函数概念

核函数,是将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。

下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时该如何把这两类数据分开呢?

支持向量机(SVM)与案列讲解(Python 实现案列)_第40张图片

  • 假设X是输⼊空间,
  • H是特征空间,
  • 存在⼀个映射ϕ使得X中的点x能够计算得到H空间中的点h,
  • 对于所有的X中的点都成⽴:
     

支持向量机(SVM)与案列讲解(Python 实现案列)_第41张图片

若x, z是X空间中的点, 函数k(x,z)满⾜下述条件, 那么都成⽴, 则称k为核函数, ⽽ϕ为映射函数:

6.2 核函数举例

6.2.1 核方法举例1:

支持向量机(SVM)与案列讲解(Python 实现案列)_第42张图片

支持向量机(SVM)与案列讲解(Python 实现案列)_第43张图片

支持向量机(SVM)与案列讲解(Python 实现案列)_第44张图片

经过上⾯公式, 具体变换过过程为:
支持向量机(SVM)与案列讲解(Python 实现案列)_第45张图片

6.1.2 核方法举例2 :

下⾯这张图位于第⼀、 ⼆象限内。 我们关注红⾊的⻔, 以及“北京四合院”这⼏个字和下⾯的紫⾊的字⺟
我们把红⾊的⻔上的点看成是“+”数据, 字⺟上的点看成是“-”数据, 它们的横、 纵坐标是两个特征。
显然, 在这个⼆维空间内, “+”“-”两类数据不是线性可分的。
支持向量机(SVM)与案列讲解(Python 实现案列)_第46张图片支持向量机(SVM)与案列讲解(Python 实现案列)_第47张图片

  • 绿⾊的平⾯可以完美地分割红⾊和紫⾊, 两类数据在三维空间中变成线性可分的了。
  • 三维中的这个判决边界, 再映射回⼆维空间中: 是⼀条双曲线, 它不是线性的。
  • 核函数的作⽤就是⼀个从低维空间到⾼维空间的映射, ⽽这个映射可以把低维空间中线性不可分的两类点变成线性可分的。

6.2 常见核函数

支持向量机(SVM)与案列讲解(Python 实现案列)_第48张图片

线性核和多项式核:

  • 这两种核的作⽤也是⾸先在属性空间中找到⼀些点, 把这些点当做base, 核函数的作⽤就是找与该点距离和⻆度满⾜某种关系的样本点。
  • 当样本点与该点的夹⻆近乎垂直时, 两个样本的欧式⻓度必须⾮常⻓才能保证满⾜线性核函数⼤于0; ⽽当样本点与base点的⽅向相同时, ⻓度就不必很⻓; ⽽当⽅向相反时, 核函数值就是负的, 被判为反类。 即, 它在空间上划分出⼀个梭形, 按照梭形来进⾏正反类划分。

RBF核:

  • ⾼斯核函数就是在属性空间中找到⼀些点, 这些点可以是也可以不是样本点, 把这些点当做base, 以这些base为圆⼼向外扩展, 扩展半径即为带宽, 即可划分数据。
  • 换句话说, 在属性空间中找到⼀些超圆, ⽤这些超圆来判定正反类。

Sigmoid核:

  • 同样地是定义⼀些base,
  • 核函数就是将线性核函数经过⼀个tanh函数进⾏处理, 把值域限制在了-1到1上。
     

总之, 都是在定义距离, ⼤于该距离, 判为正, ⼩于该距离, 判为负。 ⾄于选择哪⼀种核函数, 要根据具体的样本分布情况来确定

⼀般有如下指导规则:
1) 如果Feature的数量很⼤, 甚⾄和样本数量差不多时, 往往线性可分, 这时选⽤LR或者线性核Linear;
2) 如果Feature的数量很⼩, 样本数量正常, 不算多也不算少, 这时选⽤RBF核;
3) 如果Feature的数量很⼩, ⽽样本的数量很⼤, 这时⼿动添加⼀些Feature, 使得线性可分, 然后选⽤LR或者线性核Linear;
4) 多项式核⼀般很少使⽤, 效率不⾼, 结果也不优于RBF;
5) Linear核参数少, 速度快; RBF核参数多, 分类结果⾮常依赖于参数, 需要交叉验证或⽹格搜索最佳参数, ⽐较耗时;
6) 应⽤最⼴的应该就是RBF核, ⽆论是⼩样本还是⼤样本, ⾼维还是低维等情况, RBF核函数均适⽤。
 

7 SVM回归

SVM回归是让尽可能多的实例位于预测线上, 同时限制间隔违例(也就是不在预测线距上的实例) 。
线距的宽度由超参数ε控制。
支持向量机(SVM)与案列讲解(Python 实现案列)_第49张图片

8 SVM算法api介绍

8.1 SVM算法api综述

  • SVM方法既可以用于分类(二/多分类),也可以用于回归和异常值检测
  • SVM具有良好的鲁棒性,对未知数拥有很强的泛化能力,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能

使用SVM作为模型时,通常采用如下流程:

1.对样本数据进行归一化

2.应用核函数对样本进行映射(最常用的核函数是RBF和Linear, 在样本线性可分时,Linear效果要比RBF好)

3.用cross-vaildation和grid-search对超参数进行优选

4.用最优参数训练得到模型

5. 测试

sklearn中⽀持向量分类主要有三种⽅法: SVC、 NuSVC、 LinearSVC, 扩展为三个⽀持向量回归⽅法: SVR、
NuSVR、 LinearSVR

  • SVC和NuSVC⽅法基本⼀致, 唯⼀区别就是损失函数的度量⽅式不同

         NuSVC中的nu参数和SVC中的C参数;

  • LinearSVC是实现线性核函数的⽀持向量分类, 没有kernel参数。

8.2 SVC 

class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)
  • C: 惩罚系数, ⽤来控制损失函数的惩罚系数, 类似于线性回归中的正则化系数。

      C越⼤, 相当于惩罚松弛变量, 希望松弛变量接近0, 即对误分类的惩罚增⼤, 趋向于对训练集全分对的情况, 这样会出现训练集测试时准确率很⾼, 但泛化能⼒弱, 容易导致过拟合。
      C值小, 对误分类的惩罚减⼩, 容错能⼒增强, 泛化能⼒较强, 但也可能⽋拟合。

人话: 惩罚因子C的取值权衡了经验风险和结构风险:C越大,经验风险越小,结构风险越大,模型复杂度越高,容易出现过拟合;C越小,模型复杂度越低,容易出现欠拟合。

  • kernel: 算法中采⽤的核函数类型, 核函数是⽤来将⾮线性问题转化为线性问题的⼀种⽅法。

         参数选择有RBF, Linear, Poly, Sigmoid或者⾃定义⼀个核函数。
          默认的是"RBF", 即径向基核, 也就是⾼斯核函数;
         ⽽Linear指的是线性核函数,
         Poly指的是多项式核,
         Sigmoid指的是双曲正切函数tanh核; 。

  • degree:

         当指定kernel为'poly'时, 表示选择的多项式的最⾼次数, 默认为三次多项式;

         若指定kernel不是'poly', 则忽略, 即该参数只对'poly'有⽤。多项式核函数是将低维的输⼊空间映射到⾼维的特征空间。

  • coef0: 核函数常数值(y=kx+b中的b值),

        只有‘poly’和‘sigmoid’核函数有, 默认值是0

8.3 NuSVC

class sklearn.svm.NuSVC(nu=0.5)
  • nu: 训练误差部分的上限和⽀持向量部分的下限, 取值在(0, 1) 之间, 默认是0.5
     

8.4 LinearSVC

class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)
  • penalty:正则化参数

     L1和L2两种参数可选, 仅LinearSVC有。

  • loss:损失函数,

    有hinge和squared_hinge两种可选, 前者⼜称L1损失, 后者称为L2损失, 默认是squared_hinge,
    其中hinge是SVM的标准损失, squared_hinge是hinge的平⽅

  • dual:是否转化为对偶问题求解, 默认是True。
  • C:惩罚系数:⽤来控制损失函数的惩罚系数, 类似于线性回归中的正则化系数。

9 案例:数字识别器

9.1 案例背景介绍

支持向量机(SVM)与案列讲解(Python 实现案列)_第50张图片

MNIST(“修改后的国家标准与技术研究所”) 是计算机视觉事实上的“hello world”数据集。 ⾃1999年发布以来, 这⼀经典的⼿写图像数据集已成为分类算法基准测试的基础。 随着新的机器学习技术的出现, MNIST仍然是研究⼈员和学习者的可靠资源。
本次案例中, 我们的⽬标是从数万个⼿写图像的数据集中正确识别数字
 

9.2 数据介绍

数据⽂件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列上(索引为零) 。
支持向量机(SVM)与案列讲解(Python 实现案列)_第51张图片

例如, pixel31表示从左边开始的第四列中的像素, 以及从顶部开始的第⼆⾏, 如下⾯的ascii图中所示。

在视觉上, 如果我们省略“像素”前缀, 像素组成图像如下:
支持向量机(SVM)与案列讲解(Python 实现案列)_第52张图片

支持向量机(SVM)与案列讲解(Python 实现案列)_第53张图片

9.2 案例实现

代码与数据下载:https://download.csdn.net/download/A496608119/16158355

 

结果:

支持向量机(SVM)与案列讲解(Python 实现案列)_第54张图片支持向量机(SVM)与案列讲解(Python 实现案列)_第55张图片

10 SVM总结

10.1 SVM 基本综述

  • SVM是⼀种⼆类分类模型。
  • 它的基本模型是在特征空间中寻找间隔最⼤化的分离超平⾯的线性分类器。

       1) 当训练样本线性可分时, 通过硬间隔最⼤化, 学习⼀个线性分类器, 即线性可分⽀持向量机;
       2) 当训练数据近似线性可分时, 引⼊松弛变量, 通过软间隔最⼤化, 学习⼀个线性分类器, 即线性⽀持向量机;
       3) 当训练数据线性不可分时, 通过使⽤核技巧及软间隔最⼤化, 学习⾮线性⽀持向量机。

10.2 SVM优缺点

  • SVM的优点:

    在⾼维空间中⾮常⾼效;
    即使在数据维度⽐样本数量⼤的情况下仍然有效;
    在决策函数(称为⽀持向量) 中使⽤训练集的⼦集,因此它也是⾼效利⽤内存的;
    通⽤性: 不同的核函数与特定的决策函数⼀⼀对应;

  • SVM的缺点:

    如果特征数量⽐样本数量⼤得多, 在选择核函数时要避免过拟合;
    对缺失数据敏感;
    对于核函数的⾼维映射解释⼒不强
 

 

参考:黑马程序员课程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

你可能感兴趣的:(机器学习与深度学习算法,svm,分类算法,python,机器学习)