利用knn算法实现手写数字分类

利用knn算法实现手写数字分类

  • 1.作者介绍
  • 2.KNN算法
    • 2.1KNN(K-Nearest Neighbors)算法核心思想
    • 2.2KNN算法的工作流程
    • 2.3优缺点
    • 2.4 KNN算法图示介绍
  • 3.实验过程
    • 3.1安装所需库
    • 3.2 MNIST数据集
    • 3.3 导入手写数字图像进行分类
    • 3.4 完整代码
    • 3.5 实验结果

1.作者介绍

王鹏飞,男,西安工程大学电子信息学院,2024级研究生
研究方向:机器视觉与人工智能
电子邮件:2018659934@QQ.com

王海博, 男 , 西安工程大学电子信息学院, 2024级研究生, 张宏伟人工智能课题组
研究方向:模式识别与人工智能
电子邮件:1137460680@qq.com

2.KNN算法

2.1KNN(K-Nearest Neighbors)算法核心思想

将训练数据保存下来,对于一个新的数据点,通过查看其在特征空间中最近的K个邻居来预测其类别或值。针对分类任务:如果K个邻居中多数属于某个类别,那么新数据点也被归为该类别。

2.2KNN算法的工作流程

(1) 数据准备
特征提取:将数据集中的每个样本表示为特征向量。
数据标准化:由于KNN依赖距离计算,因此需要对特征进行标准化(如归一化或Z分数标准化),以消除不同特征量纲的影响。

(2) 距离计算
对于一个新的数据点,计算它与数据集中每个点之间的距离。常用的距离度量方式包括:欧氏距离、曼哈顿距离和明可夫斯基距离。

(3) 确定最近邻
根据计算出的距离,找出与新数据点距离最近的K个点,这K个点称为“最近邻”。
K是一个超参数,需要根据具体问题选择合适的值。K值过小可能导致过拟合,K值过大可能导致模型过于平滑。

(4) 进行预测
分类任务:统计K个最近邻中每个类别的出现频率,选择出现次数最多的类别作为新数据点的预测类别。

2.3优缺点

(1) 优点
简单易实现:原理直观,实现代码简单。
无需训练:KNN不需要像其他算法那样进行复杂的训练过程,只需在预测时计算距离。
对复杂数据集表现良好:可以很好地处理多类别问题和非线性数据。
(2) 缺点
计算效率低:每次预测都需要计算新数据点与所有训练数据点之间的距离,计算量大。
存储需求高:需要存储整个训练数据集。
对K值和距离度量敏感:K值的选择和距离度量方式对模型性能影响较大。

2.4 KNN算法图示介绍

在这里插入图片描述
见上图所示,五角星为新输入的数据,原训练数据有Class A和Class B两类,对于新输入的数据,根据特征向量计算新输入数据点与训练集数据点之间的距离,根据所选K值确定出,新数据最邻近K个点,图示第一次k值选取为3时,其中Class B类占2/3,所以新数据将被分类为Class B类。
当k值选取为6时,见上图所示,Class A类占4/6,所以此时对于新数据点将被归为Class A类。由此可见K值的选择对于分类的结果存在一定的影响,因此k值的选择对于结果有重要的作用。

3.实验过程

3.1安装所需库

import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import cv2
from PIL import Image
import matplotlib.pyplot as plt

在编写代码前需要安装上述的库和所需的函数。

3.2 MNIST数据集

MNIST数据集来自美国国家标准与技术研究所。训练集由来自250个不同人手写的数字构成,测试集也是同样的手写数字数据,保证了测试集和训练集的作者集不相交。MNIST数据集一共有7万张图片,其中6万张是训练集,1万张是测试集。每张图片是28 × 28像素 的0 − 9的手写数字图片组成。每个图片是黑底白字的灰度图像。MNIST数据集可以导入fetch_openml函数从OpenML平台加载数据集。

3.3 导入手写数字图像进行分类

# 导入自定义图像并进行预测
def preprocess_image(image_path):image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)image = cv2.resize(image, (28, 28))image = cv2.bitwise_not(image)image = image.reshape(1, -1)image = scaler.transform(image)return image
def predict_image(image_path):image = preprocess_image(image_path)prediction = knn.predict(image)return prediction[0]
print("Testing custom image...")
image_path = "d:/wenjian/1.jpg"  #更改为自己的路径
prediction = predict_image(image_path)
print(f"Predicted digit: {prediction}")
# 显示图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image)
plt.imshow(image, cmap="gray")
plt.title(f"Predicted Digit: {prediction}")
plt.show()

导入一张白底黑字的手写数字图像,并对图像进行预处理使得格式和灰度值与其训练集相同,本次实验导入的是白底黑字的手写数字图像,因为距离计算是依据灰度图像的灰度值进行计算,训练集的图像是黑底白字的灰度图像,因此需要对灰度值进行反转,否则会造成预测误差较大。导入图像路径需更改为自己图像路径。

3.4 完整代码

import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import cv2
from PIL import Image
import matplotlib.pyplot as plt# 加载MNIST数据集
print("Loading MNIST dataset...")
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"]
y = y.astype(np.uint8)
# 数据预处理
print("Preprocessing data...")
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练KNN模型
print("Training KNN model...")
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 评估模型
print("Evaluating model...")
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
print(classification_report(y_test, y_pred))
# 导入自定义图像并进行预测
def preprocess_image(image_path):image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)image = cv2.resize(image, (28, 28))image = cv2.bitwise_not(image)image = image.reshape(1, -1)image = scaler.transform(image)return image
def predict_image(image_path):image = preprocess_image(image_path)prediction = knn.predict(image)return prediction[0]
print("Testing custom image...")
image_path = "d:/wenjian/1.jpg"  #更改为自己的路径
prediction = predict_image(image_path)
print(f"Predicted digit: {prediction}")
# 显示图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image)
plt.imshow(image, cmap="gray")
plt.title(f"Predicted Digit: {prediction}")
plt.show()

3.5 实验结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML中滚动加载的实现

设置div的overflow属性,可以使得该div具有滚动效果,下面以div中包含的是table来举例。 当table的元素较多,以至于超出div的显示范围的话,观察下该div元素的以下3个属性: clientHeight是div的显示高度,scrol…

ubuntu20.04系统没有WiFi图标解决方案_安装Intel网卡驱动

文章目录 1. wifi网卡配置1.1 安装intel官方网卡驱动backport1.1.1 第四步可能会出现问题 1.2 ubuntu官方的驱动1.3 重启 1. wifi网卡配置 我的电脑是华硕天选4(i7,4060),网卡型号intel ax201 ax211 ax210通用。 参考文章&#…

Anacoda进入自己的集成环境CLI中

鼠标左键单击那个"播放"图标,在弹出的菜单中选择"Open Terminal",即可进入。 还有一种是通过Scripts/active.bat文件的方式,是Windows下的方案,在当前目录下执行cmd,输入active切换Anacoda集成环…

设备健康管理系统是什么,设备健康管理系统多少钱?

想象一下,你的汽车在仪表盘报警前 3 天,手机就收到 “发动机轴承剩余寿命 1500 公里” 的提醒 —— 这就是 ** 设备健康管理系统(EHM)** 的日常。在制造业,设备故障每年造成全球 3.4 万亿美元损失,而 80% 的…

解锁智慧养老新可能,全面提升养老生活质量

在老龄化浪潮席卷全球的今天,如何让老年人的生活更加安全、便捷、丰富多彩,成为了我们共同的责任与追求。辉视智慧养老方案,正是这样一款以老年人需求为核心,集信息查询、活动参与、紧急对讲与安全保障于一体的智慧养老解决方案。…

Error: The project seems to require pnpm but it‘s not installed.

Error: The project seems to require pnpm but it‘s not installed 原因 该错误信息表明你的项目需要使用 pnpm 作为包管理工具,但系统中尚未安装 pnpm。 解决方法 【1】删除pnpm.lock 【2】npm install -g pnpm 之后再重新启动

Zabbix监控自动化(Zabbix Mnitoring Automation)

​​​​​​zabbix监控自动化 1、自动化监控(网络发现与自动注册只能用其一) 1.1 ansible安装zabbix agent 新采购100台服务器: 1、安装操作系统 2、初始化操作系统 3、安装zabbix agent 1.手动部暑 2.脚本部暑(shell expect) 3.ansible 4、纳入监控 1.…

JVM垃圾回收

1. Java垃圾回收机制 为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以,在Java语言中,有了自动的垃圾回收机制,也就是我们熟悉的GC(Garbage Collection)。有了垃圾回收机制后,程序员只…

jmeter--(吞吐量控制器)逻辑控制器

在 JMeter 中,吞吐量控制器(Throughput Controller) 是一种逻辑控制器,用于控制其子节点(请求、逻辑控制器等)的执行次数或百分比,从而调整测试计划的吞吐量。它通常用于模拟不同比例的用户行为…

SpringBoot3实战(SpringBoot3+Vue3基本增删改查、前后端通信交互、配置后端跨域请求、数据批量删除(超详细))(3)

目录 一、从0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分页查询的详细教程。(博客链接) 二、实现前端与后端通信对接数据。(axios工具) &#xff08;1&#xff09;安装axios。(vue工程目录) &#xff08;2&#xff09;封装请求工具类。(request.js) <1&…

Atom of Thoughts for Markov LLM Test-Time Scaling论文解读

近年来&#xff0c;大型语言模型在训练规模的扩展上取得了显著的性能提升。然而&#xff0c;随着模型规模和数据量的增长遇到瓶颈&#xff0c;测试时扩展&#xff08;test-time scaling&#xff09;成为进一步提升模型能力的新方向。传统的推理方法&#xff0c;如思维链&#x…

前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!

&#x1f680; 前端字段名和后端不一致&#xff1f;解锁 JSON 映射的“隐藏规则” &#x1f31f; 嘿&#xff0c;技术冒险家们&#xff01;&#x1f44b; 今天我们要聊一个开发中常见的“坑”&#xff1a;前端传来的 JSON 参数字段名和后端对象字段名不一致&#xff0c;会发生…

AI训练如何获取海量数据,论平台的重要性

引言&#xff1a;数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天&#xff0c;数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法&#xff0c;还是开发自动驾驶系统&#xff0c;都需要海量、多样化的数据支持。 然而&#xff0c;获…

k8s的存储

一 configmap 1.1 configmap的功能 configMap用于保存配置数据&#xff0c;以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用…

递归、搜索与回溯第三讲:综合练习

递归、搜索与回溯第三讲&#xff1a;综合练习 1.找出所有子集的异或总和再求和2.全排列3.电话号码的字母组合4.组合5.目标和6.组合总和7.字母大小写全排列8.优美的排列9.N皇后10.有效的数独11.括号生成12.解数独13.单词搜索14.黄金矿工15.不同路径III 有决策树的递归总结&#…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用&#xff08;查找目标&#xff0c;查找范围&#xff08;F4 绝对引用&#xff09;&#xff0c;返回值的所在列数&#xff0c;精确查找或模糊查找&#xff09;双击填充柄就会显示所有值 这个逗号要中文的不能英…

AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命

摘要 AI正深度重构工程设计、施工与总承包行业&#xff0c;推动从传统经验驱动向数据智能驱动的转型。本文系统性解析AI当前在智能优化设计、施工过程管理、全生命周期数字孪生等场景的应用&#xff0c;展望未来AI在自动化决策、跨域协同等领域的潜力&#xff0c;并从投入产出…

Java高频面试之集合-15

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;解决哈希冲突有哪些方法&#xff1f; 1. 开放寻址法&#xff08;Open Addressing&#xff09; 核心思想&#xff1a;当哈…

vulhub Matrix-Breakout

1.下载靶机&#xff0c;打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找&#xff0c;可能是因为我们的字典太小了&#xff0c;我们换个扫描器换个字典试下,利用kali自带的最大…

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…