当前位置: 首页 > news >正文

机器学习(2)-- KNN算法之手写数字识别

KNN算法

KNN(K-Nearest Neighbor,K最近邻)算法是一种用于分类和回归的非参数统计方法,尤其在分类问题中表现出色。在手写数字识别领域,KNN算法通过比较测试样本与训练样本之间的距离,找到最近的K个邻居,并根据这些邻居的类别来预测测试样本的类别。

接下来,让我们详细了解了解,knn怎么进行手写数字识别:

数字识别

对于数字识别我们进行三个方面来完成它:

  1. 训练模型:得到模型
  2. 测试模型:测试模型识别的准确率
  3. 测试新的数据:查看实用效果

训练模型

  1. 收集数据

在这里插入图片描述

  1. 读取图片数据

使用opencv处理图片,将图片的像素数值读取进来,并返回的是一个三维(高,宽,颜色)numpy数组

 pip install opencv-python==3.4.11.45
import cv2
img = cv2.imread("digits.png")
  1. 转化灰度图

将图片转化为灰度图,从而让三维数组变成二位的数组:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  1. 处理图像

对图片进行处理:将其先垂直切分(横向)成50份,再将每一份水平切分(竖向)成100份,这样我们的每份图片的像素值都为20*20(训练的图片比较规范)共500个,比如:

在这里插入图片描述

cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)] #列表生成式
  1. 装进array数组

将切分的每一份图片像素数据都装进array数组中:

x = np.array(cells)
  1. 分隔数据

将数据竖着分隔一半,一半作为训练集,一般作为测试集:

train = x[:,:50]
test = x[:,50:100]
  1. 调整数据结构

由于我们最后要将数据放在KNN算法中训练,我们得将数据结构调整为适合KNN算法训练的结构,KNN要求输入的数据为二维数组,那么我们就来改变每份图片数组的维度:reshape:

train_new = train.reshape(-1,400).astype(np.float32)
  1. 分配标签

我们训练着那么多的数据,却没有给他们具体的类别标签(图像的实际值),因为我们之前的图像处理都是在寻找图像特征,但是并没有给他们一个具体对应的类别,只有空荡荡的特征,无法分类,所以我们得给切分的每份图片打上它们对应的标签:

#repeat用于重复数组中数值,此处重复250次,因为训练集中表示每个类别的图片只有250个,要将它们一一对应打上标签
#np.newaxis用于在数组中创建一个新的维度,即将每个标签单独放
#原本[00000……1111……] ----> [[0][0]……[1][1]……]
k = np.arange(10)
train_mark = np.repeat(k,250)[:,np.newaxis]
  1. 训练模型

在训练时,将训练集与标签一一对应训练:

#通过cv2创建一个knn模型
knn = cv2.ml.KNearest_create()
#cv2.ml.ROW_SAMPLE:告诉opencv将训练的数据与类别按行一一对应训练
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_mark)

这样我们就训练好的这份简单的数据内容,训练了一个可以识别数字0~9的模型,模型训练完了,我们总得知道它到底能不能识别数字吧?识别数字成功的准确率能达到多少呢?

测试模型

  1. 评估性能:测试模型帮助评估模型的准确性、效率、鲁棒性和其他性能指标。
  2. 识别问题:通过测试,可以及早发现和定位模型或产品中的缺陷、错误或不足之处。
  3. 优化和改进:测试模型提供的数据和反馈是优化和改进模型或产品的关键依据。基于测试结果,可以调整模型参数、改进算法设计、优化系统架构等,以提升模型或产品的性能和质量。

那么我们来测试我们刚刚训练出的模型:

前面说了,图片中的数据一半作为训练集,一半作为测试集,将测试集数据也进行以上操作:

test_new = test.reshape(-1,400).astype(np.float32) #调整数据结构
test_labels = np.repeat(k,250)[:,np.newaxis] #分配标签

处理好测试集的数据之后,我们来测试模型:

#将测试集放入模型测试
ret,result,neighbours,dist = knn.findNearest(test_new,k=3)#ret:表示操作是否成功#result:表示测试样本的预测标签(浮点数组)#neighbours:表示与测试样本最近的k个邻居的索引(整数数组)#dist:表示测试样本与每个最近邻居之间的距离(浮点数组)
#通过测试集校验准确率
matches = result==test_labels #将模型对测试集的预测结果(result)与实际的测试标签(test_labels)进行比较。
correct = np.count_nonzero(matches) #计算 matches 数组中 True(即正确预测)的数量
accuracy = correct*100.0/result.size #result.size 返回 result 数组中的元素总数
print("当前准确率为:",accuracy)

模型测试完成后,我们要尝试它在实际中的使用效果,查看其实用性。

测试新的数据

在画图软件中,画几个像素值20*20的图片,让其进入模型看看测试结果:比如:

在这里插入图片描述

这个测试数据已经进行了一部分的处理:

#处理图片
try_img = cv2.imread("4.png")  #读取图片
try_gray = cv2.cvtColor(try_img,cv2.COLOR_BGR2GRAY) #转为灰度图,二维
z = np.array(try_gray) #装入二维数组
try_new = z.reshape(-1,400).astype(np.float32) #调整结构,适用于KNN
#测试结果
ret,result,neighbours,dist = knn.findNearest(try_new,k=3)
print(result)  #查看测试结果,显示分类类别
------------------
[[4.]]  #测试结果正确

总结

本篇介绍了如何使用KNN算法进行手写数字识别:

  1. 训练模型:收集数据 – 读取图片数据 – 转化灰度图 – 处理图像 – 装进array数组 – 调整数据结构 – 分配标签 – 训练模型

  2. 测试模型:评估性能 – 识别问题 – 优化和改进

  3. 测试数据:查看实用性

相关文章:

机器学习(2)-- KNN算法之手写数字识别

KNN算法 KNN(K-Nearest Neighbor,K最近邻)算法是一种用于分类和回归的非参数统计方法,尤其在分类问题中表现出色。在手写数字识别领域,KNN算法通过比较测试样本与训练样本之间的距离,找到最近的K个邻居&am…...

【机器人】关于钉钉机器人如何进行自定义开发问答【详细清晰】

目标:当用户输入问题并钉钉机器人,钉钉机器人进行相应的回答,达到一种交互问答的效果 开发文档参考:https://open.dingtalk.com/document/orgapp/robot-overview 首先进行登录企业,后面如果没有进行登录,会…...

Qt:exit,quit,close的用法及区别

前言 虽然能从单词的字面意思大致理解这些函数的意思,但是总感觉不出来它们的区别以及用法,特地去研究一下 正文 在 Qt 中,quit、exit 和 close 都是用于终止程序或关闭窗口的方法 1. QApplication::quit() 注意:注意quit() …...

Linux——进程地址空间

前言 在操作系统中&#xff0c;内存分为以下几个区域&#xff0c;从下往上按照从小到大排列 一、程序地址的分布 代码 #include <stdio.h> #include <stdlib.h> int noval; int val 1;int main(int argc,char*argv[],char*env[]){printf("code addr %p\n&q…...

信创(国产化)方案

信创 信创,即信息技术应用创新,旨在实现信息技术自主可控openEuler openEuler是一款开源、免费的操作系统,由openEuler社区运作,前身为运行在华为公司通用服务器上的操作系统EulerOS。openEuler作为一款开源、免费的操作系统,由开放原子开源基金会(OpenAtom Foundation)…...

EasyRecovery17中文版永久汉化版电脑数据恢复工具下载

&#x1f388;&#x1f389;安利时间到&#xff01;今天要跟大家分享的是——EasyRecovery17中文版的最新功能&#xff01;&#x1f389;&#x1f388; &#x1f31f;✨ “数据恢复小能手” ✨&#x1f31f; 让我来介绍一下这款软件的主打特点。 EasyRecovery17中文版是一款强…...

Cesium倾斜相机视角观察物体

先看效果&#xff1a; 在cesium中&#xff0c;我们有时需要倾斜相机视角去观察物体&#xff0c;如相机俯视45观察物体。 cesium的api提供了倾斜相机视角的配置&#xff0c;但是直接使用cesium的api不能达到我们想要的效果。 函数如下&#xff1a; function flyToBox() {let l…...

C/C++开发---全篇

1、统筹 学习目标&#xff1a; C/C、python精通。 就业匹配方向&#xff1a;专精一个领域&#xff0c;延长职业生涯。 &#xff08;1&#xff09;适配行业&#xff1b; &#xff08;2&#xff09;量化&#xff1b; &#xff08;3&#xff09;安全&#xff1b; &#xff08;4&…...

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论&#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么&#xff1a;activity是什么时候被创建的&…...

WPS真题题库导入刷题小程序:百思考个人使用经验分享

这篇文章的诞生&#xff0c;是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅&#xff01; WPS的分值&#xff1a; 单项选择题20分(含公共基础知识部分10分)。 WPS处理文字文档操作题30分。 WPS处理电子表格操作题30分。 …...

拯救者双系统问题 Verifiying shim SBAT data failed: Security Policy Violation

Verifiying shim SBAT data failed: Security Policy Violation Something has gone seriously wrong: SBAT self-check failed: Security Policy Violation windows更新的问题 https://forums.linuxmint.com/viewtopic.php?t427297 https://github.com/Metabolix/HackBGRT/…...

ThreeJs学习笔记--坐标系,光源,相机控件

坐标系 一、创建添加坐标系 给场景添加坐标系THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸 const axesHelper new THREE.AxesHelper(200)//数值是坐标的尺寸 scene.add(axesHelper)//添加到场景里 坐标系包含三个坐标轴&…...

基于 Android studio 实现停车场管理系统--原创

目录 一、项目演示 二、开发环境 三、项目页面 四、项目详情 五、项目完整源码 一、项目演示 二、开发环境 三、项目详情 1.启动页 这段代码是一个简单的Android应用程序启动活动&#xff08;Activity&#xff09;&#xff0c;具体功能如下&#xff1a; 1. **延迟进入登…...

8 个最佳 Java IDE 和文本编辑器

从 2024 年使用的最佳 Java IDE 和代码编辑器中进行选择&#xff0c;并提高您的 Java 生产力。 Java 是世界上最流行的编程语言之一&#xff0c;于 1995 年首次推出&#xff0c;它确实践行了“编写一个&#xff0c;随处运行”的座右铭。该语言用途广泛&#xff0c;可用于构建从…...

【2024最新版版】PyCharm安装教程

简介 由于Python语法简单容易入门&#xff0c;并且Python在办公自动化等领域的功能非常强大&#xff0c;所以现在越来越多非IT行业的人也开始学起了Python&#xff0c;要学习和使用一门编程语言&#xff0c;一个好用的IDE是必不可少的&#xff0c;而对于Python来说&#xff0c…...

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?

作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满&#xff0c;几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代&#xff0c;AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现&#xff0c;同样值得业界关注&…...

Java进阶篇之包的概念及其应用

引言 在前面的文章中&#xff0c;我们介绍了抽象类和抽象方法&#xff08;Java进阶篇之抽象类和抽象方法&#xff09;&#xff0c;在Java编程中&#xff0c;包&#xff08;Package&#xff09;是管理类和接口的重要工具。包不仅提供了一种层次化的命名空间机制&#xff0c;还可…...

短剧出海,赚钱新途径,掌握海外短剧CPS分销的秘诀

国内短剧发展的如日中天&#xff0c;需要的资质也是越来越严格&#xff0c;不少人已经将目标瞄向海外短剧市场&#xff0c;海外短剧这块相对来说并没有那么严格&#xff0c;但很多人在海外推广的道路上举步维艰&#xff0c;推广异常困难&#xff0c;重点讲下目前海外短剧的推广…...

uniapp小程序openid和unionId

1. openid 1. 用户的openid在小程序中的固定不变的&#xff1b; 2. 用户在不同的小程序里的openid是不一样的&#xff1b; 3. 只要appid不变&#xff0c;openid就不变。 获取openid 1. 使用uni.login获取code 2. 使用code调接口换取 用户唯一标识 OpenID 、 用户在微信开放平台…...

前端工程化-04.Vue项目简介

一.Vue项目-创建 1.使用如图两种方式创建Vue项目 2.在此创建新项目 点击创建项目 创建成功&#xff01; 二.Vue项目-目录结构 三.Vue项目-运行 启动后直接在下方找到连接端口 成功启动项目 这个项目即为Vue中的自带项目Vue.app。修改其中的Home为Vue Home。ctals保存发…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...