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

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华电第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值