(这是一个解析法+迭代法的优化,求偏导为0是解析法,smo是迭代法)
伪代码输入跟感知机一样,X样本和y(1,-1)
1.构造一个约束优化问题,即上面只关于a的哪个式子
2.用SMO法求a
3.求出w,
4.求出b:找出支持向量,运用公式求出每个支持向量的b,求均值
输出一个w和b,也就是θ
算法改进(关于软间隔和硬间隔)上述算法只能应对线性完全可分的情况,但如果数据大部分是线性可分,但是存在异常点,导致不能线性可分了,如
又或者,异常点没有达到不可分的底部,但会严重挤压间隔空间,如:
如果没有蓝点,那么我的超平面间隔就会宽且合理,有了这个异常点让分隔变得异常窄。
如何处理这两种情况呢?SVM引入软间隔的方法来解决,相对来说,我们上面的方法就是硬间隔
硬间隔的最大化条件为
软间隔引入一个松弛变量ξi,使得约束成为
,这样对于异常点,只要我们ξi变大,就能抵消异常点的伤害了,但是如果所有点都加大松弛变量,不就乱套了吗,于是我们对于松弛变量的变大也要有惩罚,,这样我们就可以得到合适的应对误分类点的方法了。C是惩罚系数,要自己规定,C越小,就越可以容忍误分类点,具体设置可以通过网格搜索确定。关于软间隔的损失函数优化问题,其实与硬间隔类似,任然求偏导,得到a的表达式,用SMO求a,得解。
算法改进(非线性问题)SVM算法内容实在是多啊
对于非线性问题,我们的基本思想是,投影到高维平面去,增加维度,就可以变成线性的,比如y=x+x2这个非线性问题,我们把x2设为x2,那么y=x1+x2这个线性问题,问题就得到了解决。
看看我们的目标函数最终形态:
关于维度的问题,只出现在了xi*xj这个向量内积上,于是比如本来xi是1维非线性,我们用一个函数把它投射到2维线性可分,于是公式变成:
,但是当维数太高,比如1万维,太难以计算,于是我们就用上了核函数!核函数的基本思想是要让我们能用低纬向量计算,却产生高维向量线性可分的结果。如何计算?那就涉及到我们用哪个核函数了,现有的核函数有:
多项式核函数:
高斯核函数:
sigmoid核函数: