有人认为SVM是最好的现成的分类器,“现成”指的是分类器不加修改即可直接使用,意味着直接应用SVM可以取得较低的错误率,对训练集之外的数据点做出很好的分类决策。 SVM有许多实现,这里介绍其中一种最流行的实现,即序列最小优化(SMO)算法,然后添加kernel函数将SVM拓展到更多数据集。 SVM是基于最大间隔分隔数据,若所给数据是二维的,则分隔线为一条直线,若数据为三维的,则分割线为一个平面,依次类推,随着数据维数的增加,分隔面就变成了超平面。而最大间隔,是让离分隔面最近的点,确保他们离分隔面尽可能远。SVM本身是一个二类分类器,若要解决多类问题,需要修改SVM。
一、寻找最大间隔 SVM中为了找到划分数据集的最佳分隔,确保最近的点到分隔的垂线最短,因此转化为了一个优化问题。这里分隔面可以定义为:
二、SMO高效优化算法 John Platt所提出的SMO算法用于训练SVM,将最大优化问题分解为多个小优化问题,求解的结果是完全一致的,且SMO算法求解的时间短很多。 为了得到分隔的超平面,就需要得到最优的alpha值,上面所提到的最优化式子可化为下式:
可以看出,类别标签为1与-1
下面进入简化版的SMO,伪代码大致如下: 创建一个alpha向量并将其初始化为0向量 当迭代次数小于最大迭代次数(外循环) 对数据集中每个数据向量(内循环): 如果该数据向量可以被优化: 随机选择另外一个数据向量,同时优化这个向量 如果两个向量都不能被优化,退出内循环 如果所有向量都未被优化,增加迭代数,进入下次循环。
新闻热点
疑难解答