感知機到支持向量機流程

一:感知機

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

參考文獻:
統計學習方法。李航。
機器學習實戰。
序列最小最優算法

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