Knn算法之手写识别系统
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算法之手写识别系统相关推荐
- 【Python】基于kNN算法的手写识别系统的实现与分类器测试
基于kNN算法的手写识别系统 1. 数据准备 使用windows画图工具,手写0-9共10个数字,每个数字写20遍,共200个BMP文件. 方法如下,使用画图工具,打开网格线,调整像素为32 ...
- knn算法测试手写识别系统准确率
手写识别系统,KNN算法实现手写识别系统的准确率 (准确率=测试分对的样本数/总的样本数) import numpy as np from itertools import chain from os ...
- 【机器学习实战】k近邻算法实战——手写识别系统
文章目录 手写识别系统 步骤: 准备数据:将图像转换为测试向量 测试算法:使用k-近邻算法识别手写数字 [完整代码] 手写识别系统 为了简单起见,这里构造的系统只能识别数字0到9,参见图2-6.需要识 ...
- java手写识别_手写识别系统
目的 采用k-近邻算法实现手写识别系统.这里采用0和1组成数字0-9的形状,再用算法对这些形状进行识别,来分辨出形状属于0-9那个数字.并计算出k-近邻算法识别手写数字的错误率. 数据说明 数据来自& ...
- 机器学习入门-kNN算法实现手写数字识别
实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别, ...
- 机器学习算法(一):k-近邻理论与python实现+经典应用(约会网站匹配、手写识别系统)
一份算法学习笔记~ 亲爱的朋友,恭喜你点开神秘之门,哈哈哈哈!从这里开始,我们一起学习机器学习的经典算法吧. 这一次的主要内容是机器学习入门算法:k-近邻.理论相当好理解,下面我们正式开始啦! 算法简 ...
- kNN算法实现手写数字识别(机器学习)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...
- python实现手写识别系统
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.手写识别系统 二.主要步骤 1.准备数据:将图像转换为测试向量 2.测试算法:使用k-近邻算法识别手写数字 总结 ...
- 机器学习实战-手写识别系统
在实现了K近邻算法后,书中给出了一个实例,今天来学习一下使用K近邻分类器的手写识别系统.书中原带的文件已经过处理转换为了文本格式,方便了许多. 先看一下原带文件 准备数据 #将图像转换为测试向量 de ...
最新文章
- 一步步实施 DevOps (三)
- python列表切片得到的是列表还是字符串_python中列表的切片问题 python arry怎么取列切片...
- python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
- python中的非阻塞使用互斥锁
- php 修改文件访问时间,PHP中获取文件创建日期、修改日期、访问时间的方法
- 搜狗浏览器中如何删除自带工具 搜狗浏览器删除自带工具的方法步骤
- weui上传组件的图片封装到formdata_自定义toast-ui富文本组件的图片黏贴上传
- 以后给孩子起名字不用发愁了,先存着
- 德勤中国成长型AI企业研究报告:迈向巅峰之路
- 【IPD从零到一】创业指导:IPD 是什么?
- android 百度离线下载速度慢,Android手机解决百度网盘下载速度限制
- 用python开发的运维管理系统_python运维开发常用模块(一)psutil
- 基于SIR的社交网络谣言传播问题简单建模
- 02-PDI(Kettle)导入与导出
- Linux从入门到入狱-01
- Week of 2.21
- 快速校验 input内容规则
- 森林防火监控系统解决方案及标准权威解读
- UTL_FILE包的使用解析
- 企业运维容器之 docker仓库
热门文章
- unreal engine各个版本网盘离线下载
- 前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)
- Bzoj3236:[Ahoi2013]作业:莫队算法+树状数组
- BGP Aggregation – Suppress Map
- 图像放缩之双立方插值
- 印刷业的“用户端价值”战争
- 智慧树课程问答怎么得分
- UI设计行业领域知识体系
- 2021-07-22
- 繁星闪烁 ,芳华似锦,走自己的路