本文学习自 https://zhuanlan.zhihu.com/ml-jack
SVM支持向量机
一、什么是SVM
对于一个分类问题,数据是线性可分的,也就是可以用一根棍子把两种小球分开,并且让小球距离棍子的距离最远,也就是要求最大间隔。
但是,当数据不是线性可分的时候,就不能找到一根棍子来区分小球,这时候需要把小球映射到高维空间,然后找一张纸来分类。想要让数据映射到高维空间,就需要核函数(kernel),用于切分的平面就是超平面。
二、线性SVM
由于棍子的位置可以有很多个,为了分类效果最好,我们就要找最大间隔,也就是支持向量到超平面的距离之和最大,这样就能最大化的区分两个类别。
1、数学建模
(1)超平面方程
二维空间下的直线方程:y=ax+b
把y轴替换成x2,把x轴替换成x1:x2=ax1+b
移项得到:ax1-x2+b=0
将公式向量化,得到:
进一步向量化:
其中,
若在坐标系中画出,可以发现w是直线的法向量,y是直线的截距。
然后可以推广到n空间,公式依然没变,只是向量的维数增加到n维。
(2)分类间隔方程
间隔=2d,d就是点到直线的距离
扩展到多维的距离公式:
d就是“分类间隔”。||W||是W的二范数,表示所有元素的平方和,再开方。
(3)约束条件
有两个问题:
- 如何判断超平面将样本点正确分类?
- 如何找到支持向量(距离超平面最近的点)?
这就是约束条件,也就是变量d的取值范围受到了约束。
对于二维平面,对样本xi进行标记:
如果超平面方程能够正确分类样本点,就会满足下面的方程:
进一步,可以写成:
上述公式的解释就是,对于所有分类标签为1和-1样本点,它们到直线的距离都大于等于d(支持向量上的样本点到超平面的距离)
再将公式两边都除以d:
其中,
此时依然可以描述一条直线:
把wd和yd替换成w,y:
因此,我们可以找到一些超平面,使得对于所有样本点,满足:
这就是SVM最优化问题的约束条件。
也可以变为:
(4)SVM基本描述
现在可以知道,支持向量上的样本点,满足:
而我们要求
可以转化为
因此求解d最大化,也就是求解||w||最小化。
进而等价于:
因此,最终的目标函数和约束条件就是:
(5)拉格朗日函数
使用拉格朗日方程,就是把约束条件放到目标函数中去,从而将有约束优化问题转化为无约束优化问题。
需要两个步骤:
- 将有约束的原始目标函数转换为无约束的新构造的拉格朗日目标函数
- 使用拉格朗日对偶性,将不易求解的优化问题转化为易求解的优化
首先第一步:
公式变形:
其中αi是拉格朗日乘子,αi大于等于0。
令:
当样本点在可行解区域内时,θ(w)为原目标函数本身;否则就是无穷大。
现在,我们的问题变成了求新目标函数的最小值,即:
然后第二步:
对于新目标函数,是先求最大值,再求最小值。因此使用拉格朗日函数对偶性,将最小和最大的位置交换一下:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用d*来表示。
我们需要让d=p。此时需要:这个优化问题必须是凸优化问题,并且满足KKT条件。
(6)KKT条件
(7)对偶问题求解
已知:
第一步:
首先固定α,要让L(w,b,α)关于w和b最小化,我们分别对w和b偏导数,令其等于0。
将上述结果带回L(w,b,α)得到:
第二步:
里面最小值求完了,要求外面最大值。
这个时候就需要采用SMO算法来求解。我们通过这个优化算法能得到α,再根据α,我们就可以求解出w和b,进而求得我们最初的目的:找到超平面。
2、SMO算法
步骤:
1、求误差
2、计算上下边界,分别是y1=y2时、y1!=y2时
3、计算η:
4、更新αj:
5、根据取值范围修剪αj:
6、更新αi:
7、更新b1和b2: