python实现基于KNN算法的手写数字识别系统 非常详细!!!!

一家懂得用细节留住客户的3年潮牌老店我必须支持!➕🛰:luyao1931

在这里插入图片描述

实验知识点:

1、K 近邻分类算法
2、从文本文件中解析和导入数据
3、使用 Matplotlib 创建扩散图
4、归一化数值

首先介绍下监督学习和无监督学习:

监督学习:(数据有输入有输出),通过已有的一部分数据和输出数据之间的相应关系,生成一个函数,将输入映射到合适的输出,在准确的说有监督学习就是训练样本中必须有标签或者标记;
无监督学习:(数据只有输入),给定的训练样本中难以标注类别或者标注成本过高,这类没有类别标注(未被标记)的训练集建模模式称为无监督学习
半监督学习:一部分数据有标签一部分数据没标签称为半监督学习

监督学习常用算法:

分为 分类(classification)和回归(regression)俩大类
分类:
K近邻、支持向量机、朴素贝叶斯、决策树、随机森林、人工神经网络等;
回归:
线性回归、神经网络等

无监督学习常用算法:

无监督学习算法主要为 聚类:
K-Means聚类,高斯混合模型等;
监督学习—KNN(k最近邻分类算法)

KNN算法思想:

K最近邻算法,顾名思义就是搜寻最近的K个已知类别样本用于未知类别样本的预测。
"最近"的度量就是应用点之间的距离或相似性,距离越小或相似度越高,说明他们之间越近
“预测”,对于离散型的因变量来说,从k个最近的已知类别样本中挑选出频率最好的类别用
于未知样本的判断;对于连续性的因变量来说,则是将K个最近的已知样本均值用作未知样
本的预测。

最佳K值的选择:

为了在模型中防止出现过拟合或欠拟合状态,也为了获得最佳的k值,可以考虑俩种解决方
案:一种是设置k近邻样本投票权重,假设读者在使用KNN算法进行分类或预测时设置的
k值比较大,担心模型发生欠拟合的现象,一个简单有效的方法就是设置近邻样本的投票权
重,如果一直样本距离未知样本比较远,则对应的权重就设置的低一些,否则权重高一些
通常可以将权重设置为距离的倒数,另一种是采用多重交叉验证,最后选出平均误差最小的
k值,当然还可以将俩种方法的有点相结合,选出理想的k值。

K近邻算法概述:

简单地说,K 近邻算法采用测量不同特征值之间的距离方法进行分类。它具有的优缺点如下:
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
K 近邻算法适用数据范围为:数值型和标称型。
K 近邻算法的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 kk 个最相似的数据,这就是 K 近邻算法中 kk 的出处,通常 kk 是不大于 20 的整数。最后,选择 kk 个最相似数据中出现次数最多的分类,作为新数据的分类。

K近邻算法的一般流程:

1、收集数据:可以使用任何方法。
2、准备数据:距离计算所需要的数值,最好是结构化的数据格式。
3、分析数据:可以使用任何方法。
4、训练算法:此步骤不适用于 K 近邻算法。
5、测试算法:计算错误率。
6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K 近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

开发准备:

为了简单起见,这里构造的系统只能识别数字 0 到 9,参见图 2-6。需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小 1:宽高是 32 像素 x 32 像素的黑白图像。

尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理解,还是将图像转换为文本格式。

在这里插入图片描述

实验步骤:

准备数据:将图像转换为测试向量

为了使用前面两个例子的分类器,我们必须将图像格式化处理为一个向量。我们将把一个 32x32 的二进制图像矩阵转换为 1x1024 的向量,这样前两节使用的分类器就可以处理数字图像信息了。

首先编写一段函数 img2vector,将图像转换为向量:该函数创建 1x1024 的 NumPy 数组,然后打开给定的文件,循环读出文件的前 32 行,并将每行的头 32 个字符值存储在 NumPy 数组中,最后返回数组。
代码

def img2vector(filename):
    # 创建向量
    returnVect = np.zeros((1, 1024))
    # 打开数据
  • 25
    点赞
  • 327
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
手写数字识别是机器学习中经典的问题之一,KNN(K-最近邻)算法是一种常用的分类算法。下面给出基于Python手写数字识别KNN算法实现过程。 1. 数据集准备 首先,我们需要一个手写的数据集。MNIST数据集是一个经典的手写数据集,可以从http://yann.lecun.com/exdb/mnist/下载。下载后,将数据集解压缩到本地文件夹中。 2. 数据预处理 将数据集中的图片转换成向量形式,以便于计算机处理。这里我们将每张图片转换成一个784维的向量(28*28像素),并将像素值归一化到[0,1]范围内。 ```python 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-images-idx3-ubyte' % kind) with open(labels_path, 'rb') as lbpath: magic, n = struct.unpack('>II', lbpath.read(8)) labels = np.fromfile(lbpath, dtype=np.uint8) with open(images_path, 'rb') as imgpath: magic, num, rows, cols = struct.unpack('>IIII', imgpath.read(16)) images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784) return images, labels X_train, y_train = load_mnist('mnist/', kind='train') X_test, y_test = load_mnist('mnist/', kind='t10k') # 数据归一化 X_train = X_train / 255.0 X_test = X_test / 255.0 ``` 3. KNN算法实现 KNN算法的基本思路是:对于一个未知样本,计算它与训练集中每个样本的距离,选择距离最近的K个样本,将它们的标签作为预测结果。 ```python from collections import Counter def knn(X_train, y_train, X_test, k): pred_labels = [] for i in range(len(X_test)): # 计算测试样本与训练集样本的距离 distances = np.sqrt(np.sum((X_train - X_test[i])**2, axis=1)) # 选择距离最近的K个样本 nearest = np.argsort(distances)[:k] # 统计K个样本的标签 counter = Counter(y_train[nearest]) # 将出现次数最多的标签作为预测结果 pred_labels.append(counter.most_common(1)[0][0]) return pred_labels ``` 4. 测试效果 将KNN算法应用到手写数字识别问题上,测试其效果。 ```python pred_labels = knn(X_train, y_train, X_test[:100], 5) accuracy = np.sum(pred_labels == y_test[:100]) / len(y_test[:100]) print('Accuracy:', accuracy) ``` 输出结果如下: ``` Accuracy: 0.97 ``` 可以看出,KNN算法手写数字识别问题上的表现还是比较不错的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值