(机器学习实战)2.3手写识别系统(详细注释)

编译:python3.6

代码和训练集下载:https://pan.baidu.com/s/1m7HdAkuwGgXX8v5-DN118Q

import operator 
from numpy import *
from scipy import *
from matplotlib import *



"""
	KNN近邻分类思路:
	1,用shape[0]得到行数
	2,把带划分数据用tile扩展成一个矩阵
	3,(用该矩阵-训练数据)平方后开方得到一个列表
	4,对列表按距离升序排列
	5,选取前K个中标签出现次数后按降序排列,[0][0]即为出现最多的标签作为带预测的划分标签
    """
#inx为自己输入要分类的测试数,dataset为训练集,labels为标签集,k为kNN中的K值
#shape[0]得到训练样本多少行
#tile建立inx,dataSetSize行,1列
#sum(axis=1),按行相加
#argsort递增排序
def classify0(inX,dataSet,labels,k):
	dataSetSize=dataSet.shape[0]
	diffMat=tile(inX,(dataSetSize,1))-dataSet
	sqDiffMat=diffMat**2
	sqDistances=sqDiffMat.sum(axis=1)    #
	distances=sqDistances**0.5
	sortedDistIndicies=distances.argsort() #生成的不是距离而是标号列表 
	#print(sortedDistIndicies)
	classCount={}
	for i in range(k):
		#print(sortedDistIndicies[i])              
		voteIlabel=labels[sortedDistIndicies[i]]    
		classCount[voteIlabel]=classCount.get(voteIlabel,0)+1   #这一步是做相同标签的统计(+1),找到键voteIlabel对应的值,如果不存在这样的键则返回默认值0
		#print(classCount.get(voteIlabel,0))
	sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #sorted排序做升序,返回副本,原始输入不变,里面的参数设置请参考https://www.cnblogs.com/timtike/p/6562402.html,https://blog.csdn.net/hshl1214/article/details/40587985
	#print(sortedClassCount[0][0])                                                       #或者参考https://www.cnblogs.com/zhoufankui/p/6274172.html
	return sortedClassCount[0][0]




"""
	将图像转换为测试向量:
	1、建立1*1024的0矩阵
	2、用历遍的方法生成矩阵
	"""
def img2vector(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])
	return returnVect






"""
	测试算法思路:
	1、创建训练特征矩阵
	2、存储训练特征矩阵和标签
	3、创建错误累加
	4、用历遍的方式累加
	"""
from os import listdir
def handwritingClassTest():
	hwLabels=[]
	trainingFileList=listdir('trainingDigits')
	m=len(trainingFileList)
	trainingMat=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('trainingDigits/%s'%fileNameStr)  #/代表子文件夹
	testFileList=listdir('testDigits')
	errorCount=0.0
	mTest=len(testFileList)
	for i in range(mTest):
		fileNameStr=testFileList[i]
		fileStr=fileNameStr.split('.')[0]         #提取文件名
		classNumStr=int(fileStr.split('_')[0])               #提取文件名前面的数字
		vectorUnderTest=img2vector('testDigits/%s'%fileNameStr)  #/代表子文件夹
		classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
		print("the classifier come back with %d,the real result is %d"%(classifierResult,classNumStr))
		if(classifierResult!=classNumStr):errorCount+=1
	print('\n the total numer of errors is %d'%errorCount)
	print('\n the total error rate is %f'%(errorCount/float(mTest)))

#可以选择显示一下
#handwritingClassTest()	
	
	
	
"""
	字符预测函数思路:
	1,输入特征值
	2、建立特征值数组
	3、归一化特征值
	4、输入预测文档如:4_0.txt
	5、返回预测值
	"""
def classifyChrct():
	hwLabels=[]
	trainingFileList=listdir('trainingDigits')
	m=len(trainingFileList)
	trainingMat=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('trainingDigits/%s'%fileNameStr)  #/代表子文件夹
	inputDocument=input('Please input the document with .txt that you want forecast\n')
	vectorUnderTest=img2vector('testDigits/%s'%(inputDocument))
	classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
	print("the classifier come back with %d"%(classifierResult))

#预测看结果
classifyChrct()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值