未加星标

python使用KNN算法手写体识别

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 | 作者 红领巾 ] 0人收藏点击收藏

本文实例为大家分享了用KNN算法手写体识别的具体代码,供大家参考,具体内容如下

#!/usr/bin/python
#coding:utf-8

import numpy as np
import operator
import matplotlib
import matplotlib.pyplot as plt
import os

'''''
KNN算法
1. 计算已知类别数据集中的每个点依次执行与当前点的距离。
2. 按照距离递增排序。
3. 选取与当前点距离最小的k个点
4. 确定前k个点所在类别的出现频率
5. 返回前k个点出现频率最高的类别作为当前点的预测分类
'''

'''''
inX为要分类的向量
dataSet为训练样本
labels为标签向量
k为最近邻的个数
'''
def classify0(inX , dataSet , labels , k):
dataSetSize = dataSet.shape[0]#dataSetSize为训练样本的个数
diffMat = np.tile(inX , (dataSetSize , 1)) - dataSet#将inX扩展为dataSetSize行,1列
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()#返回的是元素从小到大排序后,该元素原来的索引值的序列
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]#voteIlabel为类别
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1#如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1'‘2'排序。reverse=True是降序排序
print sortedClassCount
return sortedClassCount[0][0]


'''''
将图像转换为1*1024的向量
'''
def img2vector(filename):
returnVect = np.zeros((1,1024))
fr = open(filename)
for i in range(32):
line = fr.readline()
for j in range(32):
returnVect[0,i*32+j] = int(line[j] )
return returnVect

'''''
手写体识别系统测试
'''
def handwritingClassTest(trainFilePath,testFilePath):
hwLabels = []
trainingFileList = os.listdir(trainFilePath)
m=len(trainingFileList)
trainSet = np.zeros((m,1024))
for i in range(m):
filename = trainingFileList[i]
classNum = filename.split('.')[0]
classNum = int(classNum.split('_')[0])
hwLabels.append(classNum)
trainSet[i] = img2vector( os.path.join(trainFilePath,filename) )
testFileList = os.listdir(testFilePath)
errorCount = 0
mTest = len(testFileList)
for i in range(mTest):
filename = trainingFileList[i]
classNum = filename.split('.')[0]
classNum = int(classNum.split('_')[0])
vectorUnderTest = img2vector(os.path.join(trainFilePath, filename))
classifyNum = classify0(vectorUnderTest,trainSet,hwLabels,10)
print "the classifier came back with : %d , the real answer is : %d"% (classifyNum , classNum)
if(classifyNum != classNum) : errorCount+=1
print ("\nthe total number of error is : %d"%errorCount)
print ("\nthe error rate is : %f"%(float(errorCount)/mTest))
handwritingClassTest()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


您可能感兴趣的文章:Python实现识别手写数字 简易图片存储管理系统Python实现识别手写数字 Python图片读入与处理Python实现识别手写数字大纲python实现识别手写数字 python图像识别算法python实现图像识别功能学习Python3 Dlib19.7进行人脸面部识别Python3结合Dlib实现人脸识别和剪切用Python进行简单图像识别(验证码)Python3一行代码实现图片文字识别的示例Python用sndhdr模块识别音频格式详解

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

tags: classNum,filename,识别,Python,range,os,python,import,voteIlabel,split,np,classCount,print
分页:12
转载请注明
本文标题:python使用KNN算法手写体识别
本站链接:https://www.codesec.net/view/572284.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(60)