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

本文介绍了支持向量机(SVM)的原理,包括最大间隔分隔数据、SMO优化算法以及核函数在处理复杂数据时的应用。通过Python3代码实现SVM,包括简化和完整版的SMO算法,展示了非线性SVM的分类效果。SVM因其低泛化错误率和良好的推广性而备受推崇。

参考:

  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还是小于0。如果只在x和y轴构成的坐标系中插入直线进行分类的话,我们并不会得到理想的结果。

所以,我们可以将数据从一个特征空间转换到另一个特征空间
在新空间下,我们可以很容易利用已有的工具对数据进行处理,得到大于0或者小于0的测试结果。

数学家们喜欢将这个过程称之为从一个特征空间到另一个特征空间的映射。在通常情况下,这种映射会将低维特征空间映射到高维空间
经过空间转换之后,我们可以在高维空间中解决线性问题,这也就等价于在低维空间中解决非线性问题。

这种从某个特征空间到另一个特征空间的映射是通过核函数来实现的。
读者可以把核函数想象成一个包装器(wrapper)或者是接口(interface),它能把数据从某个很难处理的形式转换成为另一个较容易处理的形式。

SVM优化中一个特别好的地方就是,所有的运算都可以写成内积(inner product,也称点积)的形式。向量的内积指的是两个向量相乘,之后得到单个标量或者数值。我们可以把内积运算替换成核函数,而不必做简化处理。
将内积替换成核函数的方式被称为核技巧(kernel trick)或者核“变电”(kernel substation)。

核函数并不仅仅应用于支持向量机,很多其他的机器学习算法也都用到核函数。

径向基函数是SVM中常用的一个核函数。径向基函数是一个采用向量作为自变量的函数,能够基于向量距离运算输出一个标量。这个距离可以是从<0,0>向量或者其他向量开始计算的距离。
我们经常使用到径向基函数的高斯版本,其具体公式为:
k ( x , y ) = e x p ( − ∥ x − y ∥ 2 2 σ 2 ) k(x,y)=exp(\frac{-\left \| x-y \right \|^2}{2\sigma ^2}) k(x,y)=exp(2σ2xy2)
上述高斯核函数将数据从其特征空间映射到更高维的空间,具体来说这里是映射到一个无穷维的空间。

二、代码实现(python3)

1.可视化数据集

这一部分与之前的Logistic回归相同

import matplotlib.pyplot as plt
import numpy as np

def loadDataSet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值