0结课作业内容
(1)程序编写及报告。
请大家下载70000个样本的MNIST数据集(“手写体数字70000.zip”,28*28像素),60000个用于训练,10000个用于测试!!!

(2)使用的程序可以包括:
1)以各类平均值为类中心的最小距离法;
2)KNN法,K取1,3,5,…;
3)BP神经网络;
4)支持向量机;
5)其他方法:深度学习 CNN等。
要多做几种程序,多选几种特征,进行算法对比,完成结课报告写作,5000字以上(字数统计不含程序代码)。

课设源代码、调库程序和一些文件放在资料区下载。
文件内容形式:(有70000的minist数据集,也有0002手写数字数据集)

笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人、冬奥云支教等奖项。

程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!

个人补充:实验之前先在LSGO 组队学习的公众号对minist数据集有了三期的初步认识,但是对数据具体的格式还有点迷糊,于是我在csdn又具体查了minist数据集的格式和存储情况,在充分了解之后才开始了我的实验:


1 K-均值聚类法
1.1算法说明
为何第一个算法选择K-means这个方法?因为刚好在做这个模式识别之前,我们机器学习也有一个需要运用到minist数据集的一个课设,想到老师需要我们利用多种方法实现对minist数据集的编程,于是我把这个方法认真研究,一个是自写程序,二是调库函数的程序并进行两者的对比。
经典 K-means 算法的基本工作流程:首先随机选取 K 个数据作为的聚类的聚类中心,计算各个数据对象到所选出来的各个中心的距离,将数据对象指派到最近的类中;然后计算每个类的均值,循环往复执行,直到满足聚类的收敛条件为止。具体的执行步骤如表1所示:

表1 K-means算法流程

主程序如下所示:(python语言)

1.2数据提取子程序
数据提取子程序的主要思路是,先利用open()函数打开官方网站(从 http://yann.lecun.com/exdb/mnist/)中下载的四个二进制文件;再利用train1.seek把指针指到需要读取的位置,最后将数据转int形式,存入32×32的矩阵中并转置;完成数据的提取。
具体程序如下:

1.3特征生成

其中 µ1,µ2,. . . ,µK 是 K 个聚类中心,rik 对应着第 i 个训练样本 xi 归于哪一类,应当满足

在设定 µk 的初始值之后,按照 K 均值聚类算法,交替更新 rik 和 µk,迭代若干次直至
收敛。
下面绘制出目标函数 J 在迭代过程中的变化曲线,给出聚类完成后每一类的若干张代表性 图片。
改变聚类中心的初始值,改变聚类数目 K,重新训练,并按照上述方式给出训练过程和聚类结果。
不能使用现成的库函数,要把自己实现的代码的运行时间与现成库函数的运行时间做对比,并指出可能的改进之处。
1.4 K-均值聚类子程序
初始化u ,使用数据中每个数字的一个作为每类ui的初始中心,利用r空列表每行存储一个数字的独热编码。

求r的分类函数,按照上面定义的公式走

更新聚类中心u,利用平均值来求

利用测试集的标签和原标签做对比,求我们K均值聚类后的正确率,就是识别的成功率

我们甚至还可以根据选取的第几行判断这个数字长什么样并输出图像,并和原来的标签做对比,这里选第66666行的数据,则输出图像为:
!](https://img-blog.csdnimg.cn/ebe2af39a47549569bfe4d4c7bae2b97.png)

从结果来看这个数字是7,同时和原标签对比,我们的训练模型聚类得到的结果是正确的。
最后就是我们输出聚类后每一类的一张代表性图片:

1.5程序各板块运行结果
在我们设置参数分为10类,迭代15次得出的结果:

目标函数 J 在迭代过程中的变化曲线 :迭代15次可以看到一个下降的过程。

聚类完成后,每一类选一张代表性的图片输出:

取出的十个代表性图片,我们还可以看到它原来的标签并做对比,还有分类的正确率和程序的运行时间也得出如下:

随机选取聚类中心的初始值,并把聚类数目改为9,我们得到以下结果:
取10086行数据可以打印出图片:

得到的九类每一类的代表性图片如下:

聚类的结果和运行时间为,可见分为九类所用时间更多了:

1.6调用sklearn库的程序运行结果及对比分析
我们再调用sklearn库的k-means算法和手写的k-means算法做对比,包括时间上和性能上的对比:

这里调用的库函数为了可视化效果更可观,运用了PCA降维,主成分分析(PCA)是最常用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。PCA可以把具有相关性的高维变量合成为线性无关的低维变量,称为主成分,主成分能够尽可能保留原始数据的信息。原理就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,依次类推。

该调库方法得到的结果如下:先是每一类训练样本得到的十个代表性图片,左下角是原来的样本标签,其次是降维再分类后得到十种颜色不同的分类区域,还有混淆矩阵,可以查看模型哪块做的不够好:

下面是测试集选取进行聚类分析的测试结果,可以看到左下角标红的就是识别不正确的图片。

得到的识别正确率为:
,明显比我的百分之五十多高得多。
且运行时间也更低:

把自己手写的程序和调库的K-means多次测试得到表格如下:

对比结果分析:我们可以看出,调库无论是程序运行时间还是正确率,都比我们直接实现的模型更加的优化、快速,且进行PCA降维后,可视化效果会更加直观,从时间上的600多秒、800多秒到调库的0.33秒可以看出,sklearn库的功能是多么强大,查阅相关资料和咨询同学得知,这是因为调库是启用了多线程、多核进行运算,能够充分调动计算机的性能,而不是像我们写的单核程序一样运行缓慢,所以这也是调用现成库给我们程序员带来的巨大便利。同时,无监督学习和有监督学习的不一样地方我们也可以感受到,就是训练集和测试集的选取,在无监督学习,是70000个数据集即可当训练集,也可以当测试集,这就给我们对有无监督的学习了解的更加透彻。

2 K-近邻法(KNN)
K-近邻分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一,该方法的思路是:如果一个样本在特征空间中的 k 个最相似即特征空间中最邻近的样本中的大多数属于某一个类别,则该样本也属于这个类别。所以,K-近邻法的关键是寻找距离最近的k个训练样本中,出现频率最高的样本类别,算法通俗易懂的介绍如下:

如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方 形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。
如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方 形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。
那么给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中,这样就可以实现数分类功能了。下面我就将在飞浆 AI studio中用minst数据集进行验证。
2.1数据预处理程序
数据预处理具体程序如下:先导入包

查看数据集的信息:

因为平展灰度图的像素转成一维向量是784个像素,说明原图像时28×28px,需要可视化可以回转。

2.2主程序
先进行交叉验证:使用K折和留一法,K后面取1,3,5,…

数据准备,x存放图片信息,y存放类别信息,取第一列以行的形式返回,取第一列后的每一列。

#合并原来划分好的数据集 便于之后交叉验证使用

先来看看单纯用训练集训训练后能在测试集上获得怎样的表现

在训练集上使用交叉验证的方法对训练集进项模型的训练。同时,在这里使用PCA的方法对一定比例的像素进行降维,并查看降维的效果选择效果最佳的作为最终的降维比例。

在不进行PCA降维情况下查找K取什么值时候效果最佳,并画出折线图:

绘制出的折线图如下:

加上PCA降维的:

结果如下,横坐标是PCA的百分比

2.3补充的运行结果及分析
这是有PCA降维的:(当表格看)


没有PCA降维的如下:

结果分析:K在没有pca降维时,由折线图可知取k=21时候效果是最好的,且准确率和得分也是随着百分比不断增加。在PCA降维的条件下,PCA在大约60%的位置开始逐渐平稳,现在使用PCA70%的降维,留一法交叉验证。

3 神经网络
人工神经网络的工作过程可分为训练和测试两个阶段。在训练阶段,以一组输入输出模式对作为训练样本集来训练网络。网络训练的过程即是网络参数(包括权值、阈值等等)的调整过程。在测试运行阶段,给定新的输入,网络即能计算得到相应的输出。

3.1导入需要的库、包
导入需要的包 nump: python第三方库,用于进行科学计算 PIL : Python Image Library,python,python第三方图像处理库 matplotlib:python的绘图库 pyplot:matplotlib的绘图框架
os:提供了丰富的方法来处理文件和目录

3.2准备数据
MINIST数据集包含60000个训练集和10000测试数据集。分为图片和标签,图片是28*28的像素矩阵,标签为0~9共10个数字。 2.定义读取MNIST数据集的train_reader和test_reader,指定一个Batch的大小为128,也就是一次训练或验证128张图像。 3.paddle.dataset.mnist.train()或test()接口已经为我们对图片进行了灰度处理、归一化、居中处理等处理。

观察数据集的方法

3.3配置网络
该模型使用的搭建的双层全连接神经网络结构,结构简单、体积较小、方便训练和部署,这种简单的数据集采用该神经网络结构已经足以满足需求。

以下的代码判断就是定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层–>>隐层–>>隐层–>>输出层。

定义输入层,输入的是图像数据。图像是2828的灰度图,所以输入的形状是[1, 28, 28],如果图像是3232的彩色图,那么输入的形状是[3. 32, 32],因为灰度图只有一个通道,而彩色图有RGB三个通道。

在这里调用定义好的网络来获取分类器

接着是定义损失函数,这次使用的是交叉熵损失函数,该函数在分类任务上比较常用。定义了一个损失函数之后,还有对它求平均值,因为定义的是一个Batch的损失值。同时我们还可以定义一个准确率函数,这个可以在我们训练的时候输出分类的准确率。

接着是定义优化方法,这次我们使用的是Adam优化方法,同时指定学习率为0.001。

3.4模型训练和模型评估
定义一个解析器和初始化参数

输入的数据维度是图像数据和图像对应的标签,每个类别的图像都要对应一个标签,这个标签是从0递增的整型数值。

最后就可以开始训练了,我们这次训练5个Pass。在上面我们已经定义了一个求准确率的函数,所以我们在训练的时候让它输出当前的准确率,计算准确率的原理很简单,就是把训练是预测的结果和真实的值比较,求出准确率。每一个Pass训练结束之后,再进行一次测试,使用测试集进行测试,并求出当前的Cost和准确率的平均值。

3.5训练结果和模型预测
上述模型训练的结果为:

在模型预测之前,要对图像进行预处理,处理方式要跟训练的时候一样。首先进行灰度化,然后压缩图像大小为2828,接着将图像转换成一维向量,最后再对一维向量进行归一化处理。
#将RGB转化为灰度图像,L代表灰度图像,灰度图像的像素值在0~255之间
#resize image with high-quality 图像大小为28
28
#返回新形状的数组,把它变成一个 numpy 数组以匹配数据馈送格式。

使用Matplotlib工具显示这张图像如下:

最后把图像转换成一维向量并进行预测,数据从feed中的image传入。fetch_list的值是网络模型的最后一层分类器,所以输出的结果是10个标签的概率值,这些概率值的总和为1。

得到结果:

拿到每个标签的概率值之后,我们要获取概率最大的标签,并打印出来。

最终得到的预测结果为:该图片的预测结果的label为: 3

4三个实验的结果及分析(部分结果分析上面已给出)
通过对三种分类方法的结果对比可得出以下结论:
1)Knn的K值在取到21时候,分类效果最好,PCA降维取到60%左右开始趋于稳定。
2)三种分类方法中,神经网络的分类效果最好.正确率可以达到百分之九十多,其次到knn和调库的K-means,最后才是自写的正确率只能达到百分之五十多的k-means;

智科模式识别期末大课设:多种方法对数据集进行手写数字识别(数据集:MINIST)相关推荐

  1. 深度学习数字仪表盘识别_深度学习之手写数字识别项目(Sequential方法amp;Class方法进阶版)...

    此项目使用LeNet模型针对手写数字进行分类.项目中我们分别采用了顺序式API和子类方法两种方式构建了LeNet模型训练mnist数据集,并编写了给图识物应用程序用于手写数字识别. 一.LeNet模型 ...

  2. 基于tensorflow2.0利用CNN与线性回归两种方法实现手写数字识别

    CNN实现手写数字识别 导入模块和数据集 import os import tensorflow as tf from tensorflow import keras from tensorflow. ...

  3. 监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

    没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错).结果一个K-邻近实现手写数字识别的代码就让我改了三四天.虽然网上这方面的代码是很多,但是我运行了好几个, ...

  4. 模式识别 实验四 手写数字识别的神经网络算法设计与实现

    实验四 手写数字识别的神经网络算法设计与实现 一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机 matlab软件 三.实验内 ...

  5. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  6. 【ML实验5】SVM(手写数字识别、核方法)

    实验代码获取 github repo 山东大学机器学习课程资源索引 实验目的 实验内容 这里并不是通过 KTT 条件转化,而是对偶问题和原问题为强对偶关系,可以通过 KTT 条件进行化简. 令 x = ...

  7. 手写数字识别实现课设cnsd博客_使用Tesseract轻松实现OCR字体识别

    本教程翻译自PyImageSearch英文原文 实现效果 今天的博客文章是安装和是用Tesseract library 进行OCR识别的两章系列中的第一部分. OCR可以自动对手写或者印刷字体进行类型 ...

  8. 【Python学习】 - 手写数字识别 - python读入mnist数据集的多种方法

    写在前面: 其实网上有很多读入mnist数据的代码,但是都是比较麻烦冗长的函数,本篇文章介绍几种不算很麻烦的,借用库函数读入数据的方法. 方法1: 方法2: 方法3:

  9. 基于人工智能方法的手写数字图像识别_【工程分析】基于ResNet的手写数字识别...

    ねぇ 呐 私に気付いてよ 快点注意到我吧 もう そんな事 那种事 一定 望んでも 再去奢求 しょうがないだろ 也无可奈何吧 --真野あゆみ<Bipolar emotion>(作詞:Mits ...

最新文章

  1. SQL Server实用操作小技巧集合
  2. java通过ip获取网卡MAC地址
  3. 复习笔记13 字符流与字节流
  4. Text-CNN-文本分类-keras
  5. < Android数据存储> 任务二 应用程序数据文件夹里的文件读写
  6. python制作微信个人二维码_Python实现 | 微信带参数的二维码
  7. 对JDBC操作数据库的简单封装
  8. vimrc.local 备份
  9. linux shell for 循环变量,shell for循环、循环变量值付给其他shell脚本的方法
  10. python语言基础实验一_实验1 Python语言基础
  11. 丛铭俣 160809324 (作业5)
  12. 淘宝TOP获取sessionkey
  13. java变量表述_下列关于Java变量的描述,错误的是:_学小易找答案
  14. C/C++线程与多线程工作笔记002---C++中的LPVOID类型
  15. 大自然Windows XP日文版镜像
  16. 计算机cpu intel,intel CPU后面带F是什么意思?Intel处理器后面带“F”含义详解
  17. RobotStudio实现喷漆、打磨等功能(曲面路径生成与仿真)
  18. php封装成应用系统吗,用Portal来集成外部应用程序_php
  19. 凸包问题的GRAHAM-SCAN解法(附C++代码)
  20. 考勤系统(员工打卡)

热门文章

  1. 软件测试的自我发展规划
  2. 【JAVA学习】1、零基础入门Java 基础语法:概念、规则、格式
  3. Java程序入门教程 | Java
  4. NetworkX学习及使用
  5. 错题本——数据结构(线性表)
  6. java 计算两个日期相差月数_Java简单计算两个日期月数差的方法
  7. elasticsearch的使用
  8. 淘宝seo关键词优化推广技巧
  9. Nervos CKB初体验
  10. MCE公司:新突破——癌症治疗耐药性问题有望彻底解决