支持向量机
1.基于最大间隔分隔数据
优点:泛化错误率低。计算开销不大,结果易解释
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题
使用数据:数值型和标称型数据
我们希望找到离分隔超平面最近的点,确保它们离分隔面的距离尽可能远
在这里仅仅简单介绍,更为详细的数学需要自己去专门的书籍中学习。
2 .求解(SMO)
SMO表示序列最小化(Sequential Minimal Optimization。总体思想:将大优化问题分解为多个小优化问题来求解。这些小问题往往更易求解,并且对它们进行顺序求解的结果与将他们作为整体求解的结果一致。在结果相同时,SMO求解时间更短。
SMO算法的目标是求出一系列alpha和b,一旦求出了这些alpha,就很容易计算出权重向量w。
SMO的工作原理:每次循环中选择两个alpha进行优化处理。一旦找到一对合适(两个alpha必须要符合一定的条件,条件之一就是两个alpha必须要在间隔边界之外,另一个条件为这两个alpha还没有过区间化处理或者不在边界上)的alpha,那么就增大其中一个同时减小。
(1)SMO中的辅助函数
def loadDataSet(filename):
dataMat=[];labelMat=[]
fr =open(filename)
for line in fr:
lineArr=line.strip().split('\t')
dataMat.append([lineArr[0] ,lineArr[1] ])
labelMat.append(lineArr[2])
return dataMat,labelMat
def selectJrand(i,m):
j=i;
while(j==i):
j=int(random.uniform(0,m))
return j
def clipAlpha(aj,H,L):
if aj > H:
aj=H
if L>aj:
aj=L
return aj
改简化版SMO的伪代码大致如下:
1.创建一个alpha向量并将其初始化为0向量
2.当迭代次数小于最大迭代次数时(外循环)
对数据集中的每个数据向量(内循环):
如果该数据向量可以被优化:
随机选择另外一个数据向量
同时优化这两个向量
如果两个向量都不能被优化,退出内循环
如果所有向量都没有被优化,增加迭代数目,继续下一次循环
def smoSimple(dataMatIn,classLabels,C,toler,maxIter):
dataMatrix=mat(dataMatIn); labelMat=mat(classlabels).transpose()
b=0;m,n=shape(dataMatrix)
alphas=mat(zeros((m,1)))
iter=0
while(iter<maxIter):
alphaParisChanged=0
for i in range(m):
fXi= float( multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[ i, :].T))+b
Ei=fXi-float(labelMat[i])
if ((labelMat[i]*Ei<-toler) and (alpha[i]<C)) or ((labelMat[ i ]*Ei>toler) and (alphas[ i ]>0 ) ) :
j=selectJrand(i,m)
fXj=float(multiply(alphas[i]))

本文介绍了支持向量机(SVM)的基本原理及其优势,包括如何通过最大化间隔来进行分类,并讨论了针对大规模数据集的高效求解方法——序列最小优化(SMO)算法。SMO算法将大型优化问题分解成一系列易于解决的小问题。
1392

被折叠的 条评论
为什么被折叠?



