继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【机器学习经典算法】真正的SVM简明(傻瓜)教程!

慕神8447489
关注TA
已关注
手记 1273
粉丝 174
获赞 956

前言,一些必要的说明

如果你精通机器学习算法,或高数极好,热爱数学推理和公式——那么这篇文章不适合你。写这篇的初衷是:SVM是一个经典的机器学习算法,在面试里也经常被考到,所以我希望自己能够了解到它最核心的一部分理论,并且可以使用在简单的算例里。然而,我在搜索引擎上所见到的所有讲SVM的文章里,都太过于重视推导了(其实还是因为自己数学太渣),密密麻麻的公式一层层逻辑严谨地推下来,我一定跟不到最后就已经绕晕在符号的海洋里。所以,我决定把自己所学到的SVM用浅显的语言表诉出来,在写的过程中也加深一下自己的理解,何乐而不为呢?那么现在就开始吧。
若有内容不清晰或错误请指出,鞠躬。

SVM是什么?

"在问为什么之前,先要明白是什么。"
SVM的英语是 Support Vector Machine,字面意思直接翻译过来就是支持向量机,其中machine是指算法,而support vector就是这个算法中非常重要的部分——待会儿会讲。
这个支持向量机做的事情,就是二分类——黑的一类,白的一类;叉号一类,圆的一类,好的一类,坏的一类……等等。二分类问题是常见的机器学习问题,而我们知道:在一个平面上有两堆点的时候,而这两堆点又分得很开的时候,一条直线就足够把它们划分开。这里面的代表性算法就是线性判别分析(LDA)模型。线性SVM在二位空间里做的也是一样的事。
那我们先从线性SVM讲起。
引入一个简单的小公式——初中难度:

webp


好吧比初中稍微难一点,多的部分就是矩阵运算。但是本质上跟y = ax + b 是一样的。在这个过程中我们需要找到a 和 b的值——在线性判别分析里,这个值是学到的,而在SVM里,这个值是通过数学计算得到的。计算的过程我们待会儿再讲,先来说一下SVM基本思路:
我们想要找到一个合适的分类超平面(在平面是一条直线),把所有数据分成两类:我们希望所有叉号图案在一类里,所有圆形在另一类里。
看下面的这张图,你觉得哪条线表现更好?

webp


两条线都成功分开了这两堆数据(本来也分得很开……)但是显然实线更出色,因为它不仅正确分开了不同类的数据,还离两边都足够远。

现在我们来谈谈为什么?

现在可以给SVM下一个定义了(两步走):

  • SVM是寻找到一个超平面把数据准确分成两类

  • 并且这个超平面要离两类数据最近的数据点越远越好

聪明的你大概已经猜到所谓的“支持向量”是什么东西了——没错!它就是两堆数据中距离最近的点(或点们),那些最容易混淆的点。
那么怎么判断超平面离这些点的距离是远还是很远还是非常远还是不够远呢?这里需要引入一个小概念——间距——就是衡量超平面到支持向量的距离。

那么,请牢牢记住现在我们的两个小目标:
1. 二分类的过程中类别不能错。
2. 找到间距最大的那个超平面。

好啦,如果你不需要任何算法方面的要求,只需要直接用工具包/吹牛/了解一下的话,你对SVM的了解已经够了。再见!

废话太多,开始线性SVM

万事开头难,我们先从简单的开始。
刚才的式子还记得吧。x是我们输入的数据,y是数据标签。我们当然希望:在我们超平面(好啦,这条普普通通的直线)一边的所有x得到的y值,都大于零;在另一边的y,都小于零;在这条线上,都等于零。完美!
可是怎么才能得到这条线呢?
我们在这条线旁边又平行地画两条线,这样:

webp


这两条线是画在支持向量上的,而我们最终要的超平面(线……)就在这两条线的正中间,想想很好理解吧?这样就能保证间距最大啊。
所以我们现在需要的就成了:在两条线上的点,一边y等于1,另一边等于-1(为什么是1不是0.5/0.2/0.0001?因为比较方便……)其它离得更远的点,那就可以往正负无穷随意延申。


现在我们来加一点美妙的数学!千万不要跳!保证能懂!

把上面的文字转化成数学语言:


webp


webp

曾有一位伟大的哲学家说过,少即是多,一个总比两个好(编的)。两个式子总得统一起来才好进行接下来的推导,不然还得分情况。于是我们用到了小学数学:负负得正!

webp


耶!解决了,现在这个值无论如何都得是大于1的正数了。
还记不记得上面提到的两个条件?现在条件一的求解公式有了,还剩下条件二了。
我们的间距怎么求呢?
一个简单的小公式。

webp


一道杠的又是小学知识,是y的绝对值,两道杠就是,(好像初中学的?)是向量的长度。这么做的原因是当数据等比例扩大或缩小的时候,我们的间距也会具有比较意义(不然你每个值同时乘以二距离变四倍了其实一点意义都没有。)
对于支持向量而言,它们距离超平面的间距就是:

webp

因为y = +-1嘛负数又没有意义


我们想要这个Z值最大,那||w||就得最小,OK了~

webp

我们要这个!


webp

这个和上面等价,就是为了计算证明方便,不要问为什么


现在两个小目标的求解条件都列出来了:


webp

现在我们要再多加一点儿美妙的数学……相信自己,你可以的

恭喜你刚刚跟我一起走完了第一步:列出求解公式!
这个公式是一个带约束的优化问题。这个公式的求解可以用美妙的拉格朗日乘子法来解决~(回想起被高数的阴影笼罩的日子……)
好啦没事,你大概跟我一样也不记得这到底是个什么东西,简单地说,就是:

把等式约束h_i(x)用一个系数与f(x)写为一个式子,称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值。

说人话,就是引入一个系数把上面式子的两部分统一起来,然后对每个变量求偏导,然后从几个可能结果里找到最优值。再简单点,就是求偏导啦。
再最后看一眼上面的式子:
这里面我们想要优化的变量有哪些呢?
变量x和y是没办法优化了,你还能改数据咋的?可以优化的部分就是我们要的系数wt,w0(原谅我,打公式好累)
再加上一个拉格朗日系数,套公式,好了:

webp

美妙的拉格朗日约束公式~


这里的λi都是正数,我们现在的目标是要求L的最小值
接下来就是一些简单的偏导计算啦:我们先对w求偏导,令结果为0;然后对w0求偏导,令结果为0 。(偏导的过程也不是很难……就……高数上册了解一下?)


webp

L对w的偏导


webp

L对w0的偏导

这样我们就得到了λ和x,y的两个约束关系式。然后我们还有两个条件:在上面的拉格朗日约束式里,第一项一定是非负的,第二项我们需要它越小越好这样才能得到总体结果的最小值。以及λ需要非负(不然就没有意义了)。
所以,我们把四个求解条件汇总一下:


webp

美妙的拉格朗日约束条件~

恭喜你终于走到了这里!你看现在问题是不是已经很简单了?只需要求这三个线性的等式再加上满足第四个条件,我们就可以得出λ,w和w0的值了!

美妙的数学!

对上述可能结果的进一步说明

假如说我们算出来所有的λi都等于零,说明什么?
说明这个问题没办法用支持向量机解决因为不存在支持向量。
我们再来看一下第三个约束条件:

webp


说明什么?
说明求解w只与支持向量有关啊!


Talk is CHEAP, show me the example!

我们来学以致用,用一道简单的例题来帮助我们更好地理解线性SVM模型,光学公式是永远不会用滴!

Example is here :)

现在我在平面上有八个点,分别落在class1 和class2里:

webp


在二维坐标里作图是这样的:

webp

黑色是class1,红色是class2


我们肉眼一看,线性可分呐!SVM可以用了!
那我们就来设计一个简单的线性分类器吧。
首先,找出处在边界上的点,啊不对,支持向量:


webp

红圈儿的地方


这三个向量的λ(按照顺序数下来是向量1,2,5)我们是需要求解的,其他的向量我们就不管了。
我们定义黑色点的标签值为1,红色为-1.
然后愉快地带公式到上面四个约束条件里~

先从

webp


开始。
得到:


webp

但是现在还没有什么用,我们只是知道了要想求w就得先求出三个λ值。那么怎么求呢?我们来看一下约束条件。
因为:


webp


可得三个联立公式(做一下矩阵运算把x,y带进去,注意y正负号,我这里把步骤都省略了),化简得:


webp

x = x1


webp

x=x2


webp

x=x3


再带入

webp


得到:


webp


然后就是愉快地求解四元一次方程啦~
得到三个λi值以后,再带入第一个式子得到w值,完成。

webp

最终得到的超平面


webp

w值

嗯……嗯????x = 2!!!你在逗我?这个我一秒钟肉眼就看出来了!解那么多方程干嘛!
好啦不好意思,例题只是说明一种方法……逃

————————————————————————————————————————————
拖了一周多了,来填坑~

线性不太可分的软边界SVM

以上我们得出了超平面,很好那来了一个新数据只要带进去算一下,看看是不是等于1或者-1就好了呢。
这里有两种分类法:硬分类软分类
硬分类就是只要大于0我就把它丢掉一类,小于零就丢进另一类;软分类就是把-1-1之间这个区间做一下平滑处理,具体的分类还要根据函数值决定。

下一个问题是,哪有数据每次都正好全都可以分开呢?万一,两组数据正好有几个点出现在离边界点比较近的地方怎么办?
答案就是:条件稍微放宽一点啦。

webp

一个栗子


比如上面这张图片里的,出现了几个坏家伙,虽然大部分数据都是特征鲜明地出现在两类里,也不太能够找到合适的分界面。
这些数据我们可以分成三类:


  1. 老老实实呆在离支持向量很远的。

  2. 不是很老实,已经超越了支持向量的边界,但总的来说还处在正确的分类中。

  3. 越过了超平面,去到了它并不属于的另一类里。



以上后两个类别其实说的是同件事儿的不同程度,就是它们的

webp

值都没有超过1,只不过程度不同,所以我们可以用一个式子来把这三种情况统一起来(一个总比两个好)。

webp

一统公式

咦,这里出现了一个长尾巴,不要慌,它叫做松弛变量。松弛呢,就是指要是不满足条件的话,我把要求稍微给你降一下,不要求你一定得大于1了。对于以上三种情况,松弛变量的结果也不一样。对于情况1就是0,对于情况3就要大于1了。

但是虽然要求降了,也不能没有底线啊。

我们的底线肯定是,错一个两个可以忍,错多了就不行。用数学来表达,就是

webp


这些松弛变量的和必须最小。
以上这个SVM的思想,就叫做软边界SVM


接下来需要加一点儿美妙……的数学

所以现在我们的超平面求解公式就要加上松弛变量的影响了。

webp

事情好像变得越来越不简单

其实不要被这个式子吓到了,返回去看看线性可分SVM,就是多了一些限制条件而已。这个式子里没有出现过的内容就是C了,但它也不是一个高大上的东西,只是代表一个常数,用来控制松弛变量部分的影响。简单来说就是,这个C值越大,说明松弛变量看得越重,那错误分类的容忍度就越小
老规矩,还是要用拉格朗日乘子来求解。

webp

这是什么鬼东西啊


μ是对ξ的系数,剩下的就跟之前的简单式子差不多~(说得很轻松的样子,其实是因为我快阵亡了)

但是不要慌,虽然变量这么多,我们来看看求偏导。
对w求偏导,很好,跟松弛变量没关系,所以结果还是一样。对w0求偏导也是。

webp

webp

再对ξ求偏导,会得到一个简单的式子。


webp


μ不需要求导了,只要代入就好,所以结果变成了:

webp

六个约束条件!计算请只看箭头右边

非线性SVM

那么你要问了,上面的例子都是可以直接线性可分,或者大部分都可分的,但是万一有那种完全不能用一个超平面直接分开的呢?


webp

这种情况怎么办?

待续……

              



作者:京酱玫瑰
链接:https://www.jianshu.com/p/a5744681aeca


打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP