历经一个月,终于搞定了SVM(支持向量机)-附源代码解析

历经一个月,终于搞定了SVM(支持向量机)-附源代码解析

前言

其实整体算下来,断断续续的也得有快两个月了(原谅博主比较笨)。中间也有好几次放弃,不想写这篇总结了,但是之前立下的誓言,要将学习到的每一个机器学习算法写成博客总结,一方面呢,检验自己是否真的明白了,另一方面,也希望自己的理解能够帮助到一些人。
源码已上传到GitHub上,有需要的小伙伴自取:源码地址,如果有帮到你,不要吝啬你的小⭐⭐

随便唠唠

1.支持向量机名字由来

因为这个算法的关键点就是支持向量,那么,什么叫支持向量呢? 就是离分割超平面(在二维中叫做分割线)最近的那些点。

img

看上面这个图,中间的实线就是分割超平面,两个虚线所经过的点就是支持向量。这时候大家可能又有疑问了,图b 和图c有什么区别呢? 我们可以看到,图b分割虚线和实线之间的距离比较大,而图c分割虚线和实线之间的距离比较小。SVM要找的就是使间隔最大。

2. 为什么很多书籍和老师都说支持向量机比较难呢?

原理我们从面上很好理解,就是找到使支持向量与分割超平面距离最大的实线即可。但是具体的数学推导,就需要大量的数学方面的知识,比如拉格朗日函数、凸优化、KKT条件、对偶函数。这些知识本身不算太难,但是难点就在于你能不能完整的从头到尾将这个思路理下来,这里我指的是用笔把公式推导下来。我认为还是挺难的,最起码对我来说。之前跟着博客大佬推了一遍公式,两天没看,第三天就立刻忘记了推到思路了,以及里面的一些步骤为什么那么做。

网络上有很多真大佬,写的非常详细,推导过程,以及使用的理论讲的非常清楚,但是,我看完之后,我觉得,这种方式对我这种水平比较低的人来说,不太友好,来来回回看了不下五遍,愣是没有形成一个完整的思路。

所以,在这篇文章中,我想以我的角度,去给有同样困惑的人带来一些帮助。这篇文章不会给你解释数学原理,但是我会在文末给你提供相应知识的链接。

3. 读懂源代码对我们的理解帮助非常巨大

我之前在学习K-mean算法和逻辑回归的时候,认为只要懂算法思想就可以了,并且这些算法思想本身也不复杂。

但是在我学习SVM的时候,我发现,源代码对我的帮助太大了。我当时遇到的问题是,我能够将公式推导完毕,但是不知道如何将数学公式理论和实际代码工程相结合,我相信这不仅是我薄弱的地方,也是许多新人薄弱的地方。也许文字对于算法思路的描述能够让我们感受到原来如此,那么,源代码对于算法思路的描述,能够让我们恍然大悟。这篇文章,我就主要带大家关联源代码和数学公式。

4. 学习机器学习算法是不是只明白思想就行,需不需要动手去写代码实现一下?

很多人跟我的答案肯定是一样的,那就是需要去实现一下。

原因大概有两点:其一,我们需要更加深入的了解算法原理。我们学习算法的目的我们得搞清楚,也许我们是做工程,需要了解大量得算法,在具体项目中选择合适的算法;也许我们是做研究,需要了解算法思想以及其优缺点,对算法进行二次开发改进;再或许我们只是为了了解思想,利用这个思想去思考这个世界,无论你属于哪一个,都需要对算法有一个更加深入的了解。现在有很多现成的机器学习工具包,使用起来非常方便,如果你对实现细节不清楚的话,对于特殊问题,就无法根据现有的算法接口进行定制化修改。

其二,提高我们的工程能力。所谓的工程能力,就是从原来一个想法,到最终实现的一个过程。有人说,我是搞研究的,只需要明白原理,不用写太多。那你告诉我,为什么公司招的都是算法工程师呢?即便是你去研究所工作,没有一定的工程能力,也是会有很大劣势的。

支持向量机公式推导

一、推导

我们单独拿出来图b

在这里插入图片描述

我们前面也说过了,我们需要找的就是使d值最大的的分割超平面。

首先超平面公式[见参1]:

在这里插入图片描述

w 为法向量,b为截距,法向量指向的一侧为正类,另一侧为负类。

分类决策函数公式:

在这里插入图片描述
函数间隔公式[见参2]:

在这里插入图片描述
函数间隔体现的是分类的正确性,如果h>0,表示分类正确,如果h<0,表示分类错误。同时也体现着数据点到超平面的远近。

几何间隔公式[见参2]:

在这里插入图片描述
几何间距体现的点到超平面的距离,这里和图中支持向量到超平面距离d的一样的。

我们同时将w和b等比例变化,超平面并没有发生改变。比如3w和3b。此时函数间隔也会相应的扩大3倍,但是对于几何间隔来讲,并没有发生改变。

我们要获得最大间隔,就需要几何间距达到最大:

在这里插入图片描述

前面我们提到,等比例变换w和b,超平面并不会发生改变,但是函数间隔会发生改变。此时,我们令函数间隔h=1,此时公式变为:

在这里插入图片描述
等价于:

在这里插入图片描述
等价的原因是求解这两个式子的目标都是一样的。

2. 推导

在推导1中,我们推导出了需要求解的公式,除了公式,它还有一些限定条件:

在这里插入图片描述
在这里插入图片描述

这里限定条件为函数间隔要≥1.原因是当函数间隔=1时,当前的数据点是距离超平面最近的点,这些点就是支持向量。所以,我们的数据点要满足,所有点的函数距离要≥1,也就是我们前面给定的1.。

如何把条件和公式结合在一块呢?这里用到了拉格朗日函数。我们使用拉格朗日乘子将条件和公式写到一起:

在这里插入图片描述

λ为拉格朗日乘子,λ≥0.

这里拉格朗日函数有一个性质,就是对偶性,根据对偶性,原始问题L的对偶问题为其极大极小问题

即 :

在这里插入图片描述
接下来我们对
在这里插入图片描述
进行计算:

在这里插入图片描述

将计算结果带入到式子中:

在这里插入图片描述
接下来计算
在这里插入图片描述

在这里插入图片描述

我们上面的计算先放在这里,我们先说一下KKT条件

前面我们使用了对偶函数来求解问题的解,但是原问题和对偶问题需要满足一定的条件才能等价,这个条件,就叫做KKT条件
C:\Users\86151\AppData\Roaming\Typora\typora-user-images

上述公式用在我们这里应该是这样的:

C:\Users\86151\AppData\Local\Temp\ksohtml25568

我们将上面的式子整理一下:

在这里插入图片描述
接着我们重写之前的分类决策公式**【源代码公式1】**:

在这里插入图片描述

3.推导-引入松弛变量

为什么要引入松弛变量?

答:很多数据集都是线性不可分的数据集,这意味着我们无法通过一个线性分类器(超平面)去实现数据的分类。同时,也就不能满足函数间隔大于等于1的约束条件(这个条件的前提数据是线性可分的),于是我们引入一个变量,这个变量就叫所松弛变量,去解决这个问题,具体解决办法看下面的公式。

我们令松弛变量为ε。

我们的公式约束函数和公式可修改为:

在这里插入图片描述
在这里插入图片描述
这里C称之为惩罚参数,当C的值很大时,对误分类的惩罚就越大。

然后改进后的拉格朗日函数是:

在这里插入图片描述
紧接着我们进行极大极小对偶问题处理:

在这里插入图片描述

在这里插入图片描述
最终化简形式为:

在这里插入图片描述

4. 推导3-SMO算法

SMO算法是现在运行速度非常快的强大算法,用于训练SVM。

它的主

  • 218
    点赞
  • 1073
    收藏
    觉得还不错? 一键收藏
  • 135
    评论
评论 135
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值