from numpy import *
defimg2vector(filename):
returnVect= zeros((1,1024))
fr=open(filename)for i in range(32):
lineStr=fr.readline()for j in range(32):
returnVect[0,32*i+j] =int(lineStr[j])returnreturnVectdefloadImages(dirName):from os importlistdir
hwLabels=[]
trainingFileList= listdir(dirName) #load the training set
m =len(trainingFileList)
trainingMat= zeros((m,1024))for i inrange(m):
fileNameStr=trainingFileList[i]
fileStr= fileNameStr.split('.')[0] #take off .txt
classNumStr = int(fileStr.split('_')[0])if classNumStr == 9: hwLabels.append(-1)else: hwLabels.append(1)
trainingMat[i,:]= img2vector('%s/%s' %(dirName, fileNameStr))returntrainingMat, hwLabelsdef smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin', 0)): #full Platt SMO
oS =optStruct(mat(dataMatIn),mat(classLabels).transpose(),C,toler, kTup)
iter=0
entireSet=True
alphaPairsChanged=0while (iter < maxIter) and ((alphaPairsChanged > 0) or(entireSet)):
alphaPairsChanged=0if entireSet: #go over all
for i inrange(oS.m):
alphaPairsChanged+=innerL(i,oS)print("fullSet, iter: %d i:%d, pairs changed %d" %(iter,i,alphaPairsChanged))
iter+= 1
else:#go over non-bound (railed) alphas
nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A
alphaPairsChanged+=innerL(i,oS)print("non-bound, iter: %d i:%d, pairs changed %d" %(iter,i,alphaPairsChanged))
iter+= 1
if entireSet: entireSet = False #toggle entire set loop
elif (alphaPairsChanged == 0): entireSet =Trueprint("iteration number: %d" %iter)returnoS.b,oS.alphasdef testDigits(kTup=('rbf', 10)):
dataArr,labelArr= loadImages('F:\machinelearninginaction\Ch06\trainingDigits')
b,alphas= smoP(dataArr, labelArr, 200, 0.0001, 10000, kTup)
datMat=mat(dataArr)
labelMat=mat(labelArr).transpose()
svInd=nonzero(alphas.A>0)[0]
sVs=datMat[svInd]
labelSV=labelMat[svInd];print("there are %d Support Vectors" %shape(sVs)[0])
m,n=shape(datMat)
errorCount=0for i inrange(m):
kernelEval=kernelTrans(sVs,datMat[i,:],kTup)
predict=kernelEval.T * multiply(labelSV,alphas[svInd]) +bif sign(predict)!=sign(labelArr[i]):
errorCount+= 1
print("the training error rate is: %f" % (float(errorCount)/m))
dataArr,labelArr= loadImages('F:\machinelearninginaction\Ch06\testDigits')
errorCount=0
datMat=mat(dataArr)
labelMat=mat(labelArr).transpose()
m,n=shape(datMat)for i inrange(m):
kernelEval=kernelTrans(sVs,datMat[i,:],kTup)
predict=kernelEval.T * multiply(labelSV,alphas[svInd]) +bif sign(predict)!=sign(labelArr[i]):
errorCount+= 1
print("the test error rate is: %f" % (float(errorCount)/m))