最近在看oneclasssvm突然想到原来的svm还没洗完,打开西瓜书补充一下。
漫漫成长:拉格朗日乘子法与KKT条件详解zhuanlan.zhihu.com
关于拉格朗日的详细例子可以看第二个链接。
关于拉格朗日和kkt条件可见上,很好的把拉格朗日和kkt与梯度下降法联系到一起方便理解,一般梯度下降法处理没有约束的优化问题,这也是大部分常见有监督机器学习算法使用的优化方法,无脑梯度下降呗,nn再配点启发式的改造。
如果有等式约束就用拉格朗日转化成无约束问题求解。
如果有不等式约束就拉格朗日+kkt然后想办法求解(我反正只知道svm的smo可以快速求解这个问题,要不然就用二次规划算法求)

from 西瓜书:
形式上svm和线性回归类似:

我们最终训练出来的svm的形式就是W*X+b,预测的时候把样本带入计算出W*X+b然后和正负1比较,大于1则属于样本1,小于-1则属于样本-1,否则就是落于间隔中无法判断。
直观来看:

两直线(或者超平面)的间隔为:

具体可参考高中数学公式,两直线的距离的计算公式推广到超平面也是一样的形式。这个间隔称为margin。我们的目的是找到最大margin的超平面对应的公式:

直观上这样最鲁棒,间隔最大最不容易对未知的样本错分。
然后我们把这个实际问题用数学公式抽象出来:

然后统一成最小化的形式:

这里W右上角多了个平方对最重要优化的结果没有影响,是为了后面的计算方便而加上的,这里改成次方,4次方。。。之类的都没有影响,因为||W||本身就是一个正数。
这样我们就得到了SVM的基本形。

针对这种形式我们没有办法直接使用梯度下降法,最优化式子里面x都没有。。。x出现在约束项里何从下手。这个时候拉格朗日乘子法就派上用场了。
使用拉格朗日乘子法将上面的公式转化为其所谓的对偶问题的形式:


将6.9带入原式可得:

这样就得到了原始问题的对偶问题形式了,我们只要求解出

注意到原始的问题的约束条件不是等式约束而是不等式约束,所以这里要引入kkt条件:
力学渣:浅谈最优化问题的KKT条件zhuanlan.zhihu.com
关于kkt的具体介绍可见:

1. L( w,b,

我们对x求导令其为0可得:
2. h(x) =0;
这里没有等式约束所以这一步没有
3. u*g(x) = 0;
这里对应的不等式约束是

所以可得:

4、u>=0
对应 的 :

最终得到:

其中最后一个等式最重要:

如下重要结论:

当然这并不意味着svm只需要很少的样本。。。训练的时候还是需要越多越好的高质量样本的。
写到这里之后我重新翻阅了《机器学习》,《统计学习方法》和《机器学习实战》以及刘建平大佬的blog,对于硬间隔版本的svm的求解貌似并没有涉及到smo算法,因为硬间隔没有引入C这个参数的概念,关于硬间隔的求解也仅仅在《统计学习方法》上找到了一个例子:


这实际上就是使用规划问题的解题思路来求解的并没有涉及到smo中提到的

所以准确来说,网上的各种资料应该讲解的是软间隔版本的svm求解用到了smo的方法,否则这里的C的二次规划的求解怎么得到的??不合理啊。
那么下面就谈谈软间隔svm,
软间隔的svm引入了hinge loss的概念:

上面是原始的硬间隔的拉格朗日转化后的式子。


上式还是一个二次规划问题的形式,所以我们还是进行拉格朗日展开:

这里相对于硬间隔来说多了一个不等式约束所以多了一个拉格朗日乘子。
求对除了

带入原式中可得smo软间隔全家桶:

所以,注意下面这段话是重点,否则看机器学习实战的代码的时候会比较迷糊。

所以可以看到,只要是
C的几何意义实际上就是界定了间隔的大小:


当
需要注意这里kkt的条件进一步表示为:from



通过这个软间隔的kkt条件很容易就能理解了。所以凡是

因为二次规划求解开销大,所以引入了SMO的高效求解这类问题的算法:
邵正将:机器学习算法实践-SVM中的SMO算法zhuanlan.zhihu.com
看smo的求解过程真的有一口老血喷出来的感觉。
1、启发式方法选择需要更新的参数
smo的大体思路先确定两个

前面我们根据kkt条件有:

可以得到:

(如果

6.39式,如果

可以得到
如果

这样再看这张图就很有感觉了!
)
所以根据smo的启发式法则——选择违背kkt条件最严重的:
第1个
SMO算法称选择第一个变量为外层循环,按照顺序依次选择,优先选择不满足条件1的,如果没有则选择不满足条件2的,如果还没有就选择不满足条件3的。
1、
2、如果不存在这样的
2、最后选择
第2个
SMO算法称选择第二个变量为内层循环,假设我们在上一步已经得到了

也就是希望新的参数和旧的参数之间的变动的幅度尽量大,这就是所谓的启发式的思路,幅度变动越大则对目标函数产生的增大或者减少的效果越好。当
如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做
2、选择完
这里需要注意的是

此时转换为分类讨论的二次规划问题:
https://zhuanlan.zhihu.com/p/29212107
根据上面链接的复杂的推导过程最终我们可以得到:

其中:


这样就得到了
我们根据:

这里用到第一个约束条件:

这个推导出来的,更新前的

这里用到第二个约束条件:

方法就是先找原链接那样转化为二次规划问题求解:

注意,横轴是

这样我们就完成了
3、更新阈值b和差值E
考虑到我们的f(x)=wx+b仅仅与支持向量有关并且结合:

所以
所以可以得到:

可以看到,b的更新完全和支持向量有关(好像是废话)。
然后也要更新预测误差E:

S表示所有支持向量的集合。
4、总结SMO:
