机器学习之手写字体(digits)识别——利用sklearn实现

Scikit Learn识别手写数字 -- 机器学习项目基础篇(6) 阅读详情
AI摘要

本文详细介绍了如何利用sklearn对digits数据集进行手写字体识别,涵盖KNN、MLP、RandomForest、Adaboost、SVM、DecisionTree和LogisticRegression七种算法的实现、参数调整和性能评估。重点讨论了数据预处理、模型选择和实验问题解析,揭示了算法适用性和优化策略。


机器学习之手写字体(digits)识别——利用sklearn实现


1实验目的

为了进一步地掌握建立机器学习模型的流程,理解机器学习的基本概念,此次实验针对sklearn自带的digits数据集(手写字体识别数据集)进行分类预测。
在此次实验中,我选用了KNN、MLP、Random Forest、Adaboost、SVM、Decision Tree、Logistic Regression这七种机器学习算法模型进行手写字体的识别。
本次项目的实验环境为pycharm + python3.9,经测试,各种算法模型在安装了python3.9的jupyter notebook中均可以正常运行

2实验过程

2.1 查看数据集

首先,将sklearn库中的数据集导入到项目中,其中X为1797*64的二维数组,代表数据集中1797个样本,每一个样本图片均是一维向量,特征维度为64,每个像素点代表1维的特征,其取值范围为0-16;y为样本所对应的标签值,共有10个类别,其取值范围为0-9中的任意一个数字。将数据集导入项目中的代码如下所示:

from sklearn.datasets import load_digits
digits = load_digits()
X = digits.data
y = digits.target

如果要可视化查看数据集,则需要将样本图片转换为二维,然后借助matplotlib包实现,以数据集中的第1796个样本9为例,具体的实现方式,如下所示:

import matplotlib.pyplot as plt
def show(image):
    test = image.reshape((8, 8))  # 从一维变为二维,这样才能被显示
    print(test.shape)  # 查看是否是二维数组
    plt.imshow(test, cmap=plt.cm.gray)  # 显示灰色图像
plt.show()
if __name__ == '__main__':
    show(X[1795])

数字9图片如下图所示:
在这里插入图片描述
考虑到在后续算法模型的建立过程中,需要用到的样本是一维向量,故show()函数只用来对数据集的查看和检验,并不将数据集全部进行转换。

2.2 数据清理

数据集的预处理主要分为两部分,分别是特征标准化和特征降维。

2.2.1特征标准化

调用sklearn中对数据进行标准化的函数处理样本X,特征标准化的过程如下:

from sklearn.preprocessing import StandardScaler
def standard_demo(data):
    transfer = StandardScaler()
    data_new = transfer.fit_transform(data)
    print(data_new)
    return data_new
if __name__ == '__main__':
    X_new = standard_demo(X)

2.2.2特征降维

考虑到样本中的特征维度为64维,可能包含一些相近的维度或噪音等,这些维度会影响算法模型的性能,容易产生过拟合等现象,因此,在数据清理时,需要对样本进行特征降维。实现代码如下:

from sklearn.decomposition import PCA
def pca_demo(data):
    transfer = PCA(n_components=0.92)
    data_new = transfer.fit_transform(data)
    print(data_new)
    return data_new
if __name__ == '__main__':
    X_new = pca_demo(X_new)

其中,在进行降维的过程中,保留原本数据集大小的百分比对与算法的准确率具有较大的影响,此次实验中,以KNN算法为例,从84%一直到96%,实验PCA降维之后算法的准确率,最终实验得到的结果如下表所示:

Percentage(%)	84	85	86	87	88	89	90	91	92	93	94	95	96
Accuracy	0.96	0.96	0.97	0.97	0.96	0.97	0.97	0.97	0.98	0.97	0.97	0.97	0.97

由于这是在调参之后测出的结果,所以在四舍五入之后,它们之间并没有很明显的差距,但是在保留原数据集92%的情况下,准确率依然很明显,故此次实验的降维参数n_components=0.92,特征维度降为34维,由此可见,数据集中的确存在大量的噪音或比较接近的特征维度。

2.3 机器学习建模

数据集已经准备好了,下一步就是建立机器学习算法模型,对模型进行训练。

2.3.1 KNN算法

我第一个选择的算法模型为KNN算法,因为它的原理比较简单,对于这种小数据集来说,理论上看它应该会有不错的表现,模型构建如下:

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
def knn_demo(data, label):
    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(data, label, random_state=6)
    # 训练模型
    estimate = KNeighborsClassifier(n_neighbors=10)
estimate.fit(X_train, y_train)  # 模型构建好了
if __name__ == '__main__':
    knn_demo
【机器学习实战】逻辑回归----digits手写数字分类 【导入库和数据集】 和线性回归一样,首先导入所需要用到的库和数据集。 导入库: ##用于可视化图表 import matplotlib.pyplot as plt ##用于做科学计算 import numpy as np ##用于做数据分析 import pandas as pd ##用于加载数据或生成数据等 from sklearn import datasets ##加载线性模型 f... 阅读详情

相关推荐

手写数字识别:从MNIST到工业落地的思维重构

手写数字识别是机器学习入门的核心范例,其本质并非简单图像分类,而是高维特征空间中的模式建模与概率决策。理解卷积核如何捕获局部结构、ReLU如何构建稀疏激活、池化如何实现位置鲁棒性,是掌握深度学习原理的关键起点。该任务天然适合作为可解释AI的训练场——通过Grad-CAM热力图、滤波器可视化和梯度分析,能直观追踪模型‘思考路径’。在真实场景中,它直面字体泛化、复合噪声、边缘硬件等工业级挑战,倒逼数据预处理、轻量化部署与持续监控能力。因此,手写数字识别不仅是MNIST基准测试,更是连接理论认知与工程落地的认知脚

weixin_30814329的博客 424

利用支持向量机(SVM)算法进行手写数字识别

首先,我们需要准备一个手写数字数据集,该数据集包含一系列手写数字图像及其对应的标签。在本示例中,我们将使用MNIST数据集,它是一个常用的手写数字数据集。在本文中,我们将使用OpenCV-Python库和支持向量机(SVM)算法来实现手写数字识别。接下来,我们使用训练好的SVM模型对特征向量进行预测,并打印预测结果。接下来,我们将使用支持向量机(SVM)算法来训练手写数字识别模型。最后,我们可以使用训练好的模型对新的手写数字图像进行分类预测。接下来,我们使用训练好的模型对测试集进行预测,并使用。

TechBurst的博客 767

【机器学习小实验3】基于支持向量机的Digits手写数字识别

建模流程实验中使用支持向量机(SVM)构建了手写数字识别模型,通过加载数据集、划分训练集和测试集、调参等步骤完成建模过程。模型参数理解了解了SVM中常用的参数,如核函数类型(rbf、linear、poly、sigmoid)、正则化参数C和多项式核函数的阶数degree等参数对模型性能的影响。新掌握的函数。

m0_69310669的博客 1753

手写拼音识别入门:轻量CNN实战与避坑指南

在模式识别与图像分类任务中,手写字符识别一直是检验机器学习模型从数据到决策能力的经典场景。卷积神经网络(CNN)通过卷积核自动提取笔画局部特征,配合池化与全连接层完成分类,能有效应对书写变体与噪声干扰。在工程实践中,数据预处理、数据增强与模型容量控制是决定识别准确率的关键因素,尤其适合样本量有限的小型识别任务。此类技术可广泛应用于教育评测、移动端手写输入、表单自动化等场景。本文以手写拼音识别为切入点,完整演示了从点位采集、灰度图渲染、轻量CNN训练到混淆矩阵分析的全流程,并总结了过拟合、类别不均衡等常见问题

weixin_34221073的博客 310

手写数字识别从零实现:PyTorch完整工程代码与避坑指南

深度学习入门常从图像分类开始,而MNIST作为最经典的手写数字识别数据集,是理解数据加载、模型构建与训练评估全流程的理想载体。通过PyTorch实现CNN(卷积神经网络)时,torchvision下载失败、数据预处理不规范、训练曲线不收敛、设备不一致等问题,往往是新手真正面临的障碍。这套方案系统拆解从idx二进制数据解析、自定义Dataset/DataLoader,到网络设计、损失函数与优化器选择、混淆矩阵评估,再到单张图片推理及ONNX导出的完整技术链路。这些技能不仅能解决手写数字识别中的实际工程问题,也

weixin_34318272的博客 691

基于OpenCV的电表LED数码管读数识别:传统图像处理实战

光学字符识别(OCR)是计算机视觉领域的基础技术,旨在将图像中的文字转换为可编辑的文本数据。其核心原理在于通过图像预处理、特征提取和模式识别等步骤,实现对字符的自动化读取。在工业视觉和物联网数据采集中,OCR技术展现出巨大价值,尤其适用于仪表读数、产品编码等场景。然而,通用OCR引擎在面对特定场景如高对比度、发光显示的LED数码管时,往往因字体、光照等差异而表现不佳。本文聚焦于利用OpenCV图像处理库,针对电表LED数码管读数这一具体应用,详细阐述了从图像预处理、数字区域定位、字符分割到最终识别的完整技术

weixin_33922672的博客 400

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1414

面试篇 - LoRA(Low-Rank Adaptation) 原理

输出示例:trainable params: 262,144 || all params: 6,742,016,000 || trainable%: 0.0039。论文实验显示:零初始化 BB 可使初始损失与预训练模型相差不足0.1%,而非零初始化可能差50%+。若初始 ΔW≠0,模型可能立即偏离预训练学到的知识(如GPT-3突然忘记如何造句)。:如同汽车改装,先保持原厂配置(W),再逐步加装新部件(ΔW),避免直接飙车失控。:大模型的权重变化矩阵 ΔWΔW 通常是低秩的(少数主成分主导变化)。

qq_60245590的博客 1155

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 333

PaddleOCR实战:给图片‘加个框’,轻松搞定小图和长图文字识别不准的难题

本文探讨了PaddleOCR在处理小图和长图时识别精度下降的问题,并提出通过图像边框预处理技术显著提升OCR识别效果。详细介绍了使用OpenCV实现智能边框添加的方法,包括核心原理、工程实践中的关键细节以及性能优化策略,帮助开发者轻松解决非常规尺寸图像的文本检测难题。

weixin_29313547的博客 189

模拟电子技术课设-压控信号发生器

正弦波产生电路的目的就是使电路产生一定频率和幅度的正弦波,我们一般在放大电路中引入正反馈,并创造条件,使其产生稳定可靠的振荡。由于图2.3-1所示电路中存在RC电路和积分电路两个延迟环节,在实用电路中,将它们“合二为一”,即去掉方波发生电路中的RC回路,使积分运算电路即作为延迟环节,又作为方变三角波电路,滯回比较器和积分运算电路的输出互为另一个电路的输入。接着对各单元电路的工作原理进行了分析,由直流稳压电源电路提供所需电压,文氏振荡器产生正弦波,滞回比较器产生方波,滞回比较器与积分器连接产生三角波。

Sulfurone的博客 5325

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1190

手把手教你学PCIE--固件与BIOS配置 - BIOS设置对PCIe性能的影响

本文详细分析了BIOS设置对PCIe性能的影响,并提供了优化建议。通过合理调整链路参数、功耗管理策略和高级功能配置,可以显著提升系统的性能和稳定性。本文将进一步分析BIOS设置如何影响PCIe设备的性能,并提供优化建议。BIOS(或UEFI)是系统启动时的第一个控制层,其设置直接决定了PCIe设备的工作状态和性能表现。BIOS中的功耗管理选项(如C-States、P-States)会影响PCIe链路的低功耗模式(L0s/L1)。MSI/MSI-X中断具有更高的性能和更好的可扩展性,应作为首选方案。

MHD0815的博客 998

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: No Module Named pip
下一篇: 基于Proteus仿真的交通信号灯设计——利用汇编语言实现
Sky.Grey
博客等级 码龄7年 441粉丝 6原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Sky.Grey

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

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

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

打赏作者

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

抵扣说明:

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

余额充值