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 相关文章推荐
Cython 三分钟入门教程
Sep 17 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
Python验证码识别的方法
Jul 10 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
python获取本机所有IP地址的方法
Dec 26 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
python flappy bird小游戏分步实现流程
Feb 15 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下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
循环 vs 递归浅谈
2013/02/28 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
详解Python中的__init__和__new__
2014/03/12 Python
python私有属性和方法实例分析
2015/01/15 Python
Python与Redis的连接教程
2015/04/22 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python取代netcat过程分析
2018/02/10 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
导致python中import错误的原因是什么
2020/07/01 Python
MYSQL基础面试题
2012/05/13 面试题
创建文明学校实施方案
2014/03/11 职场文书
安踏广告词改编版
2014/03/21 职场文书
功夫熊猫观后感
2015/06/10 职场文书
大学生实习证明
2015/06/16 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
医院消毒隔离制度
2015/08/05 职场文书
2019个人工作总结
2019/06/21 职场文书
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL