python使用KNN算法手写体识别

作者:一笑丶奈何 时间:2022-06-28 05:30:56 

本文实例为大家分享了用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()

来源:https://www.cnblogs.com/Lambda721/p/8397453.html

标签:python,KNN,识别
0
投稿

猜你喜欢

  • SQL基础语句总结

    2011-03-11 14:54:00
  • PHP概率计算函数汇总

    2023-11-19 08:06:19
  • Go语言HTTPServer开发的六种方式小结

    2023-06-22 21:48:21
  • Centos7.2 编译安装PHP7.0.2的步骤

    2023-10-08 12:51:29
  • Python实现图片格式转换

    2023-08-03 04:58:57
  • 纯CSS实现动态提示信息Tooltips

    2008-05-22 11:56:00
  • Go中的应用配置管理详解

    2023-06-21 00:40:55
  • 解决iframe的frameborder在chrome/ff/ie下的差异

    2023-08-09 00:23:24
  • 快速掌握 Mysql数据库对文件操作的封装

    2009-02-23 17:37:00
  • ASP实现长文章自动分页的函数代码

    2008-10-10 17:09:00
  • CSS 超链接图标规范 V1.0

    2007-12-28 12:05:00
  • 论Asp与XML的关系

    2008-03-05 12:01:00
  • python实现批量修改图片格式和尺寸

    2021-02-12 10:47:35
  • Python实现CET查分的方法

    2023-06-13 12:05:51
  • 在VS2008中编译MYSQL5.1.48的方法

    2023-07-12 00:42:46
  • django初始化数据库的实例

    2023-09-19 07:35:47
  • python3+PyQt5实现柱状图

    2023-06-02 22:19:36
  • Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    2023-09-16 04:58:30
  • 大家一起来折磨浏览器吧!(好玩的东东)

    2010-02-07 12:40:00
  • PHP json格式和js json格式 js跨域调用实现代码

    2023-11-22 05:20:18
  • asp之家 网络编程 m.aspxhome.com