一:感知機
1.定義:
輸入空間(特徵空間)
稱爲感知機。
2.思想
由訓練樣本
說明:分類超平面無數多個或者說,感知機模型無數多個。
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
參考文獻:
統計學習方法。李航。
機器學習實戰。
序列最小最優算法