本来没打算将笔记记录下来,但是觉得可以帮助别人也能方便自己回顾,就开始写下来把。
关于支持向量机,可以直接下载LIBSVM使用。(mark:本人并没有使用过)其中包含几个感念:
1,分隔超平面(separating hyperplane):用来将数据集进行分割的超平面,数据集是n维,则超平面就是n-1维。
2,间隔(margin):数据点到分隔面的距离。
3,支持向量(support vector):离分隔面最近的一些点。
同logistic回归的0和1不同,SVM采用-1和1对数据点进行分类,方便计算间隔。(label*(w T X+b)总是一个正数)
支持向量机的学习过程,本身就是寻找支持向量的过程。即寻找分隔面附近最近的数据点。并最大化间隔。
对该优化问题,可以增加部分约束条件( label*(w T X+b)>=1.0),引入拉格朗日乘子,将目标函数进行优化。(这部分没看懂。) 将问题转化为求一系列alpha和b。
介绍下Platt的SMO算法
SMO:(Sequential Minimal Optimization序列最小优化)
伪代码:
创建一个alpha向量并将其初始化为0向量
当迭代次数小于最大迭代次数时:(外循环)
对数据集中的每个数据向量:(内循环)
如果该数据向量可以被优化:
随机选择另外一个数据向量
同时优化两个数据向量
如果两个向量都不能被优化,退出内循环;
如果所有向量都没被优化,增加迭代数目,继续下次循环;
以上伪代码,效率较低,可以通过非随机选择另外一个alpha来进行优化。
通过最大化步长的方式来获取第二个alpha值。即分别计算i和j的误差,寻找差值最大。
对于复杂数据集则需要使用核函数(kernel),提供从一个特征空间到另一个特征控件的转换。可以通过解决高维度的线性问题,来等价于低维度的非线性问题。(对于数据点基本在一个园内的情况,可以考虑径向基核函数)
(备注:具体代码来自《机器学习实战》)