一、SVM基本原理:
支持向量机(support vector machines)是一个二分类的分类模型(或者叫做分类器)。如图:
支持向量机(support vector machines)是一个二分类的分类模型(或者叫做分类器)。如图:
它分类的思想是,给定给一个包含正例和反例的样本集合,svm的目的是寻找一个超平面来对样本根据正例和反例进行分割。
在样本空间中,划分超平面可通过如下线性方程来描述:
SVM的核心思想是尽最大努力使分开的两个类有最大间隔,这样才能使得分割有更高的可信度。
如图所示:
在这两个超平面上的样本点也就是理论上离分隔超平面最近的点,是它们的存在决定了H1和H2的位置,支撑起了分界线,它们就是所谓的支持向量,这就是支持向量机的由来
有了这两个超平面就可以顺理成章的定义上面提到的间隔(margin)了
二维情况下 ax+by=c1和ax+by=c两条平行线的距离公式为:
可以推出H1和H2两个超平面的间隔为2/||w||,即现在的目的是要最大化这个间隔。
所以support vector machine又叫Maximum margin hyper plane classifier
等价于最小化||w||
为了之后的求导和计算方便,进一步等价于最小化
两个式子综合一下有:
这就是目标函数的约束条件。现在这个问题就变成了一个最优化问题:
对偶优化问题
对于上述的最优化问题先需要构造拉格朗日函数:
分别对w和b求导得到:
然后再代入拉格朗日函数后得到原问题的对偶问题
现在已经完成了对这个问题的建模过程。
当要对一个数据点分类是,只需要把待分类的数据点带入g(x)中,把结果和正负号对比。又由上面计算得到的w,带入g(x)得到:
但是上述公式只能算线性可分的点,对于线性不可分的情况需要把相应的点投影到核函数:
设映射函数为Φ(•),则映射后的空间分类函数变成
但是,如果拿到低维数据直接映射到高维的话,维度的数目会呈现爆炸性增长。
于噪音的存在,有可能有偏离正常位置很远的数据点存在,甚至类别1出现杂了类别2的区域中这样的异常值叫outliers. 为处理这种情况,SVM允许数据点在一定程度上偏离超平面,约束就变成了:
其中
,称为松弛变量(slack variable)
还需要一个惩罚因子C(cost),它代表了对离群点带来的损失的重视程度,它的值越大,对目标函数的损失越大,意味着你非常不愿意放弃这些点。
它是由使用者指定的一个值(libsvm中的参数C),是参数调优的重点所在。
原来的优化问题就变成了下面这样:
同样用Lagrange方法得到对偶问题:
这才是一个可以处理线性和非线性情况并能容忍噪音和outlier的SVM!
二、算法设计过程:
用PMO算法来得到alpha和b这两个参数,输入为特征数据,标签以及惩戒因子C、松弛因子toler。
先给alpha 和 b初始值,
当迭代次数小于最大的迭代次数,
计算误差,若误差找过容忍范围:
随机选择另一个alpha数据
同时优化这两个数据
并计算相应b值,需要b在0和C之间
如果两个向量不能被优化则退出内循环,
如果所有向量都没法优化,增加迭代次数,继续下一个循环
三、调参
主要是cost和gamma以及对映射核函数的选择,用网格搜索法gridsearchCV调参。
最后调用best_estimoter来得到结果