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 流程控制实例代码
Sep 25 Python
python实现windows下文件备份脚本
May 27 Python
django缓存配置的几种方法详解
Jul 16 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
python写日志文件操作类与应用示例
Jul 01 Python
python中append实例用法总结
Jul 30 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
Django后台管理系统的图文使用教学
Jan 20 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python字典实现伪切片功能
Oct 28 Python
Selenium浏览器自动化如何上传文件
Apr 06 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.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
Python读写文件基础知识点
2019/06/10 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
python内置模块collections知识点总结
2019/12/19 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
运行Python编写的程序方法实例
2020/10/21 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
学生的自我鉴定范文
2013/10/24 职场文书
小学国庆节活动方案
2014/02/11 职场文书
继承公证书
2014/04/09 职场文书
情况说明书格式范文
2014/05/06 职场文书
国际金融专业自荐信
2014/07/05 职场文书
电子工程求职信
2014/07/17 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技