机器学习——手写数据集的介绍以及案例讲解

news2024/11/18 7:35:48

系列文章目录

机器学习聚类——DBSCAN(Density-based spatial clustering of applications with noise,基于密度的聚类算法)

机器学习集成学习——Adaboost分离器算法

机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法

机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】

机器学习集成学习——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

机器学习——聚类算法的评分函数_davies_bouldin_score

文章目录

一、MNIST数据集介绍

1.1、解析MNIST数据集中的图片数据

1.2、数据集文件的头

1.3、几种数据文件的说明

1.4、MNIST数据集中的对应关系

二、手写数据集的代码演示

代码部分

总结


前言

本文主要是对手写数据集的介绍以及相关的应用机器学习方面举例。

一、MNIST数据集介绍

MNIST数据集是一个常用的手写数字识别数据集,包含了60000张训练图片和10000张测试图片。每张图片大小为28x28像素,灰度级别为0~255。

MNIST数据集中的图片数据以ubyte格式存储,ubyte是一种无符号字节类型,取值范围在0~255之间。MNIST数据集的图像数据文件为"train-images-idx3-ubyte.gz"和"t10k-images-idx3-ubyte.gz",其中前者存储了训练数据,后者存储了测试数据。这两个文件都可以从MNIST官方网站上下载。

1.1、解析MNIST数据集中的图片数据

解析MNIST数据集中的图片数据可以通过以下步骤完成:

  1. 读取文件头信息:MNIST数据集中的图片数据文件头部包含四个字节的magic number和四个字节的数据集大小信息。magic number用于确定文件类型,数据集大小信息包括数据集中的图片数量和每张图片的大小信息。
  2. 读取图片数据:MNIST数据集中的每个数据都由一个标签(label)和一个图片(image)组成。标签用于表示图片中的数字,图片用28x28的像素矩阵表示。
  3. 将读取的图片数据转换为图像矩阵:MNIST数据集中的每张图片都是由28x28个像素组成的,每个像素的灰度值都在0~255之间。读取图片数据后,需要将它们转换成28x28的矩阵表示。
  • MNIST数据集中的标签数据以ubyte格式存储,标签文件为"train-labels-idx1-ubyte.gz"和"t10k-labels-idx1-ubyte.gz",其中前者存储了训练数据的标签,后者存储了测试数据的标签。每个标签都是一个整数,用于表示相应图片中的数字。
  • MNIST数据集中的标签数据与图片数据一一对应,可以通过标签文件中的位置信息来确定每个图片的标签。
  • MNIST数据集中的图片和标签数据都是按照大端字节序存储的。因此,在读取ubyte格式的数据时,需要注意字节序的问题,避免出现错误。

1.2、数据集文件的头

前四个字节的magic number用于确定文件类型;

后四个字节表示数据集的大小信息,其中前两个字节表示数据集中的图片数量,后两个字节表示每张图片的大小信息。具体来说,对于图像数据文件,后四个字节的前两个字节表示图片数量,后两个字节表示每张图片的大小,也就是28x28=784个字节;对于标签数据文件,后四个字节的前两个字节表示标签数量,后两个字节固定为0。

1.3、几种数据文件的说明

  • t10k-images-idx3-ubyte(第一行):数量为10000的测试图片集,每张图片28*28像素,单通道灰度图;
  • t10k-labels-idx1-ubyte(第二行):数量为10000的测试图像标签集,对应每张测试图像;
  • train-images-idx3-ubyte(第三行):数量为60000的训练图片集,每张图片28*28像素,单通道灰度图;
  • train-labels-idx1-ubyte(第四行):数量为60000的训练图像标签集,对应每张训练图像;
     

1.4、MNIST数据集中的对应关系

由于MNIST数据集将 图片集 和 注释标签 分成了两部分文件分别独立存储,所以弄清楚如何将这两个文件中的信息关联起来至关重要。

总结来说: MNIST数据集中训练集和测试集与其相应的标签集均是一对一的对应关系,即 匹配的文件中对应项目数据组成一组。

比如说: 训练图片集中的第一张图片和训练标签集中的第一个标签就是对应项目,测试图片集中的第五张图片和测试标签集中的第五个标签也为对应项目。

上述 四个文件 共会组成 两套 绑定数据:

  • 一套由 训练图片集+训练集标签 (这两个文件即为匹配文件)组成
  • 一套由 测试图片集+测试集标签 (这两个文件也为匹配文件)组成

二、手写数据集的代码演示

代码部分

# MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST).
# 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生,
# 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
# 在 MNIST 数据集中的每张图片由 28 x 28 个像素点构成, 每个像素点用一个灰度值表示.
import os
import struct
import numpy as np
#定义加载手写数据集子函数,输入为数据集存储的本地路径和数据集类型(默认为训练集)
def load_mnist(path, kind='train'):
    #生成文件的完整路径
    labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind)     #标签文件路径和文件名
    images_path = os.path.join(path,'%s-image-idx3-ubyte'% kind)      #手写数字图形路径和文件名
    #打开标签文件并获取标签数据
    with open(labels_path, 'rb') as lbpath:
        #'>'表示大端字节序;'I’代表无符号整数;
        magic, n = struct.unpack('>II',lbpath.read(8))
        labels = np.fromfile(lbpath,dtype=np.uint8)
    #打开图形文件并获取图形数据
    with open(images_path, 'rb') as imgpath:
        #'>'表示大端字节序;'I’代表无符号整数;
        magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))
        #读取数据(为28*28的向量),并把数据展开成1维行向量
        images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)
        #把MNIST中的像素值归一化为-1和+1之间的数值
        images = ((images/255.) - .5)*2
    return images, labels
#加载训练集图形数据和标签,训练集数据文件存储路径与代码在同一文件夹下时路径可以为空
#path = 'C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\sklearn\\datasets\\data\\'
path = 'E:\\大三实践课实训集合\\机器学习\\上课练习代码\\'
# path = ' '
#加载原测试集图形数据和标签作为本次实验的训练集数据和标签
from sklearn.model_selection import train_test_split
data = load_mnist(path,kind = 't10k')
X_train,X_test,y_train,y_test = train_test_split(data[0],data[1],test_size = 0.25,random_state = 0)
print('测试集列数:%d,测试集行数:%d'%(X_train.shape[0],X_train.shape[1]))
print('测试集列数:%d,测试集行数:%d'%(X_test.shape[0],X_test.shape[1]))
# path:MNIST数据集所在的路径。
# kind:数据集类型,这里是‘t10k’代表测试集。
# data[0]:代表MNIST数据集中的图像数据。
# data[1]:代表MNIST数据集中的标签数据。
# test_size:代表测试集所占的比例,这里是25%。
# random_state:代表随机数种子,确保每次运行得到的结果相同。
# 最后,代码输出了训练集和测试集的行数和列数。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
fig,ax = plt.subplots(nrows = 2,ncols = 5,sharex = True,sharey  = True,figsize = (3,1.5))
ax = ax.flatten()
for i in range(10):
    img =  X_train[y_train ==i][0].reshape(28,28)
    ax[i].imshow(img,cmap = 'Greys',interpolation = 'nearest')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
fig,ax = plt.subplots(nrows = 5,ncols = 5,sharex = True,sharey  =True,figsize = (2,2))
ax = ax.flatten()
for i in range(25):
    img = X_train[y_train ==3][i].reshape(28,28)
    ax[i].imshow(img,cmap = 'Greys',interpolation = 'nearest')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

from sklearn.neural_network import MLPClassifier
mlpc = MLPClassifier(hidden_layer_sizes = (100,),solver = 'sgd',max_iter = 200,learning_rate_init = 0.01,activation = 'tanh')
mlpc.fit(X_train,y_train)
print("最好的损失值:",mlpc.best_loss_)
plt.figure()
plt.xlim([0,len(mlpc.loss_curve_)-1])
plt.plot(mlpc.loss_curve_)
plt.title('训练过程的损失函数值')
plt.xlabel('轮次')
plt.grid(color = 'gray',linewidth = '0.5',linestyle = '--')
plt.show()

# 使用Scikit-learn库中的MLPClassifier类来构建一个多层感知器模型,并使用该模型对MNIST数据集进行训练和测试。其中,MLPClassifier类是一个基于反向传播算法的神经网络模型,可以用于分类和回归问题。代码中的参数解释如下:
# hidden_layer_sizes:代表隐藏层的神经元个数,这里只有一个隐藏层,其中包含100个神经元。
# solver:代表优化算法,这里是随机梯度下降算法(sgd)。
# max_iter:代表训练的最大轮次,这里是200轮。
# learning_rate_init:代表学习率的初始值,这里是0.01。
# activation:代表激活函数,这里是tanh函数。
# 在模型训练完成后,代码输出了模型的最好损失值,并使用Matplotlib库绘制了训练过程中的损失函数值。这可以帮助我们了解模型在训练过程中的性能表现,以及是否存在过拟合或欠拟合等问题。

print("训练数据集准确率:%.2f%%"%(100*mlpc.score(X_train,y_train)))
y_pred = mlpc.predict(X_test)
print("测试数据集准确率:%.2f%%"%(100*mlpc.score(X_train,y_train)))

#输出25个识别错误的图形
miscl_img = X_test[:25]
correct_lab = y_test[:25]
miscl_lab = y_pred[:25]

count = 0
for i in range(np.size(y_pred)):
    if(count==25):
        break
    elif(y_test[i]!=y_pred[i]):
        miscl_img[count] = X_test[i]
        correct_lab[count] = y_test[i]
        miscl_lab[count] = y_pred[i]
        count += 1
    else:
        continue
    
fig,ax = plt.subplots(nrows=5,ncols=5,sharex=True,sharey=True)
ax = ax.flatten()
for i in range(25):
    img = miscl_img[i].reshape(28,28)
    ax[i].imshow(img,cmap='Greys',interpolation='nearest')
    ax[i].set_title('实际:%d 预测:%d'%(correct_lab[i],miscl_lab[i]))
    
ax[0].set_xticks([])    
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

# 对训练后的多层感知器模型进行评估和可视化。
# 首先,使用mlpc.score()方法计算训练集和测试集的准确率,并使用字符串格式化输出结果。
# 然后,使用mlpc.predict()方法对测试集进行预测,将预测结果保存在y_pred中。再次使用mlpc.score()方法计算训练集和测试集的准确率,并使用字符串格式化输出结果。
# 接下来,从测试集中挑选出25个预测错误的样本,并将其的图像、正确标签和错误标签保存在miscl_img、correct_lab和miscl_lab中。这里使用了一个循环来遍历整个测试集,当找到一个预测错误的样本时,将其保存在相应的数组中,并更新计数器count。当count达到25时,退出循环。
# 最后,使用Matplotlib库中的subplot()和imshow()方法将这25个样本的图像以5行5列的方式绘制在一个图像中,并在每个子图像标题中显示其正确标签和错误标签。

代码运行结果

测试集列数:7500,测试集行数:784
测试集列数:2500,测试集行数:784

最好的损失值: 0.007473377636954111

训练数据集准确率:100.00%
测试数据集准确率:100.00%

上述代码里面的数据集手写数据集的10000个测试集数据

总结

以上就是今天的内容~

最后欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“交通·未来”第27期:基于随机效应机器学习的多区域居民出行模式选择分析...

2020年6月份,公众号正式推出了“交通未来”系列线上公益学术活动等你来~, 2023年,新起航新征程,我们继续前行~ 6月24日下午15:30,我们将迎来活动的第27期。 1、讲座主题 基于随机效应机器学习的多区域居民出行模式选择…

工作三--知识点

1、split 切割字符串 2、includes 而不是写成 if(useContext pm_global_teamrole_project_manager || pm_global_teamrole_task_manager || pm_global_teamrole_task_parent_manager) 因为 的 优先级 高于 ||,这样写 只能 前面的&…

大数据学习(3)

大数据学习(3) 1 Hive-SQL-DML语句1.1 Hive SQL Load 加载数据语句1.1.1 Load功能1.1.2 Load语法规则1.1.3 Load 语法实验1.1.3.1 Load Data From Local FS1.1.3.2 Load Data From HDFS1.1.3.3 Overwrite选项 1.2 Hive SQL Insert 插入数据语句1.3 Hive …

河道垃圾自动识别监测算法 opencv

河道垃圾自动识别监测系统通过pythonopencv网络模型技术,河道垃圾自动识别监测算法对水面上的垃圾进行自动识别,一旦发现垃圾污染将自动发出警报。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python…

Win10文件夹选项在哪里打开?Win10文件夹选项打开方法

Win10文件夹选项在哪里打开?Win10电脑中用户不知道在哪里才能打开文件夹选项,这时候用户随意打开Win10电脑上的一个文件夹,然后点击右上角的选项,打开之后就能打开文件夹选项了,也可以打开电脑的运行窗口,在…

自动化漏洞猎人代码分析

0x00 前言 安全人员可以扫描,网络上悬赏网站等的漏洞,如果能够发现其存在着安全漏洞,则可以通过提交漏洞的方式来获得一定的赏金,国外的这类悬赏的网站比较多,比如hackone,这上面列出了大量的资产信息&…

你不得不知道的箭头函数和普通函数使用区别!

前言 箭头函数是 ES6 新增的一种函数类型,它采用箭头 > 定义函数,也称为 lambda 函数。箭头函数语法更为简洁,用起来很是方便顺手。 但它存在一些需要注意的问题和局限性。在实际使用时,我们需要根据具体情况来选择合适的函数…

【夜深人静学数据结构与算法 | 第九篇】栈与队列

目录 ​前言: 栈: 栈的实际应用: 队列: 队列的实际应用: 总结: 前言: 栈与队列是我们学习的两个经典的数据结构,这两个数据结构应用广泛,在计算机内有很多底层应用…

操作系统2——进程的描述与控制

本系列博客重点在深圳大学操作系统课程的核心内容梳理,参考书目《计算机操作系统》(有问题欢迎在评论区讨论指出,或直接私信联系我)。 梗概 本篇博客主要介绍操作系统第二章进程的描述与控制的相关知识。 目录 一、前驱图与程序…

大数据从0到1的完美落地之Flume案例1

案例演示 案例演示:AvroMemoryLogger Avro Source:监听一个指定的Avro端口,通过Avro端口可以获取到Avro client发送过来的文件,即只要应用程序通过Avro端口发送文件,source组件就可以获取到该文件中的内容,输出位置为…

数据库详细讲解--下

数据库详细讲解–下 mysql 表外连接 外连接 1.左外连接(如果左侧的表完全显示我们就说是左外连接) 2.右外连接(如果右侧的表完全显示我们就说是右外连接) 3.使用左连接(显示所有人的成绩,如果没有成绩…

4自由度并联机器狗实现行走功能

1. 功能说明 本文示例将实现R328a样机4自由度并联机器狗行走的功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 …

【Linux】进程优先级 进程切换 环境变量

目录 一、进程优先级 1、优先级概念 2、优先级特点 3、修改Linux下的优先级 二、进程切换 1、进程特性 2、进程切换 三、环境变量 1、基本概念 2、常见环境变量 3、查看环境变量方法 4、PATH环境变量 5、和环境变量相关的命令 6、环境变量的组织方式 7、通过代码如何获取环境…

io.netty学习(十一)Reactor 模型

目录 前言 传统服务的设计模型 NIO 分发模型 Reactor 模型 1、Reactor 处理请求的流程 2、Reactor 三种角色 单Reactor 单线程模型 1、消息处理流程 2、缺点 单Reactor 多线程模型 1、消息处理流程 2、缺点 主从Reactor 多线程模型 主从Reactor 多线程模型示例 1…

索尼笔记本U盘重装Win10系统教程图解

很多使用索尼笔记本的用户想要给笔记本重装一下Win10系统,但不清楚具体要怎么操作,首先用户需要确保自己的索尼笔记本电脑能够正常联网,还需要准备一个8G以上的U盘,接着按照小编分享的索尼笔记本U盘重装Win10系统教程图解操作&…

怎么高效的通过爬虫获取数据

导语:在当今数字化时代中,获取数据已成为许多企业和个人的重要需求。在快速获取数据时,通过爬虫技术迅速获取网络数据已成为一项重要的技能和技术。然而,在应用爬虫技术前,需要注意一些重要的问题。本文总结了从数据来…

九大数据结构

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结…

IDEA上面书写wordcount的Scala文件具体操作

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala 目录 系列文章目录 1、编写Scala程序 2、更换pom.xml文件 3、更新Maven的依赖文件 4、执行代码即可 总结 前言 本文主要在上述文章的基础上编辑和创建一个WordCount应…

Linux常用命令——ftp命令

在线Linux命令查询工具 ftp 用来设置文件系统相关功能 补充说明 ftp命令用来设置文件系统相关功能。ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令…

【23-06-25:window基础命令学习】

目录 命令提示符cd /? 查看cd 语法 切换文件目录cd /d d:\ 改变当前的驱动器到D盘, 根目录切换到D盘,因为改变了驱动器,所以需要加上 /dDIRmd 命令 创建目录(文件夹) ,也可以直接创建多级子目录![在这里插…