一.算法介绍
SVM分为线性SVM和非线性SVM,非线性SVM实际上也只是通过核函数变换到特征空间。这里我主要针对线性SVM进行说明。
模型:线性SVM主要用于解决线性可分的问题,所建立的模型实际上就是f(x)=sign(wx+b)。这和感知机所建立的模型实际上是一致的,即SVM希望学习到线性空间的一个超平面,在这个超平面两侧的数据点有着不同的类别。之前说过的logistic回归模型实际上也是希望学习一个超平面,只是建立的表达式不一样。
策略:SVM的策略比较特殊。感知机的策略是最小化损失函数L=-SUM(yi(wxi+b)),然后使用求导加上梯度下降的算法求解。感知器的学习结果往往不固定,因为对于一个理想的线性可分问题,实际上是有无数个超平面,感知器学习到哪一个超平面是不固定的。
SVM则是利用了几何性质,希望学习到这样一个超平面:这个超平面可以很好的区分两类数据点,而且在所有满足条件的超平面中,这个超平面距离训练集样本点的最近距离是在所有超平面之中最大的。用文字表述起来不直观,可以用函数间隔,几何间隔的数学公式来说明:
参见http://blog.youkuaiyun.com/viewcode/article/details/12840405
最后可以把分类平面的学习问题转换成如下的优化问题:
算法
这个问题是典型的凸二次优化问题:目标函数是凸函数,约束条件是仿射函数,可以使用拉格朗日对偶法得到完美的解决。数学推导过程参见《统计学习方法》李航著。整个解决过程非常漂亮。
综上所述,SVM的特点在于提出了一种新的求解分类平面的策略,然后使用凸优化的数学工具进行了完美的解决。我觉得SVM的优点主要是泛化性能好,能够较好的处理异常训练数据点的情况。
二.程序实现
工业界常常使用快速优化算法SMO来求解SVM的最优化问题,过程比较复杂,就不再细说。台大团队推出的libsvm库被用的较多,相关资料可参见:
http://blog.youkuaiyun.com/zouxy09/article/details/10947323