感知机到支持向量机流程

一:感知机

1.定义:
输入空间(特征空间)x ,输出空间(类别)y=1,+1 。由输入空间到输出空间的映射为如下函数

f(x)=sign(wx+b)

称为感知机。
2.思想
由训练样本T=(x1,y1)...(xn,yn) ,求得感知机模型f(x)=sign(wx+b) 。或者求出分类超平面(wx+b)=0
说明:分类超平面无数多个或者说,感知机模型无数多个。
这里写图片描述
2.算法流程
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

二:支持向量机

1.简单介绍
支持向量机由简单到复杂。
线性可分支持向量机:硬间隔最大化。
线性支持向量机:软间隔最大化,通过引进一个松弛变量,使得函数间隔加上松弛变量大于等于1。
非线性支持向量机:在对偶问题中巧妙的引进核函数。

2.线性可分支持向量机算法流程
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

3.非线性支持向量机序列最小最优算法SMO
这里写图片描述

对于优化的解,需要满足的KKT条件:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

综上:SMO算法如下
这里写图片描述

# -*- coding: utf-8 -*-
from numpy import *
from time import sleep

def loadDataSet (fileName):
    dataMat=[];
    labelMat=[];
    fr=open(fileName)
    for line in fr.readlines():
        lineArr=line.strip().split('\t')
        dataMat.append([float(lineArr[0]),float(lineArr[1])])
        labelMat.append(float(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):   ##注意L H的先后顺序
    if aj>H:
        aj=H
    if L>aj:
        aj=L
    return aj


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)))#拉格朗日乘子,m个样本,m 个alphas 
    iter=0;

    while(iter<maxIter):
        alphaPairsChanged=0   
        for i in range(m):
   #定义 g(x)  x输入  g(x)预测输出    
    ## alphas :100*1  labelMat:100*1  
           ##

            Ei=gXi-float(labelMat[i])            
            if((labelMat[i]*Ei<-toler)and(alphas[i]<C))or ((labelMat[i]*Ei>toler)and(alphas[i]>0)):   
            #选取a(i)违反KKT条件进入下面
                                                                                                                                                            #更新一次 a1,a2
                j=selectJrand(i,m)                                     ##随机选择 a(j)
                gXj=float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T))+b  
                Ej=gXj-float(labelMat[j])

                alphaIold=alphas[i].copy();
                alphaJold=alphas[j].copy();
                #考虑a(j)的最优化问题,计算a(j)的取值范围
                if (labelMat[i]!=labelMat[j]):
                   L=max(0,alphas[j]-alphas[i])
                   H=min(C,C+alphas[j]-alphas[i])
                else:
                   L=max(0,alphas[j]+alphas[i]-C)
                   H=min(C,alphas[j]+alphas[i])

                if L==H:print "L+H";continue
                #计算  eta=-(K11+k22-2*K12)
                eta=2.0*dataMatrix[i,:]*dataMatrix[j,:].T-dataMatrix[i,:]*dataMatrix[i,:].T-dataMatrix[j,:]*dataMatrix[j,:].T
                if eta>=0:print "eta>0";continue
                #更新a(j)
                alphas[j]-=labelMat[j]*(Ei-Ej)/eta
                alphas[j]=clipAlpha(alphas[j],H,L)
                #a(j)下降范围太小
                if(abs(alphas[j]-alphaJold)<0.00001):
                   print  "j not moving enough";continue
                ##更新 b1,b2
                alphas[i]+=labelMat[j]*labelMat[i]*(alphaJold-alphas[j])
                b1=b-Ei-labelMat[i]*(alphas[i]-alphaIold)* dataMatrix[i,:]*dataMatrix[i,:].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                b2=b-Ej-labelMat[i]*(alphas[i]-alphaIold)* dataMatrix[i,:]*dataMatrix[j,:].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T
                if(0<alphas[i]) and (C>alphas[i]):b=b1
                elif (0<alphas[j]) and (C>alphas[j]):b=b2
                else:b=(b1+b2)/2.0
                alphaPairsChanged+=1;
                print"itef:%d i: %d,pairs changed %d" %\
                                           (iter,i,alphaPairsChanged)
        if(alphaPairsChanged==0):iter+=1
        else:iter=0
        print"iteration number:%d"  %iter
    return b,alphas

参考文献:
统计学习方法。李航。
机器学习实战。
序列最小最优算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章