import random
from numpy import *
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
#功能:在(0, m)的区间范围内随机选择一个除i以外的整数
#输入:不能选择的整数i,区间上界m
#输出:随机选择的整数
def selectJrand(i,m):
j=i
while(j==i):
j=int(random.uniform(0,m))
return j
#功能:保证aj在区间[L, H]里面
#输入:要调整的数aj,区间上界H,区间下界L
#输出:调整好的数aj
def clipAlpha(aj,H,L):
if aj>H:
aj=H
if L>aj:
aj=L
return aj
#功能:简化版SMO算法
#输入:数据矩阵dataMatIn,标签向量classLabels,常数C,容错率toler,最大迭代次数maxIter
#输出:超平面位移项b,拉格朗日乘子alpha
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*1阶矩阵
iter=0
while(iter<maxIter):#循环直到超出最大迭代次数
alphaPairsChanged=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(alphas[i]<C))or((labelMat[i]*Ei>toler)and (alphas[i]>0)):#在(0, m)的区间范围内随机选择一个除i以外的整数,即随机选择第二个alpha
j=selectJrand(i,m)
#求变量alphaJ对应的误差
fxj=float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T))+b
Ej=fxi-float(labelMat[j])
#不能直接 alphaIold = alphas[i],否则alphas[i]和alphaIold指向的都是同一内存空间
alphaIold=alphas[i].copy();
alphaJold=alphas[j].copy();
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=2.0*dataMatrix[i:]*dataMatrix[j,:].T-dataMatrix[i,:]*dataMatrix[i,:].