“机器学习实战”刻意练习——分类问题:支持向量机

参考:

  1. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM - Jack-Cui - CSDN博客
  2. 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件 - Xianling Mao的专栏 - CSDN博客
  3. Python3《机器学习实战》学习笔记(九):支持向量机实战篇之再撕非线性SVM - Jack-Cui - CSDN博客

一、SVM原理概述

支持向量机,即Support Vector Machines,简称SVM。

有些人认为,SVM是最好的现成的分类器,这里说的“现成”指的是分类器不加修改即可直接使用。同时,这就意味着在数据上应用基本形式的SVM分类器就可以得到低错误率的结果。SVM能够对训练集之外的数据点做出很好的分类决策。

SVM有很多实现,但是我们只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法。以及如何使用一种称为核函数(kernel)的方式将SVM扩展到更多数据集上。

  • 优缺点:
    优点:泛化错误率低计算开销不大,结果易解释。
    缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。
  • 适用数据类型:
    数值型标称型数据
  • SVM的一般流程
    (1) 收集数据:可以使用任意方法。
    (2) 准备数据:需要数值型数据。
    (3) 分析数据:有助于可视化分隔超平面
    (4) 训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优
    (5) 测试算法:十分简单的计算过程就可以实现。
    (6) 使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器,对多类问题应用SVM需要对代码做一些修改。

1.基于最大间隔分隔数据

在介绍SVM这个主题之前,先解释几个概念:

两组数据点,若它们之间已经分隔得足够开,很容易就可以在图中画出一条直线将两组数据点分开。
在这种情况下,这组数据被称为线性可分(linearly separable)数据
而将数据集分隔开来的直线称为分隔超平面(separating hyperplane)。

若数据点都在二维平面上,则此时分隔超平面就只是一条直线。但是,如果所给的数据集是三维的,那么此时用来分隔数据的就是一个平面。显而易见,更高维的情况可以依此类推。如果数据集是1024维的,那么就需要一个1023维的某某对象来对数据进行分隔。这个1023维的某某对象到底应该叫什么?N-1维呢?
该对象被称为超平面(hyperplane),也就是分类的决策边界

分布在超平面一侧的所有数据都属于某个类别,而分布在另一侧的所有数据则属于另一个类别。我们希望能采用这种方式来构建分类器,即如果数据点离决策边界越远,那么其最后的预测结果也就越可信

这里点到分隔面的距离被称为间隔(margin)。我们希望间隔尽可能地大,这是因为如果我们犯错或者在有限数据上训练分类器的话,我们希望分类器尽可能健壮。

支持向量(support vector)就是离分隔超平面最近的那些点。
接下来要试着最大化支持向量到分隔面的距离,需要找到此问题的优化求解方法。

2.寻找最大间隔

如何求解数据集的最佳分隔直线?

分隔超平面的形式可以写成 w T x + b w^{T}x+b wTx+b

这里的常数 b b b类似于Logistic回归中的截距 w 0 w_{0} w0

要计算点A到分隔超平面的距离,就必须给出点到分隔面的法线或垂线的长度,该值为 d = ∣ w T A + b ∣ ∣ ∣ w ∣ ∣ d=\frac{|w^{T}A+b|}{||w||} d=wwTA+b
(可以类比初中学过的点到直线距离公式 d = ∣ A x + B y + C A 2 + B 2 ∣ d=\left | {\frac{Ax+By+C}{\sqrt{A^2+B^2}}} \right | d=A2+B2 Ax+By+C来理解)

接下来我们讨论分类器的工作原理:
输入数据给分类器会输出一个类别标,这相当于一个类似于Sigmoid的函数在作用。
下面将使用类似海维赛德阶跃函数(即单位阶跃函数)的函数对 w T x + b w^{T}x+b wTx+b 作用得到 f ( w T x + b ) f(w^{T}x+b) f(wTx+b)
其中,当 u < 0 u<0 u<0 f ( u ) f(u) f(u)输出-1,反之则输出+1。

这里的类别标签采用-1和+1,而不是0和1主要有以下两个好处:
第一,由于-1和+1仅仅相差一个符号,方便数学上的处理。我们可以通过一个统一公式来表示间隔或者数据点到分隔超平面的距离,同时不必担心数据到底是属于-1还是+1类。
第二,当计算数据点到分隔面的距离并确定分隔面的放置位置时,间隔通过 l a b e l ∗ ( w T x + b ) label * (w^{T}x+b) label(wTx+b)来计算。如果数据点处于正方向(即+1类)并且离分隔超平面很远的位置时, w T x + b w^{T}x+b wTx+b会是一个很大的正数,同时 l a b e l ∗ ( w T x + b ) label * (w^{T}x+b) label(wTx+b)也会是一个很大的正数。而如果数据点处于负方向(-1类)并且离分隔超平面很远的位置时,此时由于类别标签为-1,则 l a b e l ∗ ( w T x + b ) label * (w^{T}x+b) label(wTx+b)仍然是一个很大的正数

现在的目标就是找出分类器定义中的 w w w b b b
为此,我们必须找到具有最小间隔的数据点,而这些数据点也就是前面提到的支持向量。一旦找到具有最小间隔的数据点,我们就需要对该间隔最大化
这就可以写作:
在这里插入图片描述
直接求解上述问题相当困难,所以我们将它转换成为另一种更容易求解的形式如下:
在这里插入图片描述
转换过程主要有两步(详细推导过程看上方参考文章,不赘述了):
一是令所有支持向量 l a b e l ∗ ( w T x + b ) label * (w^{T}x+b) label(wTx+b)都为1,那么就可以通过求 ∣ ∣ w ∣ ∣ − 1 ||w||^{-1} w1的最大值来得到最终解。
二是利用拉格朗日乘子法及KKT条件求解带约束条件的优化问题。
其中,KKT条件是说最优值必须满足以下条件:

  1. L(a, b, x)对x求导为零;

  2. h(x) =0;

  3. a*g(x) = 0;

转换后式子约束条件为:
在这里插入图片描述
其中,常数C为引入的松弛变量(slack variable),来允许有些数据点可以处于分隔面的错误一侧。C用于控制“最大化间隔”和“保证大部分点的函数间隔小于1.0”这两个目标的权重。在优化算法的实现代码中,常数C是一个参数,因此我们就可以通过调节该参数得到不同的结果

3.SMO 高效优化算法

SMO表示序列最小优化(Sequential Minimal Optimization)。

SMO算法的目标是求出一系列 α \alpha α b b b ,一旦求出了这些 α \alpha α ,就很容易计算出权重向量 w w w 并得到分隔超平面。

SMO算法的工作原理是:
每次循环中选择两个 α \alpha α 进行优化处理。
一旦找到一对合适 α \alpha α ,那么就增大其中一个同时减小另一个

  • 这里所谓的“合适”就是指两个 α \alpha α 必须要符合一定的条件
    条件一是这两个 α \alpha α 必须要在间隔边界之外
    条件二是这两个 α \alpha α 还没有进行过区间化处理或者不在边界上

4.在复杂数据上应用核函数

现在想象这样一个情形:A类数据点处于一个圆中,而B类数据点将将其环形包围。
人类的大脑能够意识到这一点并找到其分割线。然而,对于分类器而言&#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值