赞
踩
本文摘自《机器学习实战》案例,对其进行了代码更新与注释。
使用k-近邻分类器构造手写识别系统,为了简单起见,系统只识别0-9,需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素*32像素的黑白图像。每个图像存于相应的txt文档中,如数字0的图像,存于‘0_x.txt’;数字1的图像,存于‘1_x.txt’中,其中x代表文档在文件夹的位次。
需要资源者请回复!!!
为了分类器更好处理,我们将把一个3232的二进制图像矩阵转化为11024的向量
def img2vector(filename): fr=open(filename) totalContent=fr.readlines() #size记录每列字符的数量,即行数,为32 size=len(totalContent) #returnVectorLen记录文件中字符的数量,为1024 returnVectorLen=0 #horizonSize记录每行字符的数量,即列数,为32 horizonSize=0 for line in totalContent: line=line.strip() horizonSize=len(line) returnVectorLen+=horizonSize returnVect=np.zeros((1,returnVectorLen)) for i in range(size): linestr=totalContent[i] for j in range(horizonSize): returnVect[0,horizonSize*i+j]=int(linestr[j]) return returnVect
def classify0(inx,dataset,labels,k): datasize=dataset.shape[0] diffMat=np.tile(inx,(datasize,1))-dataset sqDiffMat=diffMat**2 #axis=1代表横轴,即列表每行求和 sqDistance=sqDiffMat.sum(axis=1) distance=sqDistance**0.5 #.argsort()返回列表值从小到大的索引值 sortedDistIndicies=distance.argsort() classCount={} for i in range(k): voteIlabel=labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #items()返回字典的元组列表,逆序=降序;sorted()函数返回的是列表副本,sort()是对自己的操作,无返回值 sortedClassCount=sorted(classCount.items(),key=lambda x:x[1],reverse=True) return sortedClassCount[0][0]
在资源中,我们已经准备好测试文件‘testDigits’
from os import listdir def handwritingClassTest(): hwLabels=[] #listdir用于列出给定目录其中的文件名 trainingFileList=listdir('traingDigits') m=len(trainingFileList) trainingMat=np.zeros((m,1024)) for i in range(m): fileNameStr=trainingFileList[i] fileStr=fileNameStr.split('.')[0] classNumStr=int(fileStr.split('_')[0]) hwLabels.append(classNumStr) trainingMat[i,:]=img2vector('traingDigits/'+fileNameStr) testFileList=listdir('testDigits') errorCount=0.0 mTest=len(testFileList) for i in range(mTest): fileNamestr=testFileList[i] fileStr=fileNameStr.plit('.')[0] classNumStr=int(fileStr.split('_')[0]) vectorUnderTest=img2vector('testDigits/'+fileNameStr) classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3) if classifierResult!=classNumStr: errorCount+=1.0 return errorCount/float(mTest)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。