基于matlab采用KNN算法手写体数字识别实现

本文详细介绍了如何使用MATLAB实现基于KNN算法的手写数字识别,包括处理MNIST数据集、代码实现及识别结果分析。通过Python转换IDX文件为PNG,然后在MATLAB中进行二值化处理、训练和测试,最后展示K=5时的识别精度超过0.9。
摘要由CSDN通过智能技术生成

基于matlab采用KNN算法手写体数字识别实现

一、前言

  • KNN 全称是 K- Nearest Neighbors ,K-近邻。简单来说,K就是邻居个数,选出和测试样本最像的邻居(这里是欧式几何距离最短的K个邻居),那么样本的邻居是什么,样本就是什么(在K个邻居里,假如邻居的标签最多的是数字1,我们就认为样本的标签就很可能是数字1)
  • KNN 实现手写体识别的原理和代码都比较简单,但网上相关文章不多,本文只是把我自己的理解写下来作为学习matlab的实践,多有纰漏,请多指教

二、实现过程

  1. 处理 MNIST 数据集

    • 下载 MNIST 数据集,下载测试集、测试标签、训练样本、训练标签共四个文件
    • 下载下来的数据集是 IDX 文件格式的,因此用 Python 转为 50×50 的PNG图片,代码在后
    • 选取合适数量的测试集和训练集,训练集中每个数字的训练样本数要一致
  2. matlab 实现步骤(以图像分辨率为 50×50例)

  • 对所有图片做二值化处理:有值取1,无值取0

  • 将 0-9 数字的训练样本矩阵化,每一幅数字图像都是一维矩阵。以50×50分辨率图像为例,获得 1×2500 的一维矩阵;每个数字860张图片,我们就得到了 8600 × 2500 的矩阵,这作为训练矩阵

  • 在训练矩阵加入标签列,用来判断某一行指的数字是多少

  • 对每一幅待识别数字图像,同样将其转为 1 × 2500 的一维矩阵,称为测试矩阵

  • 计算测试矩阵与训练矩阵每一维的欧氏几何距离,同样按列向量加到训练矩阵,并按距离升序按行排列训练矩阵

  • 对前 K 个行向量求标签的众数,结果标签就是采用 KNN 算法得到的最有可能的识别结果


三、代码实现

  1. 处理MINIST数据集的Python代码 感谢 name_s_Jimmy 的文章 使用Python将MNIST数据集转化为图片

    import numpy as np
    import struct
     
    from PIL import Image
    import os
     
    data_file =  #需要修改的路径,测试或训练样本图像,如t10k-images.idx3-ubyte或train-images.idx3-ubyte
    # It's 47040016B, but we should set to 47040000B
    data_file_size = 47040016
    data_file_size = str(data_file_size - 16) + 'B'
     
    data_buf = open(data_file
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值