本文摘自《机器学习实战》案例,对其进行了代码更新与注释。
实战介绍
使用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=len(totalContent)
returnVectorLen=0
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
k-近邻算法
def classify0(inx,dataset,labels,k):
datasize=dataset.shape[0]
diffMat=np.tile(inx,(datasize,1))-dataset
sqDiffMat=diffMat**2
sqDistance=sqDiffMat.sum(axis=1)
distance=sqDistance**0.5
sortedDistIndicies=distance.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),key=lambda x:x[1],reverse=True)
return sortedClassCount[0][0]
测试算法:使用k-近邻算法识别手写数字
在资源中,我们已经准备好测试文件‘testDigits’
from os import listdir
def handwritingClassTest():
hwLabels=[]
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)