SVM(support vector machine)支撑向量机:
什么叫支撑向量机?
我们先来看一个对于我们一个2维特征平面
如果我们使用逻辑回归的思想,求解出一条决策边界,将样本数据分为两类。在图中我们可以看到,对于图中这样的数据,蓝色两条线的分类对于样本数据来说都是OK的。我们取上面的这条决策边界。然后在添加一个点:
新加的这个蓝色点,如果我们决策边界去蓝色线,那么这个新加蓝色点会划分为蓝色这类。但是我们可以看到,其实这个新加点离红色类别更近。出现这个问题的原因还是因为我们的决策边界太靠近红色区域导致。所以这里我们引用SVM思想去解决这个问题
注意:我们这里举的例子都是对于线性可分的数据来说的,我们先用线性可分的数据理解概念
图可以看到,我们svm就是要尝试找到一条最优的决策边界,来使得决策边界和我们两个类别中离这个决策边界最近的点的距离最远。
看图:中间蓝线就是我们的决策边界,离这条蓝色最近的样本点就是上下两条蓝线经过的点,也就是上方红色2个点和下方蓝色一个点。这个d就是距离。而我们就是需要求解出这个最大的margin。所以svm转换成最优化问题就是需要我们最大化这个margin。再次提醒:这里使用的线性可分数据说明
上面的思想,对于我们这些解决线性可分的问题,有个名词叫hard Margin SVM。如果要解决线性不可分,叫做soft Margin SVM
我们还是使用线性可分数据先来理解中间的数学公式:
因为margin = 2*d ,所以也就是最大化d,对于我们这个图来说。就是点到直线的距离,我们那可以表示成
(x,y) 到 ax+by+c=0的距离(不能用kx+b,要考虑垂直于x的线的影响) =
我们扩展到n维空间
= 0 所以,我们将theta里面的theta0取出来,转换公式就是
= 0
所以距离公式
我们根据这个这个图,来推导我们的公式:
具体如何求最优化的问题,我也不推倒了,自己找资料推了一半太难了。感觉貌似本科的数学真的不太够用
上面我们所说的都是基于hard Margin SVM,但是对于我们的hard Margin SVM 会有个问题,就是使用我们的hard Margin SVM,我们的数据容错率就很小了。可以看一下下面的图形:
当我们蓝点落在这个位置的时候,我们已经没有办法利用hard marginSVM找到符合条件的一根线了。所以为了我们的模型能更好的泛化和容错率,我们需要使用soft margin svm
soft Margin SVM:
我们还是先在图中看下:
在图中我们可以看到,我们在限定条件后面减去一个,本来我们两条蓝色实线里面是不能有任何数据的。但是现在就可以有了一定的容错空间
这个 >=0。
但是当我们的 变得很大的时候。所有的点都会满足条件,这个时候容错空间就太大了。我们需要做的就是,希望有这么一个
值,但是这个容错空间又不能太大。所以我们需要对我们的式子进行正则化。
来看看正则化之后的式子,正则化之后的式子就是我们的soft margin svm的表达式:
图中的C也是我们的一个超参数,当我们的C越大的时候,后面的式子我们需要让他尽量的小,所以我们的 就需要尽量的小,当C无穷大的时候,
就变成了0 ,就变成了hard margin svm。
这里特变需要注意的是:我们的这个 并不是一个固定的值。而是我们对每一个特征点,都会给一个
。当我们的样本有 m 行的时候,就有m 个
,也就是我们上面正则化之后,求得是 m个
的和
接下去我们看下我们如何在scikit-learn中使用这个soft margin svm。
注意一下,在使用模型之前,我们要对数据进行归一化,因为在我们的svm模型中,我们是涉及到距离的。所以,我们要对模型进行归一化。具体归一化过程和什么是归一化,在我的另一篇写的博客中https://blog.youkuaiyun.com/u013153465/article/details/95468757是有说明的。有需要的可以去看下。
下面直接给出代码:
当我们的C取得很大的时候,这里我们取的1e9,相当于就是hard margin svm了
我们再来看我们取的C比较小的时候
很明显下面有个蓝点被分到另一个类,因为我们扩大了容错空间,我们再画出容错空间的代码
下一篇我们继续看https://blog.youkuaiyun.com/u013153465/article/details/96479647