利用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.mzph.cn/bicheng/74276.shtml

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

相关文章

C语言-适配器模式详解与实践

文章目录 C语言适配器模式详解与实践1. 什么是适配器模式?2. 为什么需要适配器模式?3. 实际应用场景4. 代码实现4.1 UML 关系图4.2 头文件 (sensor_adapter.h)4.3 实现文件 (sensor_adapter.c)4.4 使用示例 (main.c) 5. 代码分析5.1 关键设计点5.2 实现特…

Rust函数、条件语句、循环

文章目录 函数**语句与表达式**条件语句循环 函数 Rust的函数基本形式是这样的 fn a_func(a: i32) -> i32 {}函数名是蛇形风格,rust不在意函数的声明顺序,只需要有声明即可 函数参数必须声明参数名称和类型 语句与表达式 这是rust非常重要的基础…

maptalks图层交互 - 模拟 Tooltip

maptalks图层交互 - 模拟 Tooltip 图层交互-模拟tooltip官方文档 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>图层交互 - 模拟 Tooltip</title><style typet…

好吧好吧,看一下达梦的模式与用户的关系

单凭个人感觉&#xff0c;模式在达梦中属于逻辑对象合集&#xff0c;回头再看资料 应该是一个用户可以对应多个模式 问题来了&#xff0c;模式的ID和用户的ID一样吗&#xff1f; 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

python socket模块学习记录

python黑马程序员 通过python内置socket模块&#xff0c;在电脑本地开发一个服务器&#xff0c;一个客户端&#xff0c;连接后进行连续的聊天。服务器和客户端均可输入exit&#xff0c;主动退出连接。 服务器开发.py import socket# 创建Socket对象 socket_server socket.s…

7-2 sdut-C语言实验-逆序建立链表

7-2 sdut-C语言实验-逆序建立链表 分数 20 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 输入整数个数N&#xff0c;再输入N个整数&#xff0c;按照这些整数输入的相反顺序建立单链表&#xff0c;并依次遍历输出单链表的数据。 输入格式: 第一行输入整数N;&#xff…

针对永磁电机(PMM)的d轴和q轴电流,考虑交叉耦合补偿,设计P1控制器并推导出相应的传递函数

电流控制回路:针对永磁电机(PMM)的d轴和q轴电流&#xff0c;考虑交叉耦合补偿&#xff0c;设计P1控制器并推导出相应的传递函数。 1. 永磁电机&#xff08;PMM&#xff09;的数学模型 在同步旋转坐标系&#xff08; d − q d - q d−q 坐标系&#xff09;下&#xff0c;永磁同…

ROS多机通信(四)——Ubuntu 网卡 Mesh 模式配置指南

引言 使用Ad-hoc加路由协议和直接Mesh模式配置网卡实现的网络结构是一样的&#xff0c;主要是看应用选择&#xff0c; Ad-Hoc模式 B.A.T.M.A.N. / OLSR 优点&#xff1a;灵活性高&#xff0c;适合移动性强或需要优化的复杂网络。 缺点&#xff1a;配置复杂&#xff0c;需手动…

chap1:统计学习方法概论

第1章 统计学习方法概论 文章目录 第1章 统计学习方法概论前言章节目录导读 实现统计学习方法的步骤统计学习分类基本分类监督学习无监督学习强化学习 按模型分类概率模型与非概率模型 按算法分类按技巧分类贝叶斯学习核方法 统计学习方法三要素模型模型是什么? 策略损失函数与…

爬虫案例-爬取某站视频

文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤&#xff1a; 1.下载 FFmpeg&#xff1a; 2.访问 FFmpeg 官网。 3.选择 Wi…

车载以太网网络测试-22【传输层-DOIP协议-5】

目录 1 摘要2 DoIP时间参数2.1 ISO 13400定义的时间参数2.2 参数示例 3 DoIP节点内部状态机4 UDSonIP概述5 总结 1 摘要 本文继续对DOIP协议进行介绍&#xff0c;主要是DOIP相关的时间参数、时间参数定义以及流程示例。推荐大家对上文专题进行回顾&#xff0c;有利于系统性学习…

(论文总结)思维链激发LLM推理能力

研究背景&动机 背景:扩大模型规模已被证实具有提升模型性能和模型效率的功效&#xff0c;但是LLM对于完成推理、算术任务仍有较大不足。 动机:从之前的应用和研究中得知&#xff0c;可以用生成自然语言解释、使用神经符号等形式语言的方法来提高大模型的算术推理能力&…

前后端开发概述:架构、技术栈与未来趋势

一、前后端开发的基本概念 1.1 什么是前后端开发&#xff1f; 前后端开发是 Web 开发的两个核心部分&#xff0c;各自承担不同的职责&#xff1a; 前端&#xff08;Frontend&#xff09; 负责网页的用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;…

anythingLLM结合searXNG实现联网搜索

1、docker-compose 部署searXNG GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker. cd /usr/local git clone https://github.com/searxng/searxng-docker.git cd searxng-docker 2、修改 .env文件 # By default…

人形机器人科普

人形机器人&#xff08;Humanoid Robot&#xff09;是一种模仿人类外形和行为的机器人&#xff0c;通常具有头部、躯干、双臂和双腿等结构。它们的设计目标是与人类环境无缝交互&#xff0c;执行复杂的任务&#xff0c;甚至在某些领域替代人类工作。 1. 人形机器人的定义与特点…

【CICD】Ansible知识库

一、主机清单配置 1. 配置文件路径 默认路径 /etc/ansible/hosts 这是 Ansible 的全局默认库存文件路径&#xff0c;但许多用户可能不会直接使用它。项目目录或自定义路径 用户通常会为不同项目创建独立的库存文件&#xff0c;例如&#xff1a; 当前目录下的 hosts、inventor…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List的基本使用方法 List组件的构建声明是这个样子的 List(value?: {space?:number | string, initial…

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…

【yolo】YOLO训练参数输入之模型输入尺寸

模型输入尺寸是YOLO训练和推理过程中非常重要的参数之一。YOLO要求输入图像的尺寸是固定的&#xff0c;通常为正方形&#xff08;如416416、640640等&#xff09;。这个尺寸直接影响模型的性能和速度。以下是对模型输入尺寸的详细介绍&#xff1a; 1. 模型输入尺寸的作用 统一…

【TI MSPM0】Timer学习

一、计数器 加法计数器&#xff1a;每进入一个脉冲&#xff0c;就加一减法计算器&#xff1a;每进入一个脉冲&#xff0c;就减一 当计数器减到0&#xff0c;触发中断 1.最短计时时间 当时钟周期为1khz时&#xff0c;最短计时时间为1ms&#xff0c;最长计时时间为65535ms 当时…