支持向量机(Support Vector Machine, SVM)是有监督分类算法。
一、SVM本质
(1)无数条分类线
例如下图左侧分散了两类点(星星、圆圈),想要找到一条分类直线,当输入新点坐标时,这条分类直线可以判断这个输入点是星星还是圆圈。
不过,观察右图可以发现这样的直线可以有无数条,哪条直线才是最优的分类直线呢?
(2)确信度
首先,我们需要引入“确信度”的概念:一个点距离分离直线的远近表示分类预测的确信程度。
当输入新点坐标,该点距离分类直线距离很近的话,判断该点为XX类是没那么确认的。如果该点距离分类直线距离很远的话,就比较确信预测结果是正确的。
(3)点到直线的距离
确信度本质是点到直线的距离,让我们来回顾一下距离公式。
求P到直线的距离:
【首先过P点画直线的垂线】
由于两直线垂直,斜率之积为-1,得垂线的斜率为;
由于垂线过P点,垂线公式为
·
【然后计算垂线和直线的交点Q】
经计算交点Q为:
·
【点与点的距离】
P到直线的距离等价与PQ两点的距离,参考勾股定理,
·
【备注】
三维空间点到平面的距离为
回顾上面的分类图,令分类直线为,其中,
代入上面点到直线的距离公式,得到任意点到该直线的距离为
其中
(4)几何间隔
二分类的算法结果要么为正类,要么为负类,在SVM里令正类,负类。
正类上的点到分类直线的距离为:
负类上的点到分类直线的距离为:
因此我们构建一个新函数,我们把叫做样本点到分类线的几何间隔:
如果点被正确分类,就是点到分类线的距离。如果分类错误,不管判断为正类还是负类,几何间隔就是一个负值。
整个训练数据集到分类线的几何间隔为:
训练数据集到分类线的几何间隔,就是离分类线最近点到分类线的距离。
(4) 最优分类线
让我们回到问题开始,什么样的分类线才是最优的分类线呢?肯定要让确信度尽可能的高吧,对最难分的点(离分类线最近的点)也要有足够大的确信度(距离尽可能大)。
就是说数据集到分类线的几何间隔最大的分类线就是最好的分类线。
·
二、最优分类线求解
假设给定空间上的训练数据为:
,其中,
(1)建立最优解
假设距离分类线最近点为,训练数据的几何距离为
我们的目标是获得最大几何间隔的分类线(最大几何间隔的w,b最优解)
如果我们令,那么,最优解问题就变成:
(2)简化问题
这个最优问题不好求解,假设令,简化一下问题。
由于之前我们令训练数据的几何间隔,令意味着我们假设训练数据的几何间隔为,意味着里分类线最近点到分类线的距离为
上图发现有两条虚线,虚线距离分类线的距离都是,虚线上的点到分类线的空间距离为: ,即正例方的虚线上的点满足,负例方的虚线上的点满足,我们把虚线上的点叫做“支持向量”。
简化后最优化问题为:
(3)最小化问题
我们一般还是喜欢求解最小化问题。求最大化等价于求最小化,因此最优化问题变为:
(4)拉格朗日乘数法
接下来我们就要求解最优的w,b值,引入神器“拉格朗日乘数法”。
拉格朗日乘数法
如果求解问题的格式为:,
经过拉格朗日乘数法的推导,可以将问题转换为求解:
,其中
其中。
转换最优解问题
通过加负号转换为,所以最优解问题可以转换为:
求解偏导
先求,我们知道有极大值或极小值的地方的斜率是0,所以我们先对w,b做偏导处理。
可见,代入,公式变为:
此时原始求解问题变成:
当然我们还是习惯求解最小值问题,转换后为:
SMO求解最优
到这一步原始最优化问题转变成求解最优问题,我们可以使用SMO(sequential minimal optimization,简称SMO)求解最优参数。
最优参数 w,b
求解最优的后,
根据上面偏导的计算结果,;
,最小值是在时,代入w后,计算得到
现在我们就有最优的分类线:
分类决策函数:
三、软间隔支持向量机
(1)硬间隔/软间隔
有的时候线性数据集中存在少量的异常点,由于这些异常点导致了数据集不能够线性划分。
我们通过引入软间隔的概念来解决这个问题。
支持向量机要求所有样本都必须划分正确,这叫做“硬间隔”;
而软间隔是允许一部分样本不满足约束条件的,但这样的样本要尽可能少[5]。
软间隔面向场景:数据集由于异常点的存在是线性不可分的(不能用一条直线划分两类样本),将这些异常点去除后,剩下的大部分样本点是线性可分的。
(2)松弛变量
在二.(3)
中我们经过一系列转换最后获得分类的最优解问题:
使得所有样本点都被正确划分,都在虚线上或虚线外。
软间隔支持向量机允许存在样本点被错误划分,所以我们引入松弛变量,使得。
点到分类线的几何间距,两条虚线到分类线的几何间隔,异常点到虚线的距离为。
如果。回顾点到分类线的几何间隔,两条虚线到分类线的几何间隔,也就是允许存在样本点在虚线里。
如果,点到分类线的几何间距,说明允许存在样本点被分类错误。
改进后的最优解问题为:
这里称为惩罚参数,。
(3)拉格朗日乘子法转化最优问题
继续套神器,转化最优解问题为:
对求偏导等于0
把相关值代入,问题变为求解:
当然,我们还是习惯求解最小值问题:
(3)最优解
根据计算出的最优值,从而计算最优的参数w,b
求得分离超平面:
分类决策函数:
四、核函数
有些分类是线性划分无法满足的,不管怎么控制松弛变量,几何间隔都无法成功划分。
(1)SVM的高维转换
SVM使用核函数解决线性不可分问题。
核函数就是把低维映射到高维的方式,实质就是x特征的重组,把一个低维不可分问题转换为高维可分问题。
例如上图显然二维空间是不可线性划分的,那就把输入的转换成高维空间的特征,例如,发现在高维空间是线性可分的,那就继续用上面的支持向量机求解最优分类函数。
(2)核函数
核函数K(kernel function)
就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射。<x, y>是x和y的内积[7]。
令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);
令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;
这样就实现了四维到更高维度的转换。
让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么:
f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;
f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;
<f(x), f(y)> = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024
= 4900.
如果我们用核函数呢?
K(x, y) = (5+12+21+32)^2 = 70^2 = 4900.
所以核函数kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。
支持向量机中假设输入的X映射到高维空间然后计算内积,但实际上核函数的使用,使得求解在低维空间上快速计算出目标内积。
参考资料
[1] 点到直线距离的七种推导公式:https://wenku.baidu.com/view/7f68a89cad02de80d4d840eb.html
[2] 拉格朗日乘子法:https://blog.csdn.net/loseinvain/article/details/78624888
[3] 支持向量机SVM之-SMO算法: https://blog.csdn.net/code__online/article/details/90518735
[4] SVM课程资料:https://www.bilibili.com/video/av39800693/?p=80
[5] SVM支持向量机—核函数、软间隔:https://www.cnblogs.com/luban/p/9516411.html
[6] 软间隔模型:https://www.jianshu.com/p/f8f09b638760
[7] 核函数:https://blog.csdn.net/kateyabc/article/details/79980880