1. 基本定义
(1)分隔超平面: 分类的决策边界,分布在超平面一侧的所有数据都属于某个类别, 分布在另一测的所有数据则属于另一个类别.
(2) 间隔: 样本点到分割面的距离; 在训练过程中, 希望间隔尽可能大, 因为如果我们犯错或者在有限数据上训练分类器的话,希望分类器尽可能健壮.
(3) 支持向量: 离分割超平面最近的那些点.
2. svm
(1) 支持向量机是一个二类分类器;类别标签采用-1和+1而不是0/1的原因: -1和+1只有符号不一样的区别,方便数学上的处理,可以通过一个统一公式来表示间隔或者数据点到分隔超平面的距离:label*(wx+b);
(2) 松弛变量:允许有些数据点可以处于分\隔面的错误一侧.
(3) 常数C用于控制"最大化间隔"和"保证大部分点的函数间隔小于1.0"这两个目标的权重.
(4) svm的关键是求解alpha(0<=alpha<=C)
(5) SMO(sequential minimal optimization)算法是将大优化问题分解为多个小优化问题来求解.SMO的目标就是求出一系列alpha和b,然后计算得到权重向量w,最终得到分隔超平面.
其工作原理: 每次循环中选择两个alpha进行优化处理.一旦找到一对合适的alpha,那么就增大一个同时减小一个.合适指的是满足一下2个条件:1.这两个alpha必须在间隔边界之外;2.这两个alpha没有进行过区间化处理或者不在边界上.
3. 简化版smo算法
(1)简化点:SMO算法应该要确定要优化的最佳alpha对,简化版跳过这一项,首先在数据集上遍历没一个alpha,然后在剩下的alpha集合中随机选择另一个alpha,从而构成alpha对.
(2)SMO函数伪代码
创建一个alpha向量并将其初始化为0向量
当迭代次数小于最大迭代次数时(外循环):
对数据集中的每个数据向量(内循环):
如果该数据向量可以被优化:
随机选择另外一个数据向量,同时优化这两个向量
若两个向量都不能被优化,退出内循环
如果所有向量都没被优化,增加迭代次数,继续下一次循环
实现代码如下:
#produce a random different from i in interval[0,m]
#i是地一个alpha的下标,m是所有alpha的数目,函数随机产生一个不是i的下标,作为j
def selectRand(i,m):
j = i
while (j==i):
j = int(random.uniform(0,m))
return j
#adjust the value of alpha
#调整大于H或小于L的alpha值
def clipAlpha(aj,H,L):
if aj > H:
aj = H
if aj < L:
aj = L
return aj
#输入参数分别是数据集\类别标签\常熟C\容错率\退出前的最大循环次数
def smoSimple(dataMatIn,classLabels,C,toler,maxIter):
dataMatrix = mat(dataMatIn)
labelMatrix