机器学习之 K 近邻算法图像识别实战

news2024/9/24 11:26:39

引言

在机器学习领域,K 近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,它可以根据样本之间的距离来进行分类或回归。本文将介绍如何使用 KNN 算法进行手写数字识别,并通过一个实际的例子来演示整个过程。

K 近邻算法简介

K 近邻算法的工作原理非常直观:给定一个训练数据集,对于每一个待分类的对象,找出特征空间中最接近它的 K 个训练样本,这 K 个样本的多数类别决定了待分类对象的类别。

  • 距离度量:通常使用欧氏距离作为相似性度量。
  • K 的选择:K 的值决定了分类的灵活性,较小的 K 值使得分类更加敏感,较大的 K 值则更加稳健。

实战案例:手写数字识别

准备数据

我们使用一个包含手写数字的数据集。数据集中的每个数字都已经被分割成了大小为 20x20 的图像块。

数据加载与预处理
import numpy as np
import cv2

# 读取训练图像并转换为灰度图像
img = cv2.imread('df1e4aba824b59187b50474c839c6c3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 将训练图像分割成小图像块
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]
x = np.array(cells)

# 分割训练集和测试集
train = x[:, :50]
test = x[:, 50:100]

# 将训练集和测试集的小图像块展平为一维数组,并转换为浮点型数据
train_new = train.reshape(-1, 400).astype(np.float32)
test_new = test.reshape(-1, 400).astype(np.float32)

# 创建标签
k = np.arange(10)
labels = np.repeat(k, 250)
train_labels = labels[:, np.newaxis]
test_labels = np.repeat(k, 250)[:, np.newaxis]

我们可以通过调试来查看每一行代码的执行情况,例如:

创建 K 近邻分类器并训练

然后我们开始创建K近邻分类器训练

# 创建 K 近邻分类器并训练
knn = cv2.ml.KNearest_create()
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)

# 使用测试数据进行预测
ret, result, neighbours, dist = knn.findNearest(test_new, k=5)

# 计算准确率
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct * 100.0 / result.size
print('当前识别KNN识别手写数字的准确率为:', accuracy)

这里的k值可以调整,当k值是5的时候, KNN识别手写数字的准确率为91.76%

导入新图像并进行预测

训练并测试好模型后我们自己导入一张20*20像素的手写图片来测试看看,我们可以使用画图工具来画一个

 如何读取文件按照上面代码的方法进行操作:

# 读取新图像
new_img = cv2.imread('8.png')

# 将新图像转换为灰度图像
new_gray = cv2.cvtColor(new_img, cv2.COLOR_BGR2GRAY)

# 将新图像展平为一维数组,并转换为浮点型数据
new_test = new_gray.reshape(-1, 400).astype(np.float32)

# 使用训练好的 K 近邻分类器进行预测
ret, result, neighbours, dist = knn.findNearest(new_test, k=5)

# 输出预测结果
print("预测的数字为:", result)

最后预测的结果是1

 

结论

以上就是全部内容,通过本文的介绍,我们了解了 K 近邻算法的基本原理,并通过一个实际的手写数字识别案例展示了如何使用 KNN 进行图像分类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPU纹理压缩格式(详解ETC1)

参考 纹理压缩格式原理概述: 你所需要了解的几种纹理压缩格式原理Compressed GPU texture formats – a review and compute shader decoders – part 1 ETC1格式:ETC1压缩纹理格式详解 ETC1 将4x4像素(16RGB8位共384位,48字…

ChatGPT下的Java代码审计

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

爬虫:scrapy基本使用:链家实例

scrapy基本使用 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。 安…

【原创】java+swing+mysql的KTV管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景: 随着社会的发展…

语义分割:YOLOv5的分割模型训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、环境搭建二、构建数据集三、修改配置文件①数据集文件配置②权重下载③模型文件配置④训练参数配置 四、模型训练和测试模型训练模型测试 总结 前言 提示:本文是YOLOv5的分割模型训练自己数据集的记录教程,在调试前需要本地已配置好CU…

测试资料1111

什么是软件 软件是控制计算机硬件工作的工具 软件产生过程 需求产生(客户、用户)、需求文档(需求文档)、设计效果图(UI设计师)、产品开发(研发人员)、产品测试(测试人…

multiple definition of `xxxx`问题解决(vscode开发stm32)

一、背景 开发时遇到如下问题: 在Tim.h文件夹中定义了一个结构体变量 TIM_HandleTypeDef htim2;//定时器实例变量 其余的文件在引用此变量时都加上了#include "Tim.h" 但编译时,终端报错: multiple definition of htim2 全局搜…

hs_err_pid.log分析

hs_err_pid.log 文件是 Java 虚拟机(JVM)在遇到致命错误(如崩溃或内部错误)时生成的错误日志文件。这个文件包含了关于崩溃的详细信息,可以帮助开发者或系统管理员诊断和解决问题。 hs_err_pid.log文件位置和命名 文…

maven导入依赖后依然爆红?

今天遇到了maven导入依赖后依然爆红的问题,检查了本地仓库发现依赖包已经全有了但是IDEA这边的XML文件里面依然大量爆红;并且我重新将之前的本地仓库相关的依赖包甚至其上级目录进行了删除后重新导入,但问题依然没有解决;因此我非…

【大模拟】逻辑回环类

区块链 AcWing 3285. 区块链 - AcWing 区块链涉及密码学、哈希算法、拜占庭问题、共识算法、故障模型、网络模型等诸多知识,也在金融等领域有广泛的应用。 本题中,我们需要实现一个简单的区块链系统。 在一个分布式网络中,有 nn 个节点通…

最新软件库系统源码/ 免服务器源码/带后台功能/使用链接上传或服务器存储

源码简介: 最新软件库系统源码,它是免服务器的,而且带后台,实现超级管理动态发布,会员系统卡密系统充值的后台功能。注册用户的软件投稿,可以使用链接上传,或者服务器存储。 它带有后台功能&a…

Springboot 整合 Swagger3(springdoc-openapi)

使用springdoc-openapi这个库来生成swagger的api文档 官方Github仓库: https://github.com/springdoc/springdoc-openapi 官网地址:https://springdoc.org 目录题 1. 引入依赖2. 拦截器设置3. 访问接口页面3.1 添加配置项,使得访问路径变短…

饮水机功能构建指导思想以及最小试验

饮水机功能构建指导思想以及最小试验 引言 我们饮水机, 其实就只有两个必须使用的功能, 一个是控制加热, 一个是控制放水, 我们现在就可以直接实现这两个功能. 我们使用stm32单片机, 直接控制两个io口的高低电平, 通过继电器, 就可以控制大电流设备的开关. 没错这就已经结束了…

时间序列预测 | CEEMDAN+CNN+Transformer多变量时间序列预测(Python)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时间序列预测 | CEEMDANCNNTransformer多变量时间序列预测(Python) 时间序列预测 创新点 多尺度特征提取:CEEMDAN将复杂的时间序列分解成多个IMFs,使得CNN和Transforme…

【TVM 教程】在 Adreno™ 上部署预训练模型

本文是一个逐步教程,演示如何在 Adreno 上(不同精度)部署预训练的 PyTorch ResNet-18 模型。 首先,我们需要安装 PyTorch 与 TorchVision,因为我们将使用它作为我们的模型库。 可以通过 pip 快速安装: p…

【Linux】Linux环境基础开发工具使用之Linux编译器-gcc/g++使用

目录 一、编译过程二、gcc/g如何完成三、error: for loop initial declarations are only allowed in C99 mode 的解决方法四、预处理五、编译六、汇编七、链接八、数据库8.1 动态库8.2 静态库8.3 动/静态链接的优缺点 结尾 一、编译过程 预处理(头文件的展开、宏替…

计算机网络12——IM聊天系统——项目分析和架构搭建

1、IM——聊天系统主要功能 (1)注册 根据:昵称,手机号,密码 (2)登录 根据:手机号,密码 (3)添加好友 根据:昵称 (4&…

【IR】Counterfactual Explainer on Graphs

图神经网络的反事实解释:最新文章略读 Survey [ 5 ] ^{[5]} [5]CFAD [ 1 ] ^{[1]} [1]CAF [ 3 ] ^{[3]} [3]GCFExplainer [ 2 ] ^{[2]} [2]CFE [ 4 ] ^{[4]} [4]RCExplainer [ 6 ] ^{[6]} [6]CF-GNNExplainer [ 7 ] ^{[7]} [7]Ref Survey [ 5 ] ^{[5]} [5] NeurIP…

Ubuntu24.04使用SRS 搭建 RTMP流媒体服务器

一、简介 SRS(Simple Realtime Server)是一个简单高效的实时视频服务器, 是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群。支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28…

基于html5的网上团购系统设计与实现

TOC springboot301基于html5的网上团购系统设计与实现 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代,也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端,也就是电脑互联网时…