![92bfe273a2882d4a760d9265cf684c26.png](https://i-blog.csdnimg.cn/blog_migrate/17d8c591cbd35cedfd68f1069ac794ef.jpeg)
目录
- Intuition
- 算法流程
- 代码编写
- 练习&真题
- Reference
- 附录
- SVM的另一种实现
Intuition
讲系前面
SVM的直觉非常简单,但是数学推导和求解过程略显复杂。接下来我将从这几方面来对SVM展开叙述:
- 线性可分支持向量机
- 软间隔最大化的支持向量机
- 使用核技巧
- SMO求解支持向量机
线性可分支持向量机
支持向量机要解决的问题非常简单。想象有这么一个二分类问题,不同类别之间是线性可分的。SVM要做的是找到一条直线或一个平面,以最大置信度的方式把数据分离开来。跟Perceptron不一样的是SVM得到的是一个唯一解。
最大化置信度的意思是:距离这条线或者平面最近的那些点,我们要最大化他们的距离,如下图所示:
![95507245776c80a1982180782013ce97.png](https://i-blog.csdnimg.cn/blog_migrate/5f6f61de642c27b9dcdbdb34b0d53a45.png)
我们将上面这句话转换成数学语言:
其中第一个式子是点
仔细观察第一个式子,我们发现,w和b同时扩大相同的倍数,优化的值不改变。那么若求得最优的
注意,以上是带不等式约束的优化问题,我们不能直接使用拉格朗日乘子法来构造目标函数,为此我们需要给出一个限制条件
该函数是二次型的,并且符合KTT条件,所以可以直接通过偏导数把极值表示出来:
在这里出现了一个麻烦的东西,w变成了
上面的推导会在附录中给出。
接下来我们表示出
第一个式子是二次型的,并且符合KKT条件,我们可以对
到这里,我们算是把线性可分支持向量机给表示出来了。
软间隔最大化支持向量机
在实践上,基本上我们碰到的数据都是线性不可分的。就是说一条直线或者一个平面无法把不同类别色数据分离开来。更数学地来说就是这个式子
上面的C是惩罚因子,是模型初始化需要设置的参数。
使用拉格朗日乘子法构造我们的目标函数:
将我们需要求解的问题转化成对偶问题(更容易求解):
对我们的式子求偏导数得:
将上面三个式子代回目标函数得:
后三个式子可合并成:
使用核技巧
前面写的RBF net中讲到了一个叫RBF核 ,这个核可以直接用到支持向量机里面。这个核起到的作用是,将你的输入数据映射到无限维,从而使得数据线性可分。更加直白来说就是:输出的分类平面是一条曲线而不是直线。代入核函数得到下面这个式子:
SMO求解支持向量机
SMO全称是序列最小最优化算法。关于SMO的具体推导,读者可以仔细研读[2],下面只给出主要的思想和相关的更新公式。
在如此多变量的情况下,要最小化上面的目标函数,SMO给出了一个折中的方案。每次只取出其中的两个变量,比如说
算法流程
- 随机初始化所有参数
- 使用SMO算法来求解所有参数
代码编写
在代码编写里面只进行傻瓜式的遍历,每次对两个
相应的代码在:
https://github.com/JyiHUO/algorithm-from-scratch/tree/master/SVMgithub.comimport
练习&真题
- 在线性支持向量机中,求出b的值(真题)
- 证明:线性支持向量机的空隙距离为
(真题)
- 为什么线性可分支持向量机比Perceptron分类器鲁棒性更强?(真题)
Reference
- 《统计学习方法》
- https://zhuanlan.zhihu.com/p/29212107
附录
对偶问题的推导
首先看看我们的原问题:
我们要证明:
先看看下面这个式子:
我们仔细看右边部分,这个式子
现在证明:
这个证明很简单,我们进行这么一个展开:
所以:
证明完毕
SVM的另一种实现
使用SMO来实现SVM的过程非常繁琐,那还有没有另一种方法来实现SVM算法?
答案是:使用合页损失函数来实现。它的目标函数是这样子的:
仔细观察,你可以发现当
当我们求解这个目标函数的时候,使用梯度下降来迭代更新就可以了。
缺点就是:不能够使用kernel trick来求解数据非线性的情况。