首页 > 编程语言 >Pyhton知识分享-利用KNN算法实现手写数字识别

Pyhton知识分享-利用KNN算法实现手写数字识别

时间:2024-12-30 22:27:34浏览次数:8  
标签:KNN plt 像素 Pyhton train test 手写 data

利用KNN算法实现手写数字识别

在这里插入图片描述
MNIST手写数字识别 是计算机视觉领域中 "hello world"级别的数据集

  • 1999年发布,成为分类算法基准测试的基础
  • 随着新的机器学习技术的出现,MNIST仍然是研究人员和学习者的可靠资源。

本次案例中,我们的目标是从数万个手写图像的数据集中正确识别数字。

数据介绍

数据文件 train.csv 和 test.csv 包含从 0 到 9 的手绘数字的灰度图像。

  • 每个图像高 28 像素,宽28 像素,共784个像素。

  • 每个像素取值范围[0,255],取值越大意味着该像素颜色越深

  • 训练数据集(train.csv)共785列。第一列为 “标签”,为该图片对应的手写数字。其余784列为该图像的像素值

  • 训练集中的特征名称均有pixel前缀,后面的数字([0,783])代表了像素的序号。

像素组成图像如下:

000 001 002 003 ... 026 027
028 029 030 031 ... 054 055
056 057 058 059 ... 082 083
 | | | | ...... | |
728 729 730 731 ... 754 755
756 757 758 759 ... 782 783

数据集示例如下:

在这里插入图片描述

# 导入工具包
import joblib
from sklearn.model_selection import train_test_split, GridSearchCV  # 分割训练集和测试集的,  网格搜索 + 交叉验证.
from sklearn.neighbors import KNeighborsClassifier  # KNN算法 分类对象
import matplotlib.pyplot as plt  # 绘图.
import pandas as pd
from collections import Counter


# 需求 定义函数 接收索引 将该行的手写数字 识别为 图片并绘制出来
def dm01_show_digit(idx):
    # 1. 读取文件 获取df对象
    data = pd.read_csv('./data/手写数字识别.csv')
    # 2.判断用户传入值 是否合法
    if idx < 0 or idx >= len(data):
        print('传入的索引有误 程序结束! ')
        return

    # 走到这里说明 没问题 查看下所有的数据集
    x = data.iloc[:, 1:]
    y = data.iloc[:, 0]

    print(
        f'数字的种类: {Counter(y)}')  # Counter({1: 4684, 7: 4401, 3: 4351, 9: 4188, 2: 4177, 6: 4137, 0: 4132, 4: 4072, 8: 4063, 5: 3795})
    print(f'像素的形状: {x.shape}')

    # 根据传入的索引获取到该行的数据
    print(f'您传入的所有 对应的数字是: {y[idx]}')

    # 绘制图片
    # 把图片的像素点 转为 28*28的图片
    digit = x.iloc[idx].values.reshape(28, 28)

    # 绘制图片
    plt.imshow(digit, cmap='gray')  # 灰度图
    plt.axis('off')  # 关闭坐标
    # plt.savefig('./data/demo2.png')
    plt.show()


# 需求2 定义函数 使用KNN算法 用于识别 手写数字 保存模型

def dm02_train_mdoel():
    data = pd.read_csv('./data/手写数字识别.csv')

    #  数据预处理
    x = data.iloc[:, 1:]
    y = data.iloc[:, 0]

    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22, stratify=y)
    # 特征工程
    x_train = x_train / 255

    # 模型训练
    estimator = KNeighborsClassifier(n_neighbors=9)
    estimator.fit(x_train, y_train)

    # 模型评估
    print(f'准确率: {estimator.score(x_test, y_test)}')

    # 模型保存
    joblib.dump(estimator, './model/knn.pkl')


def dm03_use_model():
    # 读取图片 绘制图片
    img = plt.imread('./data/demo.png')
    plt.imshow(img,cmap='gray')
    plt.show()


    # 读取模型  获取模型对象
    knn = joblib.load('./model/knn.pkl')

    # 模型预测

    y_predict = knn.predict(img.reshape(1,-1))
    print(f'预测结果为:{y_predict}')



if __name__ == '__main__':
    # dm01_show_digit(20)
    # dm02_train_mdoel()
    dm03_use_model()

坚持分享 共同进步

标签:KNN,plt,像素,Pyhton,train,test,手写,data
From: https://blog.csdn.net/weixin_45423893/article/details/144835500

相关文章

  • RPC的基本原理与手写RPC框架
    RPC(RemoteProcedureCall)的基本原理RPC(远程过程调用)是一种计算机网络协议,使得在不同计算机或进程间调用函数或方法变得像调用本地函数一样透明和简单。它广泛应用于分布式系统、微服务架构等场景中。在深入了解RPC时,涉及的概念包括其工作原理、分层架构、协议、序列化方......
  • pyhton、miniConda、pycharm下载安装配置
    pyhton、miniConda、pycharm下载安装配置以下都是在win10环境下,linux和mac或者其他win版本请百度。1.pyhton下载安装配置下载https://www.python.org/ #官网https://www.python.org/downloads/ #官网下载页https://www.python.org/downloads/windows/ #官网下载wi......
  • 《机器学习》——利用OpenCV库中的KNN算法进行图像识别
    文章目录KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练KNN算法介绍一、KNN算法的基本要素K值的选择:K值代表选择与新测试样本距离最近的前K个训练样本数,通常K是不大于20的整数。K值的选择对算法结果有重要影响,需要通过交叉验证等方法来确......
  • 《机器学习》KNN算法实现手写数字识别
    目录 一、项目介绍二、数据集介绍三、需要解决的问题四、代码实际展示代码展示实验结果五、使用自己的数据进行测试代码展示结果展示六、总结 一、项目介绍通过对一张2000*1000像素写满0-9手写数字的图片进行处理。分割出训练集和测试集使用KNN算法进行训练并......
  • 手写 PromiseA+ 实现,轻松通过 872 条用例
    手写Promise/A+实现,轻松通过872条用例规范参考:Promise/A+规范-中文版本测试工具:https://github.com/promises-aplus/promises-tests前言从接触Promise到现在,笔者经历了这么个过程:了解各种Promise规范,包括Promise/A+,但对其具体内容不甚了解。研究前人的Promi......
  • 【JavaScript】手撕前端面试题:手写new操作符!!!
    前言当我们在使用构造函数的时候,要实例化一个对象,直接使用new就好了,这样新对象就继承到了构造函数的所有属性和方法。那你有思考过new是啥嘛?它的工作流程是什么样的?这也是在前端面试中经常考的一道手写题,今天就让我们一起拿下它!new是什么?在手写new之前,让我们先来好好认识一......
  • 从0到1手写实现前端事件中心机制
    1.引言在前端开发中,尤其是构建大型应用时,组件之间的通信变得非常复杂。为了实现组件之间的解耦,我们通常会采用事件驱动的方式。事件中心(EventEmitter)机制就是通过集中管理和分发事件来解耦生产者(事件的触发者)和消费者(事件的处理者)。这种机制尤其适合在复杂的前端应用中,减少......
  • 手写一个base64解码的方法
    在前端开发中,虽然我们可以直接使用浏览器提供的atob函数来进行Base64解码,但如果你想要手写一个Base64解码的方法,以下是一个简单的实现:functionbase64Decode(input){constchars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';letst......
  • 手写数字识别-决策树
    手写数字识别-决策树决策树决策树是一种基于树形结构的分类算法,通过不断地根据特征划分数据集来实现分类。数据集分析在本任务中,我们使用的是著名的MNIST数据集(https://www.kaggle.com/code/nishan192/mnist-digit-recognition-using-svm中下载使用test即可),它包含了大......
  • 手写 VGG 网络模型实现 CIFAR10 数据集分类
    VGG网络VGG是一个经典的卷积神经网络(CNN)架构,由牛津大学的视觉几何组(VisualGeometryGroup)在2014年提出。VGG网络因其简单而有效的设计而闻名,在图像识别领域取得了很好的效果。VGG网络的主要特点是:深度:VGG网络非常深,原始的VGG网络有16层(包括卷积层和全连接层),后来简化为1......