前言:
关于SVM的一些学习心得,在去年就有写的冲动了,每次都是写了一点就坚持不下去了。导致这篇文章在草稿箱里待了好几个月,这次刚好老师让我们交一个关于SVM的小作业。于是在交作业deadline的压力下。花了小半天写完了这篇文章,是填坑,也是对于SVM的一些回顾。而且温故真的能知新,如果不能那就多温几遍~(本文参考李航老师是《统计学习方法》)
NOTE:不知道为什么用mathtype编辑的公式,导入不了。为了保持格式完整,涉及公式的部分我就用截图表示了
__________________________________正文开始_______________________________________________
了解SVM:
SVM(support vector machine) 翻译过来就是支持向量机。这是一种二分类模型,基本模型定义是在特征空间上的间隔最大的线性分类器。它与感知机的主要区别在于间隔最大。(感知机的超平面要求特征空间所有的点距离分离超平面的距离尽可能的小,但是感知机的置信度很低;SVM要求特征空间中距离分离超平面的最小距离最大化,这样的方式可以保障有足够大的置信度)。SVM的核心问题是使得间隔最大化,转化为数学问题就是凸二次规划问题的求解
因为感知机模型是SVM的重要基础,所以要简单介绍一下感知机模型:
感知机模型的最简单的描述如图1所示:
![0bd8e4c69ef7ef7b9cf00d816f2f65d4.png](https://i-blog.csdnimg.cn/blog_migrate/3ac623fe658ab3fe1f965bcf02e5a8ab.jpeg)
感知机听起来很高大上,其实上图就已经把感知机的基本要素概括了。
任务描述:在图1中,我们想用一条直线把蓝色的点和红色的点区分开来,那么该怎么做?
任务分析:我们从图中可得,蓝色的点和红色的点完全线性可分的。既然是线性可分的,那么就必然能找到函数S:
SVM分类:
按照数据是否可以线性可分,SVM可分为线性可分支持向量机,线性支持向量机,非线性支持向量机。
当训练数据完全可分时, 通过硬间隔最大化(hard margin maximization)学习到一个线性可分支持向量机;当训练数据近似线性可分时,通过软间隔最大化(soft margin maximization)学习到一个线性支持向量机; 当训练数据线性不可分时,通过核技巧(kernel trick)以及软间隔最大化,得到一个非线性支持向量机。
SVM的数学原理:
Note: SVM的损失函数是凸函数
一开始提到了SVM的和核心问题转化为凸二次规划问题,那么一般我们是怎么求凸二次规划问题的呢?
在高等数学中,我们对于求带约束的问题的通用方法是用拉格朗日乘子法。拉格朗日乘子法的求解流程大概包括以下几个步骤:
1. 构造拉格朗日函数
2. 解变量的偏导方程
3. 求得的参数代入目标函数
对于等式的约束问题描述如下:
![cb530e0dfb50f5cd6f6d0c16e9088dc6.png](https://i-blog.csdnimg.cn/blog_migrate/07b8d053d868654c67a04eff4fca96cb.png)
其中的关键在于构造拉格朗日函数,后面求解实际上就是高数里面基本的求偏导数的问题了。那么我们怎么构造拉格朗日函数呢?其实很简单,直接写成原函数+拉格朗日乘子*约束函数。即:
![d37b582d008c579a2ec67ba6dc64e515.png](https://i-blog.csdnimg.cn/blog_migrate/c406da1fbd8a3d07d6f3cd4d881c5f05.png)
![3fab55b7c6c1055b4658a43c87b5063c.png](https://i-blog.csdnimg.cn/blog_migrate/ecd49da8840f0f111f2d4c5e48f73c2b.jpeg)
那么同理对于约束条件是不等式的情况,问题描述如下:
![f9d552ec96f1079db54a73f1b9a602bc.png](https://i-blog.csdnimg.cn/blog_migrate/a20267c7ed4c773142e9b16bb56c84c5.jpeg)
既然我们已经谈到极小极大问题了,那么就可以很自然的谈一下它的对偶问题:极大极小问题。
首先,给出结论,在满足一定的条件下(就是传说中的KKT条件)下,神奇的事情发生了。凸二次规划的极大极小形式和极小极大问题等价。
先来介绍一下极大极小问题:
![e1cc3ff17ddcdba5ab6dedf20fe1808c.png](https://i-blog.csdnimg.cn/blog_migrate/9c5b326184e2aabe623e97acc0a70318.png)
![6954749818b2ee3725a1b7e1806d7c34.png](https://i-blog.csdnimg.cn/blog_migrate/d4739e95dacbe0441e7afd155b84c6f3.jpeg)
![fb7392bb9684fadd578b9b25b96d9572.png](https://i-blog.csdnimg.cn/blog_migrate/cc0553acb46105033bc1e67601062197.png)
所综上所述,这就是SVM所要用到的核心数学原理。
下面正式来聊五毛钱的SVM
线性可分支持向量机:给定线性可分训练集,通过间隔最大化求得分超平面为S:
对应的分类决策函数为:
称为线性可分支持向量机。乍一看,这和感知机没什么区别啊,其实区别很细微,就是上面的间隔最大化!!!
![e66d57107370cf45726ae23708dc1ab1.png](https://i-blog.csdnimg.cn/blog_migrate/79ded47494ae7338647b88f78024edd8.jpeg)
在图2上有三个点A,B,C。均在超平面S的一侧,那么对于分类感知机来说,这三个点都在超平面的一侧,除了距离以外不能给分类器任何额外的信息。但是对于SVM来说,因为A离超平面S最远,那么从分类置信度上来说,SVM认为A分类正确的置信度就高,C离超平面最近,那么就C点的分类对于SVM来说就是不那么确信。B的距离介于A,C之间,所以置信度也就介于A,C之间。由上可知,一个点距离超平面的远近可以表示预测分类的确信程度(相当于额外提供了置信度的信息)。在超平面S:w*x + b=0 已知的情况下,
原理上,函数距离和几何距离都是可以表示点到超平面的距离,但是一般选择几何距离。解释如下,如果选择函数距离作为确信度的评估,因为函数距离为
那么继续来确定几何距离,下面是每个样本的几何距离。
![447f1879880ea13fecfef69998a2ceca.png](https://i-blog.csdnimg.cn/blog_migrate/a1d00e2a468d89cd687ec05aed6f3502.jpeg)
![92b4895e862e54aee26bfa60786ac08d.png](https://i-blog.csdnimg.cn/blog_migrate/336d7f8d65b3be4597f4f6c9e00eb481.png)
那么SVM的目的就是求这个最小距离的最大值(和前面将的极小极大问题接上了)。
![151ff8403053179e1e43dc844bfc504d.png](https://i-blog.csdnimg.cn/blog_migrate/0b70b159ac9df4a35c9c8a888c96b374.png)
约束表示的是我们想让任何一个点到超平面的距离都比最小间隔要大。这个问题又可根据前面提到的几何距离和函数距离的关系转换成:
![7261db32b888b9fbdaaccc0cdca3a7d1.png](https://i-blog.csdnimg.cn/blog_migrate/66c84f0466baa41f85e2dba2e6f02846.png)
![c103793821437c9e250c751a5032c804.png](https://i-blog.csdnimg.cn/blog_migrate/52cc830451ae02a6f6a135b23920aff6.jpeg)
从这里可以看到因w, b等比例发生变化时。函数距离发生了变化,但几何距离依旧不变。所以同理当最小的函数距离取值发生变化时,归于最小的几何距离的是不会有什么影响的。所以为了方便就取
![f5d459e082e2d8053c01b975f7f7738a.png](https://i-blog.csdnimg.cn/blog_migrate/40f6cfb2bf0c22719692878a91bcfb69.png)
我们的目标就是求解这个带约束凸函数最值。
目标明确了,解方程之前要解释一下支持向量机(support vector machine)。为什么叫做这个名字?它支持谁?还是谁支持它?支持向量是什么?
在线性可分情况下,训练数据集样本中与分离超平面距离最近的样本点我们称为支持向量(support vector)。那是不是分类器的分类超平面的确定是由支持向量决定呢?
答案是肯定的。支持向量就是使得约束:
即:
我们画出这个图的就会一目了然。
![5c85fc953c1d618921481fb5f0acb422.png](https://i-blog.csdnimg.cn/blog_migrate/8ca48f28614792e250fa0231f6d6d16a.png)
当分类y=1时,支持向量在超平面H1,非支持向量在H1的上方区域;当分类为y=-1时,支持向量在超平面H2。非支持向量在H2的下方区域。(把样本看成一个个向量,落在间隔边界的上的样本称为支持向量,没有落在间隔边界上的样本称为非支持向量)对于线性可分的情况,不会有点落在H1和H2超平面之间的区域的(H1,H2称为间隔边界)。所以在决定分离超平面的时候,只有支持向量起作用,其他的点并不起什么作用。所以相比感知机来说,SVM只要数据的扰动不影响支持向量的变化,那么一般的扰动是不影响最后的超平面的,因此是个很稳定的分类器。而感知机会因为任何一个点的微小变化(甚至是初始值的不同)而得到截然不同的超平面。
讲了这么多,终于到如何解这个凸二次规划问题了。
![164eda7bb80b866ee435de0171308a76.png](https://i-blog.csdnimg.cn/blog_migrate/ce0f009213eb3c780c935d13952e8398.png)
这是一个标准的可以用拉格朗日乘子法求解的问题。对于这类问题,较好的实践是:
先判断是否满足KKT条件,若满足则先求对偶问题。因为对偶问题一般比较好入手,而且后面我们将看到通过对偶问题可以很自然的引入核函数(kernel function)的概念。核函数引入可以解决很多非线性可分的问题,是一个很实用的方法。
Step1:首先我们来判断这个问题能不能用对偶方法来求解。即需要判断是不是满足:f(x), c(x)均为凸函数,且c(x)严格执行约束。显然原始问题的目标函数和约束都满足这个条件,所以存在
Step2:对偶问题求解:
![5abd44dc618a780f5a59c0fa887cac44.png](https://i-blog.csdnimg.cn/blog_migrate/bf55a67142bb47ba15c7334cc730823b.png)
![fe66f94eb58c7635ca673705baa7ae27.png](https://i-blog.csdnimg.cn/blog_migrate/429827b93a1874f820458e2049eb2594.png)
![b237026e7103e377b6bb2f50ce65448e.png](https://i-blog.csdnimg.cn/blog_migrate/654da1c646ed72b5454f30e784e21418.png)
![3d6d2430fc8286c8c9ec54b7a94b034c.png](https://i-blog.csdnimg.cn/blog_migrate/1855a4949880ac67770fa0a07b1f9395.png)
![3f8ca598d737a672445915b89eda78bf.png](https://i-blog.csdnimg.cn/blog_migrate/d8e2770e1901536ef490ca150f8b2b9c.png)
![aa61b0e1efb0408d635c0b6d61aea6f2.png](https://i-blog.csdnimg.cn/blog_migrate/d8670c97067fc90f0e29d000c31cda94.jpeg)
![a166268f1694361e7c94001ef5ef2296.png](https://i-blog.csdnimg.cn/blog_migrate/19f6173d29dd31dc02932e8c90abb946.png)
![255b0b620eb4c3ac7f058a823f61b1d0.png](https://i-blog.csdnimg.cn/blog_migrate/ce9b5f6127f9d1a018ccb12752532896.jpeg)
以上就是我们对于线性可分数据集SVM的分类超平面的求解。这是SVM的基础,下面我们来看看如果数据集不是线性可分的情况该如何求解。
线性向量机:
现在我们由一些数据,里面有很少一部分特异点(非常少),这些特异点使得数据集不线性可分,如果去点这些特异点那么数据集就又变得线性可分了。这个时候我们就可以想的包容一些,在前面的线性可分的时候,我们的样本点满足函数距离大于等于1的要求。现在我们的数据集有些特异点,那么我们可以宽容一点,把这个距离的控制变得更松一些。即给每个样本点加上一个松弛量
![7563e84a5332db86df47928571bda3d7.png](https://i-blog.csdnimg.cn/blog_migrate/406e8946962956b66a23ecef22d8d39e.png)
![f56c9d51a3c882b256f43cb8c8881e8a.png](https://i-blog.csdnimg.cn/blog_migrate/597cc9ec1979406526446cd82294ad6a.png)
![40880eacab371c663ad54f41a0fb27e3.png](https://i-blog.csdnimg.cn/blog_migrate/f7bdf82d4155e63e2964fcf1f1a3e3ee.jpeg)
![ebee6c39064c825b218f16ee953835f7.png](https://i-blog.csdnimg.cn/blog_migrate/7d50c3f1bfa2ff5d290eb7b5e565c65d.png)
![20fc8b02b4bb5968f6122ed8c7ecff4f.png](https://i-blog.csdnimg.cn/blog_migrate/0e77870dd39c4061574c2af1b9420e62.jpeg)
核方法:
前面讲了求原始问题可以将问题转化为其对偶问题的求解。对偶问题的求解主要是1)方便求解,2)很自然的映入核函数(kernel function)。
在前面的优化问题求解中我们经常碰到红色框框里面的结构:
![26bc0ba015586133bb8b815bbce8c276.png](https://i-blog.csdnimg.cn/blog_migrate/385e4bf626fbd3bd9410990ca304361f.png)
引入核函数的目的是为了解决数据分类的最后一种情况:非线性分类,即数据十分混乱,存在大量的特异点,以至于没办法同去除特异点来使数据变得有序。那么,这个时候就是核函数一展身手的时候了。
首先:非线性分类问题其实在二维空间没什么办法,但是如果我们通过一个非线性变化,将原本的非线性问题,变为线性问题。那么我们就可以通过前面讲的线性/近似线性的方法来求解分离超平面了。所以非线性变化的关键的找到那个非线性映射!
![3dcd1c7cd00ee981fb3ea3c826842526.png](https://i-blog.csdnimg.cn/blog_migrate/b326474383f9ded85b153ce337dfb0f5.png)
![022c04e8acdcf4494955a4baa3909e9d.png](https://i-blog.csdnimg.cn/blog_migrate/be1a03855b0ff05844eb9d3ed924e773.png)
![c18b89cc1632c3509bfe0a00cd4a4d1c.png](https://i-blog.csdnimg.cn/blog_migrate/55dc7898c54392d1cf6f6d9957243999.png)
![c438f09e9d66481bb30ac2c9c70eaf72.png](https://i-blog.csdnimg.cn/blog_migrate/abaae004a92a44bcb6eabf5670ef29e8.png)
这里面需要区别一下核函数(kernel function)和核技巧(kernel tricks)的关系:kernel function 是一个二元函数K(x1,x2)=<f(x1) .f(x2)>注:.表示内积(inner product)核函数做了一件大好事。怎么说呢?本来求K(x1,x2)是要先找到映射关系f(.),然后计算f(x1)【f(x2)同理】。最后计算f(x1),f(x2)的内积……其中要命的是映射f 不止一种,而且还不好找。但是我现在有了核函数,是直接关于x1,x2的二元函数(x1,x2可以是标量也可以是向量),所以我就可以自己将高维空间的内积计算降低到低维空间计算,偷偷的省略掉了映射f的表示。所以人们把以上的这种方法称为使用了核技巧来计算高维空间内积!
一般现在常用的核函数为:多项式核,高斯核等。
![41d356a83962c0e3eaae17b36cb78070.png](https://i-blog.csdnimg.cn/blog_migrate/8985bdf7adb723c4f171a460ee560091.png)
—————————————————正文结束————————————————
至此,线性,近似线性,非线性三种SVM都已经描述完了。不知道你们晕没晕,反正SVM在一开始让我晕了好几次,但是在反复看了几遍以后,发现它就没那么可怕了,而且每次看每次都有新的收获!由于时间仓促所以里面的一些知识点难免会有些错误,如果遇到你费解的地方,欢迎留言和大家一起讨论!