python使用KNN算法识别手写数字


Posted in Python onApril 25, 2019

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

# -*- coding: utf-8 -*-
#pip install numpy
import os
import os.path
from numpy import *
import operator
import time
from os import listdir
 
"""
描述:
  KNN算法实现分类器
参数:
  inputPoint:测试集
  dataSet:训练集
  labels:类别标签
  k:K个邻居
返回值:
  该测试数据的类别
"""
def classify(inputPoint,dataSet,labels,k):
  dataSetSize = dataSet.shape[0] #已知分类的数据集(训练集)的行数
  #先tile函数将输入点拓展成与训练集相同维数的矩阵,再计算欧氏距离
  diffMat = tile(inputPoint,(dataSetSize,1))-dataSet #样本与训练集的差值矩阵
 
  # print(inputPoint);
  sqDiffMat = diffMat ** 2 #sqDiffMat 的数据类型是nump提供的ndarray,这不是矩阵的平方,而是每个元素变成原来的平方。
  sqDistances = sqDiffMat.sum(axis=1)  #计算每一行上元素的和
  # print(sqDistances);
  distances = sqDistances ** 0.5   #开方得到欧拉距离矩阵
  # print(distances);
  sortedDistIndicies = distances.argsort() #按distances中元素进行升序排序后得到的对应下标的列表,argsort函数返回的是数组值从小到大的索引值
  # print(sortedDistIndicies);
 
  # classCount数据类型是这样的{0: 2, 1: 2},字典key:value
  classCount = {}
  # 选择距离最小的k个点
  for i in range(k):
    voteIlabel = labels[ sortedDistIndicies[i] ]
    # print(voteIlabel)
    # 类别数加1
    classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
  print(classCount)# {1: 1, 7: 2}
  #按classCount字典的第2个元素(即类别出现的次数)从大到小排序
  sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
  print(sortedClassCount)# [(7, 2), (1, 1)]
  return sortedClassCount[0][0]
 
"""
描述:
  读取指定文件名的文本数据,构建一个矩阵
参数:
  文本文件名称
返回值:
  一个单行矩阵
"""
def img2vector(filename):
 returnVect = []
 fr = open(filename)
 for i in range(32):
  lineStr = fr.readline()
  for j in range(32):
   returnVect.append(int(lineStr[j]))
 return returnVect
 
"""
描述:
  从文件名中解析分类数字,比如由0_0.txt得知这个文本代表的数字分类是0
参数:
  文本文件名称
返回值:
  一个代表分类的数字
"""
def classnumCut(fileName):
  fileStr = fileName.split('.')[0]
  classNumStr = int(fileStr.split('_')[0])
  return classNumStr
 
"""
描述:
  构建训练集数据向量,及对应分类标签向量
参数:
  无
返回值:
  hwLabels:分类标签矩阵
  trainingMat:训练数据集矩阵
"""
def trainingDataSet():
  hwLabels = []
  trainingFileList = listdir('trainingDigits')   #获取目录内容
  m = len(trainingFileList)
  # zeros返回全部是0的矩阵,参数是行和列
  trainingMat = zeros((m,1024))    #m维向量的训练集
  for i in range(m):
    # print (i);
    fileNameStr = trainingFileList[i]
    hwLabels.append(classnumCut(fileNameStr))
    trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)
  return hwLabels,trainingMat
 
"""
描述:
  主函数,最终打印识别了多少个数字以及识别的错误率
参数:
  无
返回值:
  无
"""
def handwritingTest():
  """
  hwLabels,trainingMat 是标签和训练数据,
  hwLabels 是一个一维矩阵,代表每个文本对应的标签(即文本所代表的数字类型)
  trainingMat是一个多维矩阵,每一行都代表一个文本的数据,每行有1024个数字(0或1)
  """
  hwLabels,trainingMat = trainingDataSet() #构建训练集
  testFileList = listdir('testDigits') #获取测试集
  errorCount = 0.0    #错误数
  mTest = len(testFileList)    #测试集总样本数
  t1 = time.time()
  for i in range(mTest):
    fileNameStr = testFileList[i]
    classNumStr = classnumCut(fileNameStr)
    # img2vector返回一个文本对应的一维矩阵,1024个0或者1
    vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
    #调用knn算法进行测试
    classifierResult = classify(vectorUnderTest, trainingMat, hwLabels, 3)
    # 打印测试出来的结果和真正的结果,看看是否匹配
    print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))
    # 如果测试出来的值和原值不相等,errorCount+1
    if (classifierResult != classNumStr):
      errorCount += 1.0
  print("\nthe total number of tests is: %d" % mTest)   #输出测试总样本数
  print ("the total number of errors is: %d" % errorCount )  #输出测试错误样本数
  print ("the total error rate is: %f" % (errorCount/float(mTest))) #输出错误率
  t2 = time.time()
  print ("Cost time: %.2fmin, %.4fs."%((t2-t1)//60,(t2-t1)%60) ) #测试耗时
 
"""
描述:
  指定handwritingTest()为主函数
"""
if __name__ == "__main__":
 handwritingTest()

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

Python 相关文章推荐
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
Python yield 使用浅析
May 28 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
python中的json总结
Oct 11 Python
在Python中定义一个常量的方法
Nov 10 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
python定时任务 sched模块用法实例
Nov 04 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
Python3.5运算符操作实例详解
Apr 25 #Python
Python对象转换为json的方法步骤
Apr 25 #Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 #Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
Apr 25 #Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 #Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 #Python
NumPy 数组使用大全
Apr 25 #Python
You might like
php 计划任务 检测用户连接状态
2012/03/29 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
JS与C#编码解码
2013/12/03 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
python实现微信自动回复机器人功能
2019/07/11 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Pycharm安装python库的方法
2020/11/24 Python
python中remove函数的踩坑记录
2021/01/04 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
"序列点" 是什么
2016/07/29 面试题
师范毕业生自我鉴定
2014/01/15 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
经销商年会策划方案
2014/05/29 职场文书
董事长岗位职责
2015/02/13 职场文书
旅游项目合作意向书
2015/05/08 职场文书
同意离婚答辩状
2015/05/22 职场文书