SVM是我写的最长的一篇博客。
解决SVM有两个思路,这两个思路指导我们后面的方法:
- 简单情况,线性可分或线性不可分,把问题转化成为一个凸优化问题,可以利用拉格朗日乘子法简化,然后有既有的算法解决。
- 复杂情况,非线性情况,用映射函数将样本投射到高维空间,使其变成线性的情况。利用核函数减少高纬度计算量。
所谓的支持向量机就是在一个分隔平面两边各找到对应的支持向量,使得经过这些支持向量的左右两边平面的距离最大化,如图所示:
然后我们开始计算。
现在,我们得出来的d,我们就可以转化为凸优化问题
到了这里,我们可以用拉格朗日乘子法来解决这个问题。为什么可以用拉格朗日乘子法来解决,首先得解释一下拉格朗日乘子法。
假设f(x,y)无约束,那么f在它的梯度那里就可以取到最小值,就是梯度下降到几乎不变的时候,在图中就是f的圆心。但是有了约束后,取不到,只能通过拉格朗日乘子法来解决。解释如图:
解释完了,那么就可以得到如下的公式,分别对w和b求导得到:
但是这个是要加上kkt条件的,kkt条件中的变量太多,不利于解L,所以将拉格朗日乘子法的问题转化为其对偶问题,
这里,我插一句,什么是松弛变量和惩罚函数
好了,到了倒数第二步了,我们现在要求 \alpha_i, \alpha_j,那么,所以,我们可以用SMO算法来解决。SMO算法的思想很简单。如图:
这个,我暂时不打算细讲,以后可能会单独分出来在好好说说。然后就是核函数了,核函数就是简化计算。就是本来是求 x_i . x_j,映射到高维空间求 \phi(x_i) . \phi(x_j),而核函数就是用低位空间的一个函数计算,简化高维空间的 \phi(x_i) . \phi(x_j),常用的核函数有以下几种: