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访问sqlserver示例
Feb 10 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
如何用python写一个简单的词法分析器
Dec 18 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python3字符串encode与decode的讲解
Apr 02 Python
如何基于Python批量下载音乐
Nov 11 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
基于python实现文件加密功能
Jan 06 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
python实现ROA算子边缘检测算法
Apr 05 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新手上路(二)
2006/10/09 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
精伦电子Java笔试题
2013/01/16 面试题
甜品店的创业计划书范文
2014/01/02 职场文书
文秘人员工作职责
2014/01/31 职场文书
健康教育评估方案
2014/05/25 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
放牛班的春天观后感
2015/06/01 职场文书
公司欠款证明
2015/06/24 职场文书
婚庆主持词大全
2015/06/30 职场文书
感恩教师节主题班会
2015/08/12 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫