支持向量机的原理介绍

Posted 程序员干货站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持向量机的原理介绍相关的知识,希望对你有一定的参考价值。

关于机器学习的简介

机器学习是从大量数据中学习出特定规律的算法。其中提到的规律有很多种,比如分类、聚类、回归、关联分析等。

分类就是给定大量带标签的数据,计算出未知标签样本的标签取值。如年龄 40 岁以上、工科、研究生以上学历,这类人薪资水平是高收入;年龄 20-30 岁、文科、大专学历,这类人的薪资水平是低收入;现有一位 23 岁大专文科人士,求该人的薪资水平是哪类?根据分类建模,就可以知道这个人的薪资水平很可能是低收入。

回归是根据特征值、目标变量拟合出特征值与目标变量之间的函数关系,可用来估计特征值对应的目标变量的可能取值。举个简单的例子,某市今年某 100 平米的房子价格是 80 万,某 150 平米房子价格是 120 万,那么某 200 平米的房子价格的取值就可能是 200*0.8=160 万左右。

关联分析是计算出大量数据之间的频繁项集合。如超市订单中有大量订单同时包含啤酒与尿布,这其中的频繁项就是啤酒和尿布,那么超市就可以针对这个规律对啤酒和尿布进行组合促销活动。

分类算法主要包括 K 近邻、决策树、朴素贝叶斯、逻辑回归、支持向量机、AdaBoost 等;回归主要包括线性回归、岭回归、lasso、树回归等;聚类主要包括 K-Means 以及它的各种变形算法;关联分析主要包括 Apriori、FP-growth 等算法。

支持向量机即 support vector machine(简称 SVM),是机器学习领域经典的分类算法

关于 SVM 的简介

支持向量是距离分类超平面近的那些点,SVM 的思想就是使得支持向量到分类超平面的间隔最大化。出发点很容易理解,距离分类超平面近的那些点到该超平面的间隔最大化代表了该超平面对两类数据的区分度强,不容易出现错分的情况。如图 1 所示,支持向量到超平面 1 的间隔大于支持向量到超平面 2 的间隔,因此超平面 1 优于超平面 2。

图 1. 两个超平面示例

SVM 可以很好得解决二分类问题,对于多分类情况,就需要对模型进行改动。如 one-versus-rest 法,这种方法每次选择一个类别作为正样本,剩下其他类别作为负样本,假设一共有 3 个类别,这样相当于训练出了 3 个不同的 SVM。然后将测试数据分别带入 3 个 SVM 模型中,得到的 3 个结果中的最大值则为最终的分类结果。

支持向量到分类超平面的间隔最大化的思路很完美,按这种思路得到的模型理论上是准确度最高的一种模型。但是使用过 SVM 的朋友都知道,调用 SVM 算法的测试准确度并不一定都很高。这其中有很多原因,比如数据预处理的效果、训练集的大小、特征值的选择、参数设置以及核函数的选择等因素。

任何模型都是优点与缺点并存的。

SVM 的优点是:

  1. 可以解决线性不可分的情况。如图 2 所示,两类数据点根本无法用超平面分隔开;

  2. 计算复杂度仅取决于少量支持向量,对于数据量大的数据集计算复杂度低。

SVM 的缺点是:

  1. 经典的 SVM 算法仅支持二分类,对于多分类问题需要改动模型;

  2. 不支持类别型数据,需在预处理阶段将类别型数据转换成离散型数据。类别型数据即"男"、 "女"这类由字符串表示某类信息的数据,需将这类数据转换成离散型数据如 1、2。

图 2. 线性不可分问题

支持向量机的原理介绍

SVM 基本原理

SVM 原理分为软间隔最大化、拉格朗日对偶、最优化问题求解、核函数、序列最小优化 SMO 等部分。虽然这些名词看起来很晦涩,但是深入探索后就会发现其中的思想并没有那么复杂。

软间隔最大化

SVM 的核心思路是最大化支持向量到分隔超平面的间隔。后面所有的推导都是以最大化此间隔为核心思想展开。一般的机器学习问题都是先得到模型的目标函数和约束条件,然后在约束条件下对目标函数求得最优解。因此,我们下面首先需要推导出 SVM 模型的目标函数和约束条件。

既然要最大化间隔,那么回顾下点 x 到超平面(w,b)的距离公式:

支持向量机的原理介绍

其中超平面的公式为:

支持向量机的原理介绍

由此可推出点 x 到超平面(w,b)的几何间隔为:

支持向量机的原理介绍

其中 xi 代表第 i 条数据,yi 代表第 i 条数据对应的目标变量的取值,取值有+1 和-1 两种。所以当第 i 条数据被正确分类时,y 取值和 w*x+b 取值的正负一致,几何间隔为正;当被错误分类时,y 取值和 w*x+b 取值的正负相反,几何间隔为负。

图 3. 样本数据关于 w*x+b 的取值符号

支持向量机的原理介绍

定义几何间隔中最小的为:

支持向量机的原理介绍

由此,可以得到间隔最大化问题的目标函数:

支持向量机的原理介绍

并遵循如下约束条件:

支持向量机的原理介绍

做如下变换:

支持向量机的原理介绍

则目标函数转换为:

支持向量机的原理介绍

相应的约束条件变为:

支持向量机的原理介绍

做如下变换:

支持向量机的原理介绍

可得目标函数和约束条件变为:

支持向量机的原理介绍

由于 w, b 成倍数变化并不会影响超平面的公式,所以:

支持向量机的原理介绍

此时得到最终的间隔最大化的目标函数和约束条件如下:

支持向量机的原理介绍

但是,到这里并没有真正得结束。考虑到现实生活中的真实数据,存在一些特异点即 outliers,这些数据点并不满足上面推导出的约束条件,如图 4 所示,图中点 A 就是 outlier 特异点。

图 4. Outlier 特异点

支持向量机的原理介绍

为了解决这种问题,对每个样本点引进一个松弛变量,使得约束条件变为:

支持向量机的原理介绍

这样给 outlier 的约束条件加上一个变量,使其可以满足大于等于 1 的条件。则相应的目标变量变为:

支持向量机的原理介绍

其中 C 为惩罚参数,它的目的是使得目标变量最小即几何间隔最大,且使得松弛变量最小化。加入松弛变量的目标函数就是软间隔最大化。

拉格朗日对偶

对于凸二次优化问题,通过引入拉格朗日乘子,将目标函数和约束条件整合到拉格朗日函数中,这样能方便求解最值问题。那么,对每个不等式约束引入拉格朗日乘子,得到拉格朗日函数如下:

支持向量机的原理介绍

分析可知:

支持向量机的原理介绍

则原最优化问题转换成:

支持向量机的原理介绍

由于原最优化问题直接求解很困难,利用拉格朗日对偶性,可通过求解原最优化问题的对偶问题得到原问题的最优解。原最优化问题的对偶问题为:

支持向量机的原理介绍

最优化问题求解

到此为止,已经将目标函数和约束条件转换成了极大极小化拉格朗日函数的问题了。首先求解关于拉格朗日函数的极小化问题。

对三个变量分别求偏导得:

支持向量机的原理介绍

将以上三式带入拉格朗日函数中得:

支持向量机的原理介绍

那么极大极小化拉格朗日函数转换成:

支持向量机的原理介绍

为求解方便,将极大转换成极小得:

支持向量机的原理介绍

核函数

对于线性不可分问题,如图 2 所示,这类问题是无法用超平面划分正负样本数据的。倘若能将超平面换成超曲面,则可以将正负样本正确分类,如图 5 所示。

图 5. 超曲面分离正负样本

支持向量机的原理介绍

我们知道曲面的公式是:

支持向量机的原理介绍

映射到新坐标如下:

支持向量机的原理介绍

可将超曲面在新坐标下表示成超平面:

支持向量机的原理介绍

也就是将在二维空间(x1,x2)下线性不可分的问题转换成了在五维空间(z1,z2,z3,z4,z5)下线性可分的问题。

得映射后新坐标下的内积:

支持向量机的原理介绍

有一核函数如下:

支持向量机的原理介绍

可知

支持向量机的原理介绍

何为核函数?核函数在低维空间中完成了映射到高维空间后的内积运算。这点非常有用,利用核函数,无需先将变量一一映射到高维空间再计算内积,而是简单得在低维空间中利用核函数完成这一操作。为什么说不用一一映射到高维空间很有用呢?原因就在于首先我们无法针对每种情况提供精确的映射函数,再者对于需要映射到无穷维的情况显然无法一一映射完成。

那么为什么是映射到高维后的内积运算呢?这是因为在上节中我们得到了如下目标函数:

支持向量机的原理介绍

正是因为该目标函数中包含自变量的内积运算,而映射到高维空间后的内积运算又恰好可以通过核函数在低维空间中直接求得,故而有了核函数的由来。较常用的核函数是高斯核,高斯核可以将低维空间映射到无穷维。

运用核函数后,最优化问题的目标函数和约束条件变为:

支持向量机的原理介绍

序列最小优化 (Sequential minimal optimization)

到目前为止,优化问题已经转化成了一个包含 N 个 alpha 自变量的目标变量和两个约束条件。由于目标变量中自变量 alpha 有 N 个,为了便与求解,每次选出一对自变量 alpha,然后求目标函数关于其中一个 alpha 的偏导,这样就可以得到这一对 alpha 的新值。给这一对 alpha 赋上新值,然后不断重复选出下一对 alpha 并执行上述操作,直到达到最大迭代数或没有任何自变量 alpha 再发生变化为止,这就是 SMO 的基本思想。说直白些,SMO 就是在约束条件下对目标函数的优化求解算法。

为何不能每次只选一个自变量进行优化?那是因为只选一个自变量 alpha 的话,会违反第一个约束条件,即所有 alpha 和 y 值乘积的和等于 0。

下面是详细的 SMO 过程。假设选出了两个自变量分别是 alpha1 和 alpha2,除了这两个自变量之外的其他自变量保持固定,则目标变量和约束条件转化为:

支持向量机的原理介绍

将约束条件中的 alpha1 用 alpha2 表示,并代入目标函数中,则将目标函数转化成只包含 alpha2 的目标函数,让该目标函数对 alpha2 的偏导等于 0:

支持向量机的原理介绍

可求得 alpha2 未经修剪的值:

支持向量机的原理介绍

之所以说 alpha2 是未经修剪的值是因为所有 alpha 都必须满足大于等于 0 且小于等于 C 的约束条件,用此约束条件将 alpha2 进行修剪,修剪过程如下:

支持向量机的原理介绍

由此得:

支持向量机的原理介绍

分两种情况讨论:

情况 1.当 y1 等于 y2 时,有:

支持向量机的原理介绍

情况 2.当 y1 不等于 y2 时,有:

支持向量机的原理介绍

修剪后,可得 alpha2 的取值如下:

支持向量机的原理介绍

由 alpha2 和 alpha1 的关系,可得:

支持向量机的原理介绍

在完成 alpha1 和 alpha2 的一轮更新后,需要同时更新 b 的值,当 alpha1 更新后的值满足 0<alpha1<C 时,由 KKT 条件得:

支持向量机的原理介绍

由于篇幅有限,在此就不把推导过程一一列举,可得:

支持向量机的原理介绍

同样的道理,当 alpha2 更新后的值满足 0<alpha1<C 时可得:

支持向量机的原理介绍

若更新后的 alpha1 和 alpha2 同时满足大于 0 且小于 C 的条件,那么 b 就等于 b1 等于 b2;否则,b 取 b1 和 b2 的中点。

那么问题来了,如何选择 alpha1 和 alpha2 呢?

选择违背下列 KKT 条件推导结果的 alpha 作为 alpha1:

支持向量机的原理介绍

为了让每次变化尽可能大,alpha2 的选择满足如下式子最大,即步长最大化:

支持向量机的原理介绍

其中 E 是上面提到过的预测值和真实值差值的绝对值,也就是误差值。

按上述方法不断选择一对 alpha 并更新,直到达到最大迭代次数或所有 alpha 都不再变化,则停止迭代。有朋友就会问,求出 alpha 之后呢?如何判断新样本数据属于 1 还是-1 呢?

别忘了,在最优化求解一节,我们得到了如下:

若 f(x)大于 0,则新样本数据属于 1;否则,新样本数据属于-1。

可以见得,求出 alpha 后,所有问题都迎刃而解了。

以上是关于支持向量机的原理介绍的主要内容,如果未能解决你的问题,请参考以下文章

支持向量机

支持向量机原理 线性支持向量机的软间隔最大化模型

机器学习之支持向量机:支持向量机的Python语言实现

支持向量机原理

支持向量机的理论基础

支持向量机原理介绍