knn值之手写识别系统

导入包

import  numpy as np
from os import listdir
import operator

介绍

1.os模块
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。它不包括 . 和 … 即使它在文件夹中。
listdir()方法语法格式如下:os.listdir(path) path – 需要列出的目录路径
2.operator模块
本模块主要包括一些Python内部操作符对应的函数。这些函数主要分为几类:对象比较、逻辑比较、算术运算和序列操作。

 操作                  语法                              函数相加                     a + b                       add(a, b)字符串拼接             seq1 + seq2           concat(seq1, seq2)包含测试              obj in seq              contains(seq, obj)普通除法                  a / b                   truediv(a, b)取整除法                   a // b                  floordiv(a, b)按位与                   a & b                   and_(a, b)按位异或                  a ^ b                   xor(a, b)按位取反                   ~ a                     invert(a)按位或                    a | b                   or_(a, b)指数运算                   a ** b                  pow(a, b)识别                 a is b                  is_(a, b)识别             a is not b                  is_not(a, b)索引赋值                obj[k] = v             setitem(obj, k, v)索引删除              del obj[k]              delitem(obj, k)索引               obj[k]                 getitem(obj, k)左移                a << b                    lshift(a, b)取模                 a % b                    mod(a, b)乘法             a * b                   mul(a, b)负数             -a                      neg(a)非运算               not a                   not_(a)正数               + a                        pos(a)右移运算              a >> b                rshift(a, b)切片赋值        seq[i:j] = values  setitem(seq, slice(i, j), values)切片删除       del seq[i:j]        delitem(seq, slice(i, j))切片     seq[i: j]           getitem(seq, slice(i, j))字符串格式化     s % obj             mod(s, obj)减法           a - b               sub(a, b)真值测试           obj                 truth(obj)小于            a < b                lt(a, b)小于等于            a <= b              le(a, b)等于          a == b                eq(a, b)不等于         a != b             ne(a, b)大于等于            a >= b              ge(a, b)大于          a > b                gt(a, b)

3.python中的sum函数.sum(axis=1)
我们平时用的sum应该是默认的axis=0 就是普通的相加,而当加入axis=1以后就是将一个矩阵的每一行向量相加,对一维数组,只有第0轴,没有第1轴。axis = 0,返回该二维矩阵的行数 axis = 1,返回该二维矩阵的列数

4.shape()函数,它的功能是读取矩阵的维度。

shape(matrixA) 返回matrixA的(行数,列数)元组

shape(matrixA) [0] 行数

shape(matrixA) [1] 列数

shape的输入参数可以使一个实数,一个一维列表(数组),二维数组,也可以是一个矩阵

5.tile()函数
在使用knn算法时候我们需要计算要分类的点到其他点的距离,这个使用我们可以将该分类点进行复制多份,然后分别与其他点进行计算即可,如图所示我们需要将要分类的点复制四份,然后分别与其他四个训练数据集的点做距离计算,然后对距离进行排序

6.argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。

x = np.array([1,4,3,-1,6,9])
y = x.argsort()

y=array([3,0,2,1,4,5])
例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5

手写数字识别系统之图片格式化

我们将图像格式化处理为一个向量。将一个3232的二进制图像矩阵转换为11024的向量。我们打开文件,循环读出文件的前32行,将每行的头32个字符值存储在Numpy数组中,最后返回数组。

def img2VEC(filename): vec = np.zeros((1,1024))  #  创建向量p = open(filename)    # 打开数据文件,读取每行内容for i in range(32):   # 读取每一行line = p.readline()for j in range(32):   # 将每行前 32 字符存入向量vec[0,32 * i + j] = line[j]return vec

KNN算法

def Classify(traindata ,testdata,label,k):rowsize = traindata.shape[0] #计算训练集的行数diff = np.tile(testdata,(rowsize,)) - traindata #计算训练样本和测试样本的差值   np.tile(testData, (rowSize, 1)) 是将 testData 这个数据扩展为 rowSize 列,这样能避免运算错误distance = ((diff ** 2).sum(axis=1)) ** 0.5  #距离平方和 再取平方根sortdistance = distance.argsort() #对所得的距离升序排序count = {} #计数for i in range(k):  # 依次取出最近的样本数据vote = label[sortdistance[i]]count[vote] = count.get(vote,0) + 1  # 记录该样本数据所属的类别sortcount = sorted(count.items(), key=operator.itemgetter(1), reverse=True)  # 对类别出现的频数降序排序# sorted(count.items(), key=operator.itemgetter(1), reverse=True) 排序函数,里面的参数 key=operator.itemgetter(1), reverse=True 表示按照 count 这个字典的值(value)从高到低排序,如果把 1 换成 0,则是按字典的键(key)从高到低排序。把 True 换成 False 则是从低到高排序return sortcount[0][0]  # 返回频数最高的类别

测试代码

def HWTest():hwlabels = []  # 样本数据的类标签列表trainingFileList = listdir('E:/jupyter/KNN实验/trainingDigits')   # 样本数据文件列表m = len(trainingFileList)trainingMat = np.zeros((m, 1024))# 初始化样本数据矩阵(M*1024)for i in range(m): # 依次读取所有样本数据到数据矩阵fileNameStr = trainingFileList[i]  # 提取文件名中的数字fileStr = fileNameStr.split('.')[0]classNumStr = int(fileStr.split('_')[0])hwlabels.append(classNumStr)trainingMat[i, :] = img2vector('E:/jupyter/KNN实验/trainingDigits/%s' % fileNameStr)  # 将样本数据存入矩阵testFileList = listdir('E:/jupyter/KNN实验/testDigits')# 循环读取测试数据# 初始化错误率errorCount = 0.0mTest = len(testFileList)# 循环测试每个测试数据文件for i in range(mTest):# 提取文件名中的数字fileNameStr = testFileList[i]fileStr = fileNameStr.split('.')[0]classNumStr = int(fileStr.split('_')[0])# 提取数据向量vectorUnderTest = img2vector('E:/jupyter/KNN实验/testDigits/%s' % fileNameStr)# 对数据文件进行分类classifierResult = classify0(vectorUnderTest, trainingMat, hwlabels, 3)# 打印 K 近邻算法分类结果和真实的分类print("测试样本 %d, 分类器预测: %d, 真实类别: %d" %(i + 1, classifierResult, classNumStr))# 判断K 近邻算法结果是否准确if (classifierResult != classNumStr):errorCount += 1.0# 打印错误率print("\n错误分类计数: %d" % errorCount)print("\n错误分类比例: %f" % (errorCount / float(mTest)))#main函数
if __name__ == '__main__':HWTest()

结果

Knn算法之手写识别系统相关推荐

  1. 【Python】基于kNN算法的手写识别系统的实现与分类器测试

    基于kNN算法的手写识别系统 1.      数据准备 使用windows画图工具,手写0-9共10个数字,每个数字写20遍,共200个BMP文件. 方法如下,使用画图工具,打开网格线,调整像素为32 ...

  2. knn算法测试手写识别系统准确率

    手写识别系统,KNN算法实现手写识别系统的准确率 (准确率=测试分对的样本数/总的样本数) import numpy as np from itertools import chain from os ...

  3. 【机器学习实战】k近邻算法实战——手写识别系统

    文章目录 手写识别系统 步骤: 准备数据:将图像转换为测试向量 测试算法:使用k-近邻算法识别手写数字 [完整代码] 手写识别系统 为了简单起见,这里构造的系统只能识别数字0到9,参见图2-6.需要识 ...

  4. java手写识别_手写识别系统

    目的 采用k-近邻算法实现手写识别系统.这里采用0和1组成数字0-9的形状,再用算法对这些形状进行识别,来分辨出形状属于0-9那个数字.并计算出k-近邻算法识别手写数字的错误率. 数据说明 数据来自& ...

  5. 机器学习入门-kNN算法实现手写数字识别

    实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别, ...

  6. 机器学习算法(一):k-近邻理论与python实现+经典应用(约会网站匹配、手写识别系统)

    一份算法学习笔记~ 亲爱的朋友,恭喜你点开神秘之门,哈哈哈哈!从这里开始,我们一起学习机器学习的经典算法吧. 这一次的主要内容是机器学习入门算法:k-近邻.理论相当好理解,下面我们正式开始啦! 算法简 ...

  7. kNN算法实现手写数字识别(机器学习)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...

  8. python实现手写识别系统

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.手写识别系统 二.主要步骤 1.准备数据:将图像转换为测试向量 2.测试算法:使用k-近邻算法识别手写数字 总结 ...

  9. 机器学习实战-手写识别系统

    在实现了K近邻算法后,书中给出了一个实例,今天来学习一下使用K近邻分类器的手写识别系统.书中原带的文件已经过处理转换为了文本格式,方便了许多. 先看一下原带文件 准备数据 #将图像转换为测试向量 de ...

最新文章

  1. 一步步实施 DevOps (三)
  2. python列表切片得到的是列表还是字符串_python中列表的切片问题 python arry怎么取列切片...
  3. python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
  4. python中的非阻塞使用互斥锁
  5. php 修改文件访问时间,PHP中获取文件创建日期、修改日期、访问时间的方法
  6. 搜狗浏览器中如何删除自带工具 搜狗浏览器删除自带工具的方法步骤
  7. weui上传组件的图片封装到formdata_自定义toast-ui富文本组件的图片黏贴上传
  8. 以后给孩子起名字不用发愁了,先存着
  9. 德勤中国成长型AI企业研究报告:迈向巅峰之路
  10. 【IPD从零到一】创业指导:IPD 是什么?
  11. android 百度离线下载速度慢,Android手机解决百度网盘下载速度限制
  12. 用python开发的运维管理系统_python运维开发常用模块(一)psutil
  13. 基于SIR的社交网络谣言传播问题简单建模
  14. 02-PDI(Kettle)导入与导出
  15. Linux从入门到入狱-01
  16. Week of 2.21
  17. 快速校验 input内容规则
  18. 森林防火监控系统解决方案及标准权威解读
  19. UTL_FILE包的使用解析
  20. 企业运维容器之 docker仓库

热门文章

  1. unreal engine各个版本网盘离线下载
  2. 前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)
  3. Bzoj3236:[Ahoi2013]作业:莫队算法+树状数组
  4. BGP Aggregation – Suppress Map
  5. 图像放缩之双立方插值
  6. 印刷业的“用户端价值”战争
  7. 智慧树课程问答怎么得分
  8. UI设计行业领域知识体系
  9. 2021-07-22
  10. 繁星闪烁 ,芳华似锦,走自己的路