资源下载地址:https://download.csdn.net/download/sheziqiong/86791480
资源下载地址:https://download.csdn.net/download/sheziqiong/86791480

实验目的:

实验内容:

  1. 实现最基本的KNN算法,使用trainingDigits文件夹下的数据,对testDigits中的数据进行预测。(K赋值为1,使用欧氏距离,多数投票决定分类结果)

  2. 改变K的值,并观察对正确率的影响。

  3. 更改距离度量方式,更改投票方式(距离加权),分析错误率。

实验要求:

  1. 要求给出代码,以及运行窗口截图。

  2. 对正确率的影响,最好用表格或作图说明,并做简要分析。

  3. 实验内容3为选做,不做统一要求。

实验步骤与内容:

代码来源

代码是在参考开源代码的基础上做出的改进

KNN分类算法实现手写数字识别 CSDN博客

http://www.cnblogs.com/ahu-lichang/p/7152539.html

算法设计说明

实验环境

  1. 硬件环境 个人笔记本电脑

  2. 软件环境 Python Eclipse Pydev插件

所用语言:Python

实验数据分析

把来自UCI数据库的手写数据集简化成32像素x32像素的黑白图像,并且以01矩阵的方式存储在txt文件中。大约有训练样本2000个,测试样本900个。

digits 目录下有两个文件夹,分别是:

  1. trainingDigits:训练数据,1934个文件,每个数字大约200个文件。
  2. testDigits:测试数据,946个文件,每个数字大约100个文件。

每个文件中存储一个手写的数字,文件的命名类似0_7.txt,第一个数字0表示文件中的手写数字是0,后面的7是个序号。

我们使用目录trainingDigits中的数据训练分类器,使用目录testDigits中的数据测试分类器的效果。两组数据没有重叠。

算法设计

1.思路

  1. KNN的主要思想是找到与待测样本最接近的k个样本,然后把这k个样本出现次数最多的类别作为待测样本的类别。
  2. 下载实验要求中给的数据集digits文件夹,用trainingDigits作训练集,用testDigits作为测试集
  3. 将每个样本的txt文件转换为对应的一个向量
  4. 以欧氏距离作为度量进行KNN算法,分析样本之间的相似度

2.具体实现

a.加载数据loadDataSet():

从digits文件夹中读取训练数据和测试数据

以训练数据为例

dataSetDir = './digits/'
trainingFileList = os.listdir(dataSetDir + 'trainingDigits')

加载同目录下/digits/trainingDigits中的训练数据文件

numSamples = len(trainingFileList)
train_x = zeros((numSamples, 1024))
train_y = []

train_x用来储存txt文件转换成的向量

train_y用来储存该文件实际代表的数字

for i in xrange(numSamples):filename = trainingFileList[i]对每个训练数据文件进行处理# get train_xtrain_x[i, :] = img2vector(dataSetDir + 'trainingDigits/%s' % filename)调用img2vector方法将txt文件转换为对应的一个向量# get label from file name such as "1_18.txt"label = int(filename.split('_')[0]) # return 1train_y.append(label)记录该文件实际代表的数字

加载测试集数据的过程同理,用test_x,test_y表示

b.将图片转换为向量img2vector(filename):

def  img2vector(filename):rows = 32cols = 32

数据的行列都是32

imgVector = zeros((1, rows * cols))
fileIn = open(filename)

对每个训练数据文件进行处理

  for row in xrange(rows):lineStr = fileIn.readline()for col in xrange(cols):imgVector[0, row * 32 + col] = int(lineStr[col])
return imgVector

转换为向量

c.KNN分类核心方法 kNNClassify(newInput, dataSet, labels, k):

newInput为待测试数据,dataSet是训练集,labels是分类合集

def kNNClassify(newInput, dataSet, labels, k):
numSamples = dataSet.shape[0]  # shape[0]代表行数

已知分类的数据集(训练集)的行数

先tile函数将输入点拓展成与训练集相同维数的矩阵,再计算欧氏距离

3.改进

由于使用了开源代码,所以需要对程序的输出方法进行修改。

原程序运行结果仅输出几个步骤提示,界面停滞几分钟后便直接输出准确率的结果,未免有些不到位,所以应该加入更加细致的算法运行结果的显示。

需要添加:

对每个测试样本进行KNN分类算法后的结果

与该样本实际类别的比较

print "分类结果为: %d, 实际类别为: %d" % (predict, test_y)总测试数量
print "总测试样本数: %d" % numTestSamples
测试准确数
print "测试正确样本数: %d" % matchCount
分类准确率
print '分类正确率: %.2f%%' % (accuracy * 100)

实验结果

要求:改变K的值,并观察对正确率的影响。

K值 正确率
1 98.63%
2 98.63%
3 98.84%
4 98.52%
5 98.20%

实验结果分析:

根据上方的图表,可以看出K的取值可以影响分类的准确率

K=1时准确率就已经高达98.63%;K=2时准确率保持不变,仍是98.63%;在K=3的时候准确率最高,上升到了98.84%;在K=4时又开始降低到98.52%;K=5时准确率仍然在降低,为98.20%

之后增加K的值,如K=6,K=7,可以看到准确率继续降低

结论是,为了保证较高的准确率,应该把K的值设得小一些。

实验结果截图

K=1

K=2

结果同K=1

K=3

K=4

K=5


资源下载地址:https://download.csdn.net/download/sheziqiong/86791480
资源下载地址:https://download.csdn.net/download/sheziqiong/86791480

基于Python的KNN实验手写数字识别相关推荐

  1. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  2. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现

    基于随机梯度下降法的手写数字识别.epoch是什么.python实现 一.普通的随机梯度下降法的手写数字识别 1.1 学习流程 1.2 二层神经网络类 1.3 使用MNIST数据集进行学习 注:关于什 ...

  3. 基于朴素贝叶斯的手写数字识别

    基于朴素贝叶斯的手写数字识别 关于数据集 关于SIMD 关于python 数据预处理 总结 关于数据集 MNIST数据库(http://www.cs.nyu.edu/~roweis/data.html ...

  4. 基于matlab BP神经网络的手写数字识别

    摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入.灰度化以及二值化等处理,通过神 ...

  5. 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践

    参看之前篇章的用全连接神经网络去做手写识别:https://blog.csdn.net/m0_37957160/article/details/114105389?spm=1001.2014.3001 ...

  6. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

  7. 图像识别:利用KNN实现手写数字识别(mnist数据集)

    图像识别:利用KNN实现手写数字识别(mnist数据集) 步骤: 1.数据的加载(trainSize和testSize不要设置的太大) 2.k值的设定(不宜过大) 3.KNN的核心:距离的计算 4.k ...

  8. KNN实现手写数字识别(Python-OpenCV)

    手写数字识别 Python-OpenCV   KNN实现手写数字识别 目标:编写一个使用OPenCV的KNN模块实现手写数字识别的程序. 训练数据和测试数据为OpenCV自带的一副包含5000个手写数 ...

  9. KNN实现手写数字识别Python

    本文章总结了KNN算法字手写数字识别的应用,比较系统的对传统KNN和各种改进的KNN算法进行实现,由于完整的代码量较大(部分代码参考了机器学习实战),不适合全部贴出,但是博主乐于分享,有需要的话可以直 ...

最新文章

  1. c语言宏嵌套和展开规则
  2. WINDOWS系统调用 和 SYSENTER系统服务调用过程
  3. 详解DNS的常用记录(上):DNS系列之二
  4. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )
  5. 【笔试题】C语言结构体中,不同的数据类型在32位和64位下所占字节的区别
  6. 15个最好的HTML5前端响应式框架(2014)
  7. 谷歌插件开发ajax请求,chrome插件 注入js以及发送ajax(message/request)
  8. day9 java的静态代码块和代码执行顺序
  9. DOM Element对象 参考手册
  10. 正则修饰符、用敏感词库替换
  11. [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
  12. 如何使用pr制作视频人物运动残影特效
  13. gensim训练wiki中文词向量
  14. Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能
  15. 操作系统实验五 基于内核栈切换的进程切换(哈工大李治军)
  16. matlab文字转数据,将文本转换为数值 - MATLAB Simulink - MathWorks 中国
  17. 反向链接的类型(转)
  18. mysql 修改字段类型为字符串_MySQL中字段类型与合理的选择字段类型
  19. 关于使用C++万能头文件时定义y1报编译错误的那点事
  20. 思科路由器特权密码的设置

热门文章

  1. Java Lambda Consumer<T> BiConsumer DoubleConsumer IntConsumer LongConsumer ObjDoubleConsumer ObjLong
  2. iOS协同开发-iOS代码版本控制-GitHub代码托-关东升-专题视频课程
  3. java ssm汽车销售管理系统
  4. 图形推理1000题pdf_图形推理的复习流程
  5. 停车场停车系统软件测试报告,智慧停车场系统各大功能系统的详解
  6. vue 打开浮在窗口上的小窗口
  7. mysql账单结算设计_支付系统的对账处理与设计--转
  8. 未备案访问服务器网站,未备案域名怎样访问国内服务器
  9. iBackup Viewer for mac(iPhone备份提取工具)
  10. STemwin图形库移植与运用(基于STM32)(完成QQ界面设计、局域网聊天)