机器学习: SVM
为什么要有 SVM
SVM (Support Vector Machine)即支持向量机,主要用于解决数据的分类问题的。还记得线性分类的问题么?在那个问题只是说怎么去找分开数据的函数,但是没办法求这个函数怎样才能落在数据正中间,将两个数据分开。如下图

线性分类器只能分成左边的样子,SVM 则可以优化右右边图那样,函数正好落在正中间。
计算 Margin
找正中间位置的关键就是算这个直线到两边数据的距离,最好相等,那不就正中间了?所有我们将图画成这样

这里我们定义分割的函数 ,红色则为 +1,蓝色为 -1。现在在这个函数加一个向量
使其正交于
。

而且我们还得出 。现在我们加多一点变量来求 Margin M。

这里添加 ,使得
,注意
是向量不是要求的 Margin M。将
和
代入
方程可以得到
可以推出 的值。

也就能算出 Margin 的值了

Margin 最大化
为了能够刚好在正中间,Margin 应该越大越好所以要求
也就是要求分子的最小值
不过这里有个约束条件是
例子
下面举个简单例子来说明,假设下面有点
x | y |
---|---|
-3 | -1 |
-1 | -1 |
2 | 1 |
分割起来会是这样

要满足的条件如下

画在坐标轴上会相交出重叠的部分,阴影部分就是约束条件,在这部分可以随便选参数 和
,如
,只不过 Margin 不是最好的。

此时我们想要 Margin 最大就要最小化 ,得到

拉格朗日
其实上面已经是可以求到最优解了,不过每次都要搞一个约束条件太麻烦了,有没有像直接求某个函数最小值一步到位的方法呢?拉格朗日就开始教你做人了,使用拉格朗日乘子法构造一个新的目标函数就可以将约束条件包含在新目标函数里,相当于去掉了约束条件。
现在来看看我们要求的目标函数和约束条件

新构造出来的目标函数如下

可能现在暂时接受不了,一来一大串东西。先说说后面的 是相当于将约束条件融入到新的目标函数里了。前面的
是拉格朗日对偶搞出来的,因为不搞对偶单单求
是很难求的,所以新的目标函数就写上面这样了。
软 Margin SVM
实际中其实有些数据是不能完全分开的,如

像这种掺在一起的情况会影响到 Margin 的值,进而影响到分割函数的位置,所以这时候我们不得不调整其参照对象。具体做法是在求最小 Margin 函数以及其约束条件上添加一个参数,通过调整这个参数调整参考对象

R 值越大,越像 Hard Margin;R 值 越小参考的对象会越远。

Kernel
关于核函数就像在特征值上添加一个中间件,这个中间件可以将服从低维分布的特征值变成服从高维的特征值,如

一般来说这个“中间件”用 向量表示 ,就像一个数组一个存放着对应的高维分布函数

但是有时候一个 是不够的,可能需要组合在一起,如

这里的 K 就是我们说的核函数,不过是将低维变高维从而使得数据可分。常用的核函数有
