10.机器学习sklearn-------手写数字识别实例

2023-11-07

1.概念介绍:

图像识别(Image Recognition)是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。 

图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。机器学习领域一般将此类识别问题转化为分类问题。

手写识别是常见的图像识别任务。计算机通过手写体图片来识别出图片中的字,与印刷字体不同的是,不同人的手写体风格迥异,大小不一, 造成了计算机对手写识别任务的一些困难。 

数字手写体识别由于其有限的类别(0~9共10个数字)成为了相对简单 的手写识别任务。DBRHD和MNIST是常用的两个数字手写识别数据集

2.数据介绍:

MNIST的下载链接:http://yann.lecun.com/exdb/mnist/。

MNIST是一个包含数字0~9的手写体图片数据集,图片已归一化为以手写数 字为中心的28*28规格的图片。

MNIST由训练集与测试集两个部分组成,各部分 规模如下: 

                                         训练集:60,000个手写体图片及对应标签 

                                         测试集:10,000个手写体图片及对应标签


DBRHD(Pen-Based Recognition of Handwritten Digits Data Set)是UCI的机器学习中心提供的数字手写体数据库: https://archive.ics.uci.edu/ml/datasets/PenBased+Recognition+of+Handwritten+Digits。 

DBRHD数据集包含大量的数字0~9的手写体图片,这些图片来源于44位不同的人的手写数字,图片已归一化为以手写数字为中心的32*32规格的图片。

DBRHD的训练集与测试 集组成如下:

                                                  训练集:7,494个手写体图片及对应标签,来源于40位手写者 

                                                  测试集:3,498个手写体图片及对应标签,来源于14位手写者



3.任务过程:


①输入


②输出


③MPL的结构


④步骤


import numpy as np
#使用listdir模块,用于访问本地文件
from os import listdir
from sklearn.neural_network import MLPClassifier

#定义img2vector函数,将加载的32*32 的图片矩阵展开成一列向量
def img2vector(fileName):
    retMat =np.zeros([1024],int)
    fr = open(fileName) #打开包含32*32大小的数字文件
    lines =fr.readlines() #读取文件的所有行
    for i  in range(32):
        for j in range(32):  #01数字存放在retMat
            retMat[i*32+j]=lines[i][j];
    return retMat
#并将样本标签转化为one-hot向量
def readDataSet(path):
    fileList =listdir(path) #获取文件夹下所有文件
    numFiles =len(fileList) #统计需要读取的文件的数目
    dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件
    hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot
    for i in range(numFiles):
        filePath =fileList[i] #获取文件名称/路径
        digit =int(filePath.split('_')[0])
        hwLabels[i][digit]=1.0
        dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容
    return  dataSet,hwLabels
train_dataSet,train_hwLabels =readDataSet('trainingDigits')

#构建神经网络:设置网络的隐藏层数、各隐藏层神经元个数、
# 激活函数、学习率、优化方法、最大迭代次数。
#hidden_layer_sizes 存放的是一个元组,表示第i层隐藏层里神经元的个数
# 使用logistic激活函数和adam优化方法,并令初始学习率为0.0001
clf =MLPClassifier(hidden_layer_sizes=(50,),activation='logistic',
                   solver='adam',learning_rate_init=0.0001,max_iter=2000)
#fit函数能够根据训练集及对应标签集自动设置多层感知机的输入与输出层的神经元个数。
#例如train_dataSetn*1024的矩阵,train_hwLabelsn*10的矩阵,
# fit函数将MLP的输入层神经元个数设为1024,输出层神经元个数为 10.
clf.fit(train_dataSet,train_hwLabels)

#测试集评价
dataSet,hwlLabels =readDataSet('testDigits')
res=clf.predict(dataSet) #对测试集进行预测
error_num =0   #统计预测错误的数目
num =len(dataSet) #测试集的数目
for i in range(num):
    #比较长度为10的数组,返回包含01的数组,0为不同,1为相同
    if np.sum(res[i]==hwlLabels[i])<10:
        error_num+=1
print("Total num:",num,"Wrong num:",error_num," WrongRate:",error_num/float(num))

实验效果:

以下结果为课程结果,我自己实验的结果与这个结果相差不大。




2.使用KNN分类器识别数据集DBRHD的手写数字(内容与上面差不多,只是使用算法有些差别)



import numpy as np
#使用listdir模块,用于访问本地文件
from os import listdir
from sklearn import neighbors

#定义img2vector函数,将加载的32*32 的图片矩阵展开成一列向量
def img2vector(fileName):
    retMat =np.zeros([1024],int)
    fr = open(fileName) #打开包含32*32大小的数字文件
    lines =fr.readlines() #读取文件的所有行
    for i  in range(32):
        for j in range(32):  #01数字存放在retMat
            retMat[i*32+j]=lines[i][j];
    return retMat
#并将样本标签转化为one-hot向量
def readDataSet(path):
    fileList =listdir(path) #获取文件夹下所有文件
    numFiles =len(fileList) #统计需要读取的文件的数目
    dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件
    hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot
    for i in range(numFiles):
        filePath =fileList[i] #获取文件名称/路径
        digit =int(filePath.split('_')[0])
        hwLabels[i][digit]=1.0
        dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容
    return  dataSet,hwLabels
train_dataSet,train_hwLabels =readDataSet('trainingDigits')
#构建KNN分类器:设置查找算法以及邻居点 数量(k)值。
#KNN是一种懒惰学习法,没有学习过程,只在预测时去查找最近邻的点,
#数据集的输入就是构建KNN分类器的过程
knn =neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)
knn.fit(train_dataSet,train_hwLabels)


#测试集评价
dataSet,hwlLabels =readDataSet('testDigits')
res=knn.predict(dataSet) #对测试集进行预测
error_num =np.sum(res!=hwlLabels)   #统计预测错误的数目
num =len(dataSet) #测试集的数目

print("Total num:",num,"Wrong num:",error_num," WrongRate:",error_num/float(num))

实验结果(同上)




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10.机器学习sklearn-------手写数字识别实例 的相关文章

  • Apache Hop-使用介绍【持续完善中】

    文章目录 Pipelines 管道 Pipeline Editor 管道编辑器 TOOLBAR Create a Pipeline 创建管道 How pipelines work 管道如何工作 Concepts 概念 Create a pi
  • 计算机组成原理(七)——总线BUS

    总线 BUS 总线 BUS 概念 连接计算机系统各个功能部件的信息传输线 是各个部件共享数据及信息的传输介质 用来连接计算机系统各功能部件而构成一个完整系统 实际上是一组信号线 广义地讲 任何连接两个以上电子元器件的导线都可以称为总线 计算
  • 微服务系列文章之 Redisson实现分布式锁

    一 高效分布式锁 当我们在设计分布式锁的时候 我们应该考虑分布式锁至少要满足的一些条件 同时考虑如何高效的设计分布式锁 这里我认为以下几点是必须要考虑的 1 互斥 在分布式高并发的条件下 我们最需要保证 同一时刻只能有一个线程获得锁 这是最
  • 【go】异步任务解决方案Asynq实战

    文章目录 一 Asynq介绍 二 所需工具 三 代码示例 四 Reference 一 Asynq介绍 Asynq 是一个 Go 库 一个高效的分布式任务队列 Asynq 工作原理 客户端 生产者 将任务放入队列 服务器 消费者 从队列中拉出
  • openEuler之RPM软件包管理命令

    RPM命令介绍 安装软件 rpm i xx rpm 卸载软件 rpm e xx rpm 升级形式安装 rpm U xx rpm 常用参数 v 显示详细信息 h 显示文本进度条 1 安装软件 1 下载RPM包 root localhost l

随机推荐

  • K8s企业版多节部署

    K8s企业版多节部署 实验步骤 K8s的单节点部署 master2节点部署 负载均衡部署 使用双机热备 k8s网站页面 实验环境 使用Nginx做负载均衡 lb01 192 168 217 136 24 CentOS 7 5 lb02 19
  • DLL+资源模块切换

    MFC程序中存在一个模块状态 Module State 的问题 也就是资源重复的问题 此处的术语模块是指一个可执行程序 或指其操作不依赖于应用程序的其余部分但使用MFC运行库的共享副本的一个DLL 或一组DLL 我们所创建的MFC DLL就
  • VS2019配置opencv详细图文教程和测试代码

    摘要 vs2019新鲜出炉 配置opencv又有哪些不一样呢 这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目 测试代码请在原文找到 转发备注原文链接 https xygeng cn post 151 html
  • 机器学习数据获取与处理

    数据获取与处理 以CV任务为主 课程目的 数据的获取途径 数据处理与标注 数据预处理方法 模型训练评估 一 数据集的获取 通常 我们的数据来源于各个比赛平台 首先是AIStudio中的数据集 大部分经典数据集例如百度AI Studio Ka
  • 小程序用户隐私保护协议纯文案修改指引

    目录 一 修改缘由 二 官方指引 三 填写入口 一 修改缘由 小程序提交审核不通过 审核失败原因 存在平台未允许的服务内容 违反 微信小程序平台运营规范常见拒绝情形3 4 详情描述 你好 你的小程序涉及收集 使用和存储用户信息 请增加 用户
  • C++模板的特化(specialization)和偏特化(partial specialization)

    C 模板的特化及偏特化 类模板全特化 对类中的某个成员函数进行特化处理 类模板的偏特化 个数偏特化 范围偏特化 函数模板全特化 函数模板偏特化 模板函数和模板类有的时候可能需要对传入的不同类型进行不同的处理 比如说有的模板传入int或dou
  • 【Linux】进程间通信-命名管道FIFO

    命名管道概述 如果我们要在不相关的进程间交换数据 那么使用FIFO文件将会十分方便 FIFO文件通常也称为命名管道 named pipe 命名管道是一种特殊类型的文件 它在文件系统中以文件名的形式存在 创建命名管道 创建命名管道一般有两种方
  • Unity打包的apk在安卓4.4.2盒子上碰到的问题

    项目场景 Unity开发的项目需要在安卓4 4 2盒子上运行 问题描述 1 会出 从顶部向下滑动即可退出全屏模式 的弹框 这是android4 4的一个特性 叫做沉浸模式 Full screen Immersive Mode 当app启用该
  • 要庆幸,找到了自己-------Day73

    跟朋友聊了大半晚上 看看时间 已经要睡觉的点了 坐下来写这篇文章 只为了感念下曾经的自己 如今的自己 未来的自己 就那么迷茫了那么多年 也坚守了那么多年 如果有方法可以做到 那为何不去努力呢 如果没有人帮 那就自己去克服它 那个守望的孩子就
  • 使用Nginx+Keepalived组建高可用负载平衡Web server集群

    一 首先说明一下网络拓扑结构 1 Nginx 反向代理Server HA Nginx master 192 168 1 157 Nginx backup 192 168 1 158 虚拟IP统一为 192 168 1 110 2 web服务
  • 信号和槽的绑定

    为了更加深入的理解信号和槽的绑定 我们使用以下2种方法来实现绑定 比如我们在QT degisnger界面中添加一个label控件和horizontalScrollBar控件 我们想实现 拖动horizontalScrollBar进度条 la
  • 使用STM32组建基于LoRa的环境监测系统

    文章目录 一 前言 二 介绍 三 硬件连接 1 系统框架 2 中心网关的连接 3 传感器节点1的连接 4 传感器节点2的连接 四 网关程序 1 主程序设计 2 LoRa程序 3 串口1程序 4 LCD显示程序 五 传感器节点程序 1 传感器
  • hexo+git搭建个人博客

    前言 喜欢写 Blog 的人 会经历三个阶段 第一阶段 刚接触 Blog 觉得很新鲜 试着选择一个免费空间来写 第二阶段 发现免费空间限制太多 就自己购买域名和空间 搭建独立博客 第三阶段 觉得独立博客的管理太麻烦 最好在保留控制权的前提下
  • JUC三连问

    1 进程和线程的区别 1 进程是资源分配的基本单位 线程是程序执行的最小单位 2 一个进程包括多个线程 3 每个进程都有自己的内存和资源 一个进程中的线程会共享这些内存和资源 每个线程都有单独的栈内存 和寄存器 2 并行和并发的区别 并行指
  • java 数据结构----------堆栈和队列

    队列的基本概念 队列 简称队 也是一种特殊的线性表 队列的数据元素以及数据元素间的逻辑关系和线性表完全相同 差别是线性表允许在任意位置插入和删除 而队列只允许在一端进行插入操作而在另一端进行删除操作 队列中允许插入操作的一端称为队尾 允许进
  • AutoConfigurationImportSelector自动导入过程分析

    AutoConfigurationImportSelector AutoConfigurationImportSelector 类实现 DeferredImportSelector接口 在项目启动过程中 会自动调用其 selectImpor
  • html input框的样式修改

    在html中 往往我们需要修改input中的placeholder默认文字的样式 在这个时候主要用到 在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果 这时就可以用以下代码来对placeholder进行样式设
  • 基数排序C/C++代码实现

    链式基数排序 分配类排序不需要比较关键字的大小 它 是根据关键字中各位的值 通过对待排序记录进行若干趟 分配 与 收集 来实现排序的 是一种 借助于多关键字排序的思想对单关键字排序的方法 基数排序 RadixSorting 是典型的分配类排
  • Tomcat配置与优化(内存、并发、管理)

    一 JVM内存配置优化 在开发当中 当一个项目比较大时 依赖的jar包通常比较多 我们都知道 在应用服务器启动时 会将应用引用到的所有类通过ClassLoader依次全部加载到内存当中 Java的逻辑内存模型大致分为堆内存 栈内存 静态内存
  • 10.机器学习sklearn-------手写数字识别实例

    1 概念介绍 图像识别 Image Recognition 是指利用计算机对图像进行处理 分析和理解 以识别各种不同模式的目标和对像的技术 图像识别的发展经历了三个阶段 文字识别 数字图像处理与识别 物体识别 机器学习领域一般将此类识别问题