通俗易懂的解释支持向量机

Posted

tags:

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

参考技术A

作 者: Wang Shuyang
     a bachelor\'s degree candidate.

导 语 :相信有很多刚入坑机器学习的小伙伴会和我一样,感觉 SVM 是一道劝退的坎儿,而消除恐惧的最好办法就是微笑着面对它,本篇文章中我会用朴实的“人话”帮助大家迈过这道坎!

本文成文思路如下:
1.SVM原始模型构建
2.对偶形式的推导
3.求解的方法
4.软间隔SVM及核方法
5.SVM优缺点及应用

首先,让我们来对SVM产生一个直观的认识: 支持向量机(Support Vector Machine,SVM) ,二类分类器,它最终能告诉你一个东西是属于A还是属于B。在由样本点构成的向量空间内,SVM通过找到一个可以将两类数据正确分隔在两侧的划分超平面,达到对数据分类及预测的效果。而这个超平面是通过支持向量确定的,机的意思呢就是算法,故支持向量机就是通过支持向量确定划分超平面,从而做到分类及预测的算法。

SVM由线性分类开始,所以我们首先来了解一下什么是线性可分。简单来说,在二维空间上,两类点能够被一条 直线 完全分开则叫做线性可分。如下图左边是线性不可分的,而右边即为线性可分。

数学上我们可以表述为:对于 n 维欧氏空间中的两个点集 和 ,若存在 n 维向量 和实数 ,使得: 满足 ,而 满足 ,则称 和 线性可分。

给定线性可分的训练样本集 , ,线性分类器将基于训练样本 在二维空间中找到一个超平面来正确划分两类样本。显然,满足条件的超平面有很多,而我们旨在找到鲁棒性最好的。

首先,我们要明确该模型中 “距离” 的概念。由于划分超平面并不确定,所以我们需要比较同一个点到不同超平面的距离,为了使之具有可比性,我们使用 欧式几何距离

相信大家不陌生的是,一个二维空间点 到直线 的距离公式为:

而扩展到 n 维空间后,点 到超平面 的距离公式为: ,其中

既然我们要找出与两类数据间隔最大的划分超平面,很直观地就会考虑从两类数据最靠近的地方下手,因为它们各自最边缘位置的点才有可能成为最靠近划分超平面的那几个点,而其他点对确定超平面的最终位置是起不了作用的,所以我们认为是这些边缘点支持了超平面的确立。而在数学里点又可以叫向量,比如二维点 (x, y) 就可以看成是一个二维向量,同理 n 维点就是一个 n 维向量,所以我们将这些有用的边缘点称为 “支持向量”(support vector)

如图2所示,标红的点就是支持向量,它们确定出了两条虚线,我们称之为 “支撑超平面” ,并将它们之间的距离称为 “间隔”(margin) ,用希腊字母 表示,而它们“正中间”的位置就是我们要找的最优划分超平面的位置。显然, 间隔 越大我们的划分超平面鲁棒性就越好。所以在开始推导SVM的原始公式之前,请在脑海里跟我默念三遍SVM的核心思想 —— “ 最大化间隔!”

假设超平面 能将训练样本 正确分类,那么任一数据点 到该超平面的距离为: 显然 ,否则超平面变为 ,失去意义。

考虑到此式中含有绝对值会对后续数学计算带来不便,所以我们利用数据点自带的标签 去绝对值。结合1.1.1中讲过的线性可分的数学定义可知:

所以任一数据点到超平面的距离可表示为: 则最接近超平面的距离为: 调整平面位置,找到最大距离: 则最大间隔为: 至此,我们已经将问题用数学语言表述出来了,即要找到一组使得 最大的 确立最优划分超平面,但形式上任较为复杂。

我们知道,对于二维空间中的一条直线 ,等比例地放缩 是不影响它的位置的,比如 仍代表同一条直线。

扩展到 n 维空间中,等比例地放缩 也是不影响解平面 位置的。又已知 (超平面外一点与之距离大于 得出),所以我们不妨令 表达式中的 ,则问题简化为,求: 显然,最大化 等价于最小化 ,为了便于求导,我们继续将问题转化为,求: 至此,我们便得到了SVM的基本型。

介绍了这么多,但构建出来的模型到底能不能用呢?接下来,我们就从理论上验证它的可行性。

定理 :若训练数据集 线性可分,则可将 中的样本点完全正确分开的最大间隔划分超平面 存在且唯一

证明
(1)存在性
由于训练数据集线性可分,又目标函数存在下界,所以必存在最优解,由此得知最大间隔划分超平面的存在性。
(2)唯一性
首先证明最优解中 的唯一性。假设存在两个最优解 和 ,由目标函数的形式可知必有 ,其中 是一个常数。令 ,则 必然也是一个可行解,试想两个可正确划分样本点的超平面中间夹的一个超平面必然也可以正确划分样本点。但由于 不一定是最优解,则有 (中间那个“ ”关系由 “三角形两边之和大于第三边” 拓展到 n 维得到)。
由上式可得, ,从而有 , (想象若强行令三角形两边之和等于第三边,则三条线段将会共线)。若 ,则 ,与 是可行解相矛盾;因此必有 ,则 , 的唯一性得证。
接下来证明 的唯一性。假设存在两个最优解 和 ,不妨设 和 对应的 值都为 ,且它们分别是两个最优解的 支撑超平面 上的点,满足与自己对应的划分超平面距离为 ,即满足 同时与另一个划分超平面距离大于等于 ,即 整理得出 所以 带入第一对等式方程即可得 ,则 的唯一性得证。
至此,我们得知SVM基本型的最优解存在且唯一。

线性可分支持向量机——最大间隔法(maximum margin method)

输入 :线性可分训练数据集 ,
      其中 , , ;
输出 :最大间隔划分超平面和分类决策函数;

(1)构造并求解约束最优化问题:     求得最优解 ;
(2)由此得到划分超平面:     分类决策函数:

首先顺带一提,上面的基本型是一个凸二次规划问题,可以直接用现成的优化计算包求解。但若利用“对偶问题”来求解会更高效,所以我们来推导SVM的对偶形式。

拉格朗日函数是 拉格朗日乘子法 的核心组成部分,此法思想为:将 有约束 优化问题从形式上转化为等价的 无约束 优化问题。(建议对此法陌生的同学进去看看图文并茂的讲解)

优化问题存在很多形式,比如目标函数有求最大值的,也有求最小值的;约束条件有用大于式表示的,也有用小于式的。而上面说到凸优化问题具有 “局部最优值必定是全局最优值” 这一良好性质,所以我们可以通过移项将SVM基本型写成凸优化问题的标准形式: SVM原始形式: 只含有不等式约束,将其改写成: 则其拉格朗日函数为: 接下来到了关键的一步,所以我们需要再明确一遍,将问题改写成拉格朗日函数仅仅只是从形式上改变它,而实质上必须是等价的。那么接下来我要说明以下两个问题是等价的:
① 求 ,在 这个条件下;
② 求 ,在 这个条件下;

从问题②入手,当它满足自身约束条件时,拉格朗日函数 表达式中的累加项内容为非负常数 和 的乘积,那么欲求其最大值必须满足 ,否则调整 可以达到无穷大,失去意义,所以我们发现问题②是自带问题①的约束条件的(这里希望读者可以从中体会原始规定不等式约束的拉格朗日乘子 的巧妙);
接下来我们会注意到, 作为一个非正项,其最大值就是 ,所以求 的值就是求 的值。至此,我们发现问题②是与问题①等价的。
所以我们可以将原问题做如下转变:

这时我们再用上凸优化问题的强对偶性,即不管局部还是全局都只有同一个最优解,可将极小极大的求解顺序换成求极大极小以便于运算:

前面点开了 朗格朗日乘子法 这个链接的同学可能会发现,其中介绍的是仅含有等式约束的优化问题。实际上此法的原始形式中就只包含等式约束,而为了将其泛化到可求带有不等式约束的优化问题,我们引入 KKT条件

首先来看不等式约束优化问题最简单的形式:
其对应的拉格朗日函数为: 我们利用图形来对其产生一个直观的认识:

图中画出了目标函数 的等高线和约束区域 ,我们的可行解(相当于局部最优解,在凸优化中即必为最优解)需落在约束区域内,且最接近 的 “中心”,即无约束解。至于无约束解和约束区域的相对位置,有以下两种可能:

此时,可行解 在 内取到无约束解,必然满足 ,相当于失去这一约束,即 中的拉格朗日乘子 取为 。

此时,可行解 必然落在约束区域的边界上,即满足 。至此我们可以得到一个 重要的结论 (记为 “结论 ” ),即无论哪种情况下都有: 接着继续考虑可行解 落在边界上的位置,为了尽量靠近无约束解,直观上我们就可以看出,必然要取无约束解与约束区域中心的连线交于边界上的那一点。从函数梯度方面来考虑的话,目标函数的负梯度方向(下图中蓝色小箭头 )应远离约束区域朝向无约束解,即我们要找到目标函数的负梯度方向与约束函数的梯度方向( )相同的那一点: 也即:

这里我想举一个例子帮助大家理解:假设山坡上有一只被圈养的小羊,它想去山顶看看,但不幸的是有一圈栅栏限制了它的活动范围。所以它只能沿着栅栏走到尽可能靠近山顶的位置,然后望着山顶咩咩叹气。这里的山顶便是目标函数的无约束解,栅栏便是约束函数的边界,此时羊头的朝向一定是指向山顶的,且与栅栏的梯度同向。

回到凸优化问题的标准形式: 列出拉格朗日函数得到无约束优化问题: 结合之前的分析,我们将可行解 需满足的条件汇总,即为 “KKT条件”(Karush-Kuhn-Tucker Conditions)

            ①
      ②
    ③
     ④
    ⑤

这一组方程看似很复杂,但其实很好理解:
①式:拉格朗日函数取得可行解的必要条件(羊爬山的例子);
②式:不等式约束对应的拉格朗日乘子的初始条件;
③~④式:优化问题的初始约束条件;
⑤式:前面得到的那个 重要“结论 ”

总结一下, KKT条件 是“一个凸优化问题存在最优解”的充要条件,通过KKT条件我们即可求得凸优化问题的最优解。用数学语言表述一下就是:
若目标函数 和不等式约束 都是凸函数,而等式约束 是仿射函数(即形如 的线性函数),且不等式约束 的等号都能成立(这一条件称为 Slater条件 ),那么满足KKT条件的 点即为全局最优解。

在引入KKT条件之前,我们已经将SVM转化成了如下形式: 其中, 我们发现,求解 是可以利用KKT条件的。

对于 条件① : ,我们这里的变量为 和 ,所以有: 那么接下来我们就可以进行一波愉快的数学计算了。。。(还没学过 向量函数求导 的小伙伴们,快进来现学一下吧~) 通过这一波求偏导我们得到: 将其带入 即可得到最小值:

支持向量机

参考技术A 支持向量机(support vector machines,SVM)是一种二分类模型,它的基本模型是定义在特征空间上的 间隔最大的线性分类器 ,间隔最大使它有别于感知机;SVM还包括 核技巧 ,这使它成为实质上的非线性分类器。 SVM的学习策略就是间隔最大化 ,可形式化为一个求解凸二次规划的问题,也等价于正则化的损失函数最小值问题。SVM的学习算法就是求解凸二次规划的最优算法。

    它在手写识别数字和人脸识别中应用广泛,在文本和超文本的分类中举足轻重,因为SVM可以大量减少标准归纳和转换设置中对标记训练实例的需求。同时, SVM也被用来执行图像的分类,并用于图像分割系统 。实验结果表明,在仅仅三到四轮相关反馈之后,SVM就能实现比传统的查询细化方案高出一大截的搜索精度。除此之外,生物学和许多其他学科都是SVM的青睐者,SVM现在已经广泛用于 蛋白质分类 ,现在化合物分类的业界平均水平可以达到90%以上的准确率。在生物科学的尖端研究中,人们还使用支持向量机来识别用于模型预测的各种特征,以找出各种基因表现结果的影响因素。

SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面 。如下图所示, 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机), 但是几何间隔最大的分离超平面却是唯一的。

超平面与最近数据点之间的距离成为边距。可以将两个类分开的最佳或最佳超平面是具有最大边距的线。只有这些点与定义超平面和分类器的构造有关。这些点称为支持向量。他们支持或定义超平面。实际上,优化算法用于找到使裕度最大化的系数的值。

SVM的三层理解:

(1)线性可分支持向量机、硬间隔

(2)线性支持向量机、软间隔

(3)非线性支持向量机、Kernel SVM

支持向量机模型存在三宝:

(1)间隔:是指样本点到超平面的距离。 硬间隔 是指对给定的样本数据集中所以的样本都能正确分类。对于线性不可分的样本集,无法满足线性可分支持向量机的不等式约束,也就是不存在对所有样本都能正确分类的超平面。这种情况可能是因为问题本身是非线性的,也可能问题是线性可分的,但个别样本点标记错误或存在误差而导致样本集线性不可分。

因此,我们可以允许对少量的样本分类错误, 容忍特异点的存在,而对于去除特异点的样本集是线性可分的,这时称为软间隔 。

(2)对偶

(3)核技巧

支持向量机和感知机在某些方面很相似,其相同点 :

(1)都是二分类模型

(2)都是通过一个分离超平民啊对特征进行分类

不同点:

(1)SVM是特殊的感知机

(2)感知机是用误分类最小的策略,求得分离超平面,这时存在无穷个解,感知机利用间隔最大化求得最优分离超平面。如下图所示。

    图中的蓝色和黄色圆点分别表示正负样本,对于这个二分类,从图中我们可知,在最上面的黄线和最下面的绿线之间的线条都是可以把训练样本集完全分开的,这就是感知机的原理,通过这些分离超平面把训练集分开,这样的分离超平面存在很多条,比如图中的虚线,从视觉上中间那条实线应该是众多线条中最优的一条,感知机对于学习的分离超平面由于优化算法、学习率等不同因素,会随机地学习到这众多分离超平面的一条,当学习到的是靠近上下边缘的分离超平面是,对于一个未知样本,当这个样本稍微浮动一下,模型就很可能对他进行误分类了,因此鲁棒性很低,而支持向量机的目标是找到图中中间那条最优的分离超平面。

为求解支持向量机的最优化问题,我们将公式10作为原始问题,应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解,这就是支持向量机的对偶算法。 在约束最优化问题中,常常利用拉格朗日对偶性将原始问题转换为对偶问题,通过解对偶问题而得到原始问题的解(最优解是反的,值是一样的 ) 。这是因为:

    1)对偶问题的对偶是原问题

    2)无论原始问题与约束条件是否是凸的,对偶问题都是凹问题,加个负号就变成凸问题了,凸问题容易优化。

    3)对偶问题可以给出原始问题一个下界

    4)当满足一定条件时,原始问题与对偶问题的解是完全等价的

LinearSVC()类的主要参数:

(1)C: float, default=1.0, 惩罚系数,必须大于0,默认值1.0。用于设置对错误分类的惩罚强度,对于设置对错误分类的惩罚强度,对于完全线性可分的硬间隔问题不需要设置。

(2)fit_intercept: boolean, optional(default=True):是否计算截距,默认为True。如果数据均值为0,则可以选择False不计算截距。

(3)multi_class: string,”ovr“ or "crammer_singer"(default='ovr'):多类别分类策略开关。对于多元分类问题,选择'ovr'将使用多类别策略(one-vs-set)直接对多个类别进行分类(默认方法);选择"crammer_singer"将主次进行二值分类。

(4)class_weight:dict or "balanced", default=None,特征变量的加权系数。用于为某个特征变量设置权重,默认所有特征变量的权重相同。

结论:1)线性核,尤其是多项式核函数在高次项时计算非常缓慢。

            2)rbf和多项式核函数都不擅长处理量纲不统一的数据集

这两个缺点都可以由数据无量纲化来解决。因此,SVM执行之前,非常推荐先进行数据的无量纲化!

svc.score(): 返回给定测试数据和标签的平均准确度。

    首先,分类模型天生会倾向于多数的类,让多数类更容易被判断正确,少数类被牺牲掉 。因为对于模型而言,样本量越大的标签可以学习的信息越多,算法就会更加依赖于从多数类中学到的信息来进行判断。如果我们希望捕获少数类,模型就会失败。 其次,模型评估指标会失去意义 。这种分类状况下,即便模型什么也不做,全把所有人都当成不会犯罪的人,准确率也能非常高,这使得模型评估指标accuracy变得毫无意义,根本无法达到我们的“要识别出会犯罪的人”的建模目的。

    所以现在,我们首先要让算法意识到数据的标签是不均衡的,通过施加一些惩罚或者改变样本本身,来让模型向着捕获少数类的方向建模。然后,我们要改进我们的模型评估指标,使用更加针对于少数类的指标来优化模型。 要解决第一个问题,我们在逻辑回归中已经介绍了一些基本方法,比如上采样下采样 。但这些采样方法会增加样本的总数,对于支持向量机这个样本总是对计算速度影响巨大的算法来说,我们完全不想轻易地增加样本数量。况且,支持向量机中的决策仅仅受到决策边界的影响,而决策边界仅仅受到参数C和支持向量的影响,单纯地增加样本数量不仅会增加计算时间,可能还会增加无数对决策边界无影响的样本点。因此在支持向量机中,我们要大力依赖我们调节样本均衡的参数:SVC类的class_weight和接口fit可以设定的sample_weight。

    混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用。在混淆矩阵中,我们将少数类认为是正例,多数类认为是负例。在决策树,随机森林这些普通的分类算法里,即是说少数类是1,多数类是0。在SVM里,就是说少数类是1,多数类是-1。普通的混淆矩阵,一般使用0,1来表示。混淆矩阵中,永远是真实值在前,预测值在后。

ROC曲线及相关问题

    基于混淆矩阵,总共有六个指标:准确率Accuracy,精确度Precision,召回率Recall,精确度和召回度的平衡指标F measure, 特异度Specificity,以及假正率FPR。

    其中,假正率有一个非常重要的应用:我们在追求较高的Recall的时候,Precision会下降,就是说随着更多的少数类被捕捉出来,会有更多的多数类被判断错误,但我们很好奇,随着Recall的逐渐增加,模型将多数类判断错误的能力如何变化呢?我们希望理解,我每判断正确一个少数类,就有多少个多数类会被判断错误。假正率正好可以帮助我们衡量这个变化。相对的,Precision无法判断这些判断错误的多数类在全部多数类中究竟占多大的比例,所以无法在提升Recall的过程中也顾及到模型整体的Accuracy。因此, 我们可以使用Recall和FPR之间的平衡,来替代Recall和Precision之间的平衡,让我们衡量模型在尽量捕捉少数类的时候,误伤多数类的情况如何变化,这就是我们的ROC曲线衡量的平衡 。

    ROC曲线,全称The Receiver Operating Characteristic Curve。这是一条以下不同阈值下的假正率FPR为横坐标,不同阈值下的召回率Recall为纵坐标的曲线。

优点:

(1)有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题

(2)解决小样本下机器学习问题;

(3)能找出对任务至关重要的关键样本(即:支持向量)

(4)采用核技巧之后,可以处理非线性分类/回归任务;可以解决高维问题,即大型特征空间;

(5)最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了”维数灾难“。

缺点:

(1)训练时间长。当采用SMO算法时,由于每次都需要挑选一对参数,因此时间复杂度 ,其中N为训练样本的数量;

(2)当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 。对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;

(3)对于核函数的高维映射解释力不强,尤其是径向基函数;

(4)模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

(5) 对缺失数据敏感;

因此支持向量机目前只适合小批量样本的任务,无法适应百万条甚至上亿样本的任务 。

    SVM主要用于分类问题,主要的应用场景有字符识别、面部识别、行人检测、文本分类等领域。 在机器学习领域,SVM是有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析 。

以上是关于通俗易懂的解释支持向量机的主要内容,如果未能解决你的问题,请参考以下文章

通俗讲解支持向量机

支持向量机

支持向量机

支持向量机

教程 | 详解支持向量机SVM:快速可靠的分类算法

支持向量机