一:感知机
1.定义:
输入空间(特征空间)
x
,输出空间(类别)
f(x)=sign(w∗x+b)
称为感知机。
2.思想
由训练样本 T=(x1,y1)...(xn,yn) ,求得感知机模型 f(x)=sign(w∗x+b) 。或者求出分类超平面 (w∗x+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
参考文献:
统计学习方法。李航。
机器学习实战。
序列最小最优算法