用Python实现K近邻算法用于手写数字识别详细过程(含首次调试运行)

1、案例概述

图像识别是机器学习领域一个非常重要的应用场景,本次通过一个较为经典的手写数字识别模型来讲解如何在具体场景中应用K近邻算法。

2、数据集

手写数字识别,或者说图像识别的本质就是把下图所示的图片中的数字转换成计算机能够处理的数字形式。

(1) 图像二值化

通过图像二值化可以将图片大小为32×32的手写数字“4”的图片转换成由0和1组成的“新的数字4”,如下图所示。数字1代表有颜色的地方,数字0代表无颜色的地方,这样就完成了手写数字识别的第一步。

 (2)二维数组转换为一维

数组经过图像二值化处理获得32×32的0-1矩阵,为了方便进行机器学习建模,还需要对这个二维矩阵进行简单的处理:在第1行数字之后依次拼接第2~32行的数字(也即32*32=1024),得到一个1×1024的一维数组。利用这种一维数组就可以计算不同手写数字之间的距离(利用上文讲到的明氏距离或皮尔森距离计算),从而进行手写数字识别。

MNIST数据集是一个手写体识别数据集,来自美国国家标准与技术研究所。它包含了各种手写数字图片以及每张图片对应的数字标签,图片大小为28*28,且为黑白图片。其中,60000张手写数字图片作为训练数据,由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局的工作人员;10000张图片作为测试数据。数据集链接:
链接: https://pan.baidu.com/s/10dl5f5EXEd2IiZc1NdhCdQ?pwd=hz6j 提取码: hz6j 

本案例使用的数据集共有1934个二值化处理好的手写数字0~9,每一行是一个手写数字的一维数组。“对应数字”列是手写数字,也是目标变量;其余列为该手写数字对应的1024维特征值,也是预测变量。

(4)Python实现过程

Ⅰ数据读取

首先通过pandas库读取数据,代码如下:

import pandas as pd
df = pd.read_excel('手写字体识别.xlsx')
df.head()

通过这段代码,我们可以把数据读取到变量df中,为了更好的使用变量,现在需要使用type()函数查看df的类型是什么,如下:

 通过打印df.head()查看表格的前5行,结果如下所示:

其中第1列“对应数字”为目标变量y,其余1024列为特征变量X,接下来我们将利用这些数据搭建手写数字识别模型。 

Ⅱ 提取特征变量和目标变量

在建模前,首先将特征变量和目标变量分别提取出来,代码如下:

X = df.drop(columns='对应数字') 
y = df['对应数字'] 

x为特征变量,y为目标变量。

Ⅲ 划分训练集和测试集

提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

这里将test_size设置为0.2,表示选取20%的数据用于测试。random_state设置为123,使每次运行程序得到的数据划分结果保持一致。

Ⅳ 模型构建

划分好训练集和测试集之后,可以从Scikit-Learn库中引入K近邻算法进行模型训练,代码如下:

from sklearn.neighbors import KNeighborsClassifier as KNN
knn_model = KNN(n_neighbors=5) 
knn_model.fit(X_train, y_train)

代码创建了一个KNN类的实例对象knn_model,并通过参数n_neighbors=5指定了在K近邻算法中选择的邻居数量为5。也就是在进行分类预测时,会根据新数据与训练集中5个最相似的数据(最近邻)的类别来确定新数据的类别。

☀这儿有个疑问,K近邻的第一篇文章中讲到,K近邻算法不需要进行模型训练,为什么这儿仍然有模型训练,这和决策树的模型训练有什么区别?

K近邻算法被称为“lazy-learning”(惰性学习)算法,它不需要像传统的参数化模型(如决策树、神经网络等)一样通过训练数据来学习模型参数。但在代码中看到的fit方法,实际上是在存储训练数据,以便后续在预测阶段进行距离计算。
当调用fit方法时,K近邻模型只是简单地记录了训练集中的样本特征和对应的标签。在手写数字识别的例子中,knn_model.fit(X_train,y_train)这一步就是把训练集中手写数字的特征(存储X_train中)和对应的数字标签(存储在y_train中)保存起来。在预测新数据时,会将新数据与这些保存的训练数据进行距离比较,而不是像传统模型那样通过训练得到一个固定的决策边界或者函数形式。

☀ 是存储全部的训练数据还是存储n_neighbors=5个?

在K近邻算法中,模型会存储全部的训练数据,而不仅仅是n_neighbors=5个数据点。当执行knn_model.fit(X_train,y_train)时,模型会将整个训练集X_train(包含所有的特征向量)和对应的标签y_train保存下来。
n_neighbors=5这个参数是在预测阶段使用的。当有一个新的数据点需要分类时,模型首先会计算这个新数据点与存储的所有训练数据点之间的距离(通常使用欧氏距离、明氏距离等)。

Ⅴ 模型评估与预测

通过如下代码即可对测试集数据进行预测,预测对应的数字,同时可以使用accuracy_score()函数,查看测试集所有数据的预测准确度:

y_pred = knn_model.predict(X_test)
a = pd.DataFrame()  # 创建一个空DataFrame
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)
a.head(10)

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)

将score打印输出,结果为0.9793,也就是说,模型对整个测试集的预测准确度为97.93%。

对于分类模型,不仅关心整体的预测准确度,也关心模型在每一类样本里面的表现,Python可以通过如下代码计算每一个类别的精准率和命中率:

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

K近邻算法(KNN)及案例(Python) 1 算法简介 K近邻算法(英文为K-Nearest Neighbor,因而又简称KNN算法)是非常经典的机器学习算法。 K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。 (K的含义)以下图为例,假设五角星代表爱情片,三角形代表科幻片。此时加入一个新样本正方形,需要判断其类别。当选择以离新样本最近的3个近邻点(K=3)为判断依据时,这3个点由1个五角星和2个三角形 阅读详情

相关推荐

【AI】Python 实现 KNN 手写数字识别

KNN 实现手写数字分类

Elford的博客 3993

基于k近邻(KNN)的手写数字识别

最近再看Machine Learning in Action. k近邻算法这一章节提供了这一例子,本着Talk is cheap的原则,我们来实际测试一下。 简单的介绍一下k近邻算法(KNN):给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。如下图所示: x为测试样本,小黑点是一类样本,小红点是另一类样本。在测试样本x的周围

FaaronZheng的专栏 7643

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

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

Taplus的博客 3878

Python人工智能--实现手写数字识别

在做此项目之前,首先要明白何为KNN算法。 一 、 K-近邻算法(KNN)概述 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。 KNN是通...

我是一只程序⚪的技术交流平台 2万+

基于python-KNN完成MNIST手写体数字识别

       选修了模式识别这门课,完成一个简单的基于KNN的分类项目:手写体分类任务。      首先从网站上下载数据,格式为.idx3-ubyte和.idx1-ubyte,分别对应的是图片和标签的数据格式。首先需要对其进行解码,即转化成可以进行分类的格式,换个说法就是对文件中的数据进行读取。       读取部分按照文件中的存储格式进行读取,分别对两种文件进行解析。函数代码如下:def dec...

kawhi849 5702

机器学习实战之K-近邻算法(KNN)(三)示例:手写数字识别(含数据集)

K-近邻算法(KNN)(三)示例:手写数字识别示例:手写数字识别收集数据准备数据knn分类器测试算法kNN小结 示例:手写数字识别 流程如下: (1)收集数据:提供文本文件。 (2)准备数据:编写函数img2vector(),将图像格式转换为分类器使用的向量格式。 (3)分析数据:在Python命令提示符中检擦数据,确保它符合要求。 (4)训练算法:此步骤不适用于k-近邻算法。 (5)测试算法:编...

weixin_45814668的博客 3029

用KNN(K近邻算法)完成手写数字识别python实践

用KNN(K近邻算法)完成手写数字识别 这是我第一次写博客,也是刚学的KNN,写``的目的就是为了增强我对该算法的理解。有问题请大家给我指出,谢谢啦。 一.算法部分 1.客观理解:最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多...

LiuAmber的博客 2669

机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读

一.背景简要说明 书中假设待识别的数字已经使用图形处理软件将其处理为32*32的黑白图像,并将图片转换为文本格式。如下图代表数字0: 每个数字的训练样本大概有200个,每个数字的测试样本大概有100个,分别放在trainingDigits和testDigits中。 二.模块代码及注释 from numpy import * from os import

SCUT_Arucee的博客 6885

手写数字识别算法之kNN

手写数字识别算法之kNN 1、k-近邻算法 ①原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每一个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每一个特征进行比较;然后算法提取样本集中特征最相近数据(最邻近)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-邻近算法中k的出处。通常k是不大于20的整数。最后...

weixin_46824122的博客 5264

KNN实现手写数字识别Python

本文章总结了KNN算法字手写数字识别的应用,比较系统的对传统KNN和各种改进的KNN算法进行实现,由于完整的代码量较大(部分代码参考了机器学习实战),不适合全部贴出,但是博主乐于分享,有需要的话可以直接联系我,我会很乐意共享的,一希望大家能帮我校准文章的错误啦~~~ 首先用1500张手写数据进行训练,然后利用500张数字做测试,数据集大家可以搜手写数字识别数据集,网上很多,我过几天也会贴

xiaoxiao_wen的博客 7762

使用k-近邻算法识别手写数字。

在之前的文章中介绍了k-近邻算法的原理知识并且用Python实现了一个分类器,而且完成了一个简单的优化约会网站配对效果的实例。在《机器学习实战》中有关kNN的后一部分内容就是一个手写识别系统,可以识别手写的0-9的数字。下面就基于这一章的内容完成这样一个手写数字识别系统。案例的描述以及流程介绍。既然我们明白了kNN算法是根据计算新数据和样本数据集之间的距离,然后找到距离最小的样本的分类作为新数据的分

繁城落叶 2304

基于KNN算法实现手写数字识别

KNN算法是分类算法中最简单的一个算法了,关于这个算法的原理我就不做详细介绍了,这么简单的算法,究竟能不能用来准确的进行分类呢?其正确率又有多高呢? 带着一点怀疑,咱来进行这个实验,我们就用最简单的KNN算法来进行手写数字识别,编程语言是python 3。 首先讲一下思路,常规的机器学习算法大致有如下几个步骤: 1、收集数据 2、数据预处理 3、寻找一个function set 4、通过对数据进行...

吟游诗人——吟唱生命的不朽 3340

基于knn的手写数字识别

基于sklean的手写数字识别 分别用普通方式和调用sklean库

smilecom的博客 2290

利用knn算法在python中实现手写体数字识别

1.knn算法 knn算法的英文全称是k-NearestNeighbor翻译成中文为邻近算法。k代表的意思为k个最近的意思,意思是每个样本都可以用离它最近的k个值来表示,若k个值不统一则取出现频率最高的那个值来表示。 2.利用python实现knn算法的手写体数字识别 (1)准备训练数据 利用windows自带的绘图软件或其它软件写出若干手写体的数字,保存为图片格式并分好类别。接着利用以下代码将图...

qq_45019507的博客 1604

使用K近邻算法实现手写体识别系统

目录 1. 应用介绍 3 1.1实验环境介绍 3 1.2应用背景介绍 3 2. 数据来源及预处理 3 2.1数据来源及格式 3 2.2数据预处理 6 3. 算法设计与实现 7 3.1手写体识别系统算法实现过程 7 3.2 K近邻算法实现 7 3.3手写体识别系统实现 7 3.4算法改进与优化 8 4. 系统运行过程与结果展示 8 1.应用介绍 1.1实验环

不忘初心 方得始终 8877

OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字

K-最近邻 (k-nearest neighbours, KNN) 是监督学习中最简单的算法之一,KNN 可用于分类和回归问题。在本文中,将使用 KNN 分类器执行手写数字识别,从基础程序开始,并通过对其进行改进以提高其性能,以通过实例来探索更多 KNN 算法的可能性。

盼小辉丶的博客 2万+

机器学习入门-kNN算法实现手写数字识别

实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别,其中kNN算法是机器学习中入门的分类算法。其核心思想是将需要进行分类的目标放入已有充足样本的向量集中,求得与其距离最近的前k(自定超参数)个点,并返回这k个点中出现频率最高的类别,并将此类别作为模型的预测结果。 kNN算法 为了实现手写数字的分类,最重要的是取得分类算法 #kNN算法 def kNNclassi

Keiji582的博客 7049

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7826

K-近邻算法实现手写数字识别系统

K 近邻算法实现手写数字识别系统 实验内容 本实验将会从电影题材分类的例子入手,讲述 K 近邻算法的原理。在这之后,我们将会使用该算法实现手写数字识别系统。 课程来源 课程源自图灵教育的《机器学习实战》书籍第 2 章,感谢图灵教育授权实验楼发布。 实验知识点 K 近邻分类算法 从文本文件中解析和导入数据 使用 Matplotlib 创建扩散图 归一化数值 ...

森宝的博客 4607

告别臃肿!保姆级教程:用NTLite深度精简Win10,打造你的专属纯净系统(附完整组件移除清单)

本文提供了一份详细的NTLite教程,帮助用户深度精简Windows10系统,移除冗余组件并优化性能。从准备工作到组件移除清单,再到系统配置优化和无人值守安装,逐步指导用户打造专属纯净系统。附完整组件移除清单和实战经验,确保系统稳定高效运行。

weixin_30945039的博客 859

【AI大模型应用开发实战】大型语言模型评估指南白皮书(LLM Eval)

近年来,大型语言模型(LLM)在自然语言处理领域取得了重大进展,例如 GPT-3 和 Chat-GPT。这些模型经过大型数据集的训练,在文本相关任务中表现出卓越的能力,甚至超越了人类。本文将简要介绍如何验证 LLMs 性能的评估指标。自然语言处理(NLP)是人工智能的一个领域,涉及计算机和人类语言之间的交互。NLP 的基本任务之一是语言建模 (LM),它涉及构建统计模型来分析和生成自然语言。LM 已成为推进机器语言智能的关键方法,使机器能够执行机器翻译、情感分析和对话系统等任务。

AI天才研究院 1013
上一篇: K 近邻算法入门指南:明氏距离与皮尔森距离的基础讲解
下一篇: 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)—(十)(求解数学中特殊的数)
律己杂谈
博客等级 码龄12年 802粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

律己杂谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值