SVM

来源:互联网 发布:以前很火的网络歌曲 编辑:程序博客网 时间:2024/06/05 03:01

支持向量机


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]))



0 0
原创粉丝点击