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

通过knn算法实现识别数字

项目要求

导入一张包含5000个0-9的手写数字,通过knn算法训练模型识别出新导入的数字。

代码实现

import numpy as np
import cv2
from sklearn.neighbors import KNeighborsClassifier
img = cv2.imread('digits.png') # 导入训练的模型所需要的图片
img1 = cv2.imread('5.png')
grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 将图片转换为灰度图
grey1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
new = np.array(grey1) # 转换为矩阵
new = new.reshape(1,400).astype(np.float32)
cells = [np.hsplit(i,100) for i in np.vsplit(grey,50)] # 将矩阵中进行水平切割50次,垂直切割100次即分隔成5000份数据
a = np.array(cells)
train = a[:,:50] # 将2500份划分为测试集
test = a[:,50:100] # 将另外2500份数据划分为训练集
train_new = train.reshape(-1,400).astype(np.float32) # 将所有数据转化为包含2500个1行400列数据的二维矩阵
test_new = test.reshape(-1,400).astype(np.float32)
'''添加结果y'''
k = np.arange(10)
labels = np.repeat(k,250)
train_labels = labels[:,np.newaxis]
test_labels = np.repeat(k,250)[:,np.newaxis]
'''使用sklearn库训练模型'''
knn = KNeighborsClassifier(n_neighbors=3) # 设置k值为3
knn.fit(train_new,train_labels)     # 开始训练模型
test_predict = knn.predict(test_new) # 预测训练结果
score=knn.score(test_new,test_labels) # 获取准确率
print('准确率为{}'.format(score))
new_predict = knn.predict(new)  
print('识别为{}'.format(new_predict))

 导入的图片:

新导入的数字图片:

输出结果为:

准确率为0.9164
识别为[2]

注意事项

运行此代码需要安装以下 Python 库:

  • numpy
  • matplotlib
  • scikit-learn
  • opencv-python

 KNN 算法的性能受 k 值影响较大,一般来说,较小的 k 值可能导致过拟合,较大的 k 值可能导致欠拟合。通过测试不同的 k 值,我们可以找到在当前数据集上表现最佳的参数。所有可以通过多次改变k值找到能够获取最高准确率的最佳k值。

此代码包含以下步骤:数据加载与预处理、KNN 模型训练与预测、模型评估、结果可视化、参数优化。

http://www.dtcms.com/a/301430.html

相关文章:

  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——5.4 计算预订订单数量和总金额 (Calculating booked orders)
  • nacos连接失败,启动失败常见问题
  • OpenCV-图像预处理③【图像梯度计算、边缘检测算法(如 Canny)、轮廓提取与分析、凸包特征检测,以及 轮廓的外接几何特征(如最小外接矩形、外接圆等)】
  • 硅基计划3.0 学习总结 肆 二叉树 初版
  • [每周一更]-(第148期):使用 Go 进行网页抓取:Colly 与 Goquery 的对比与思路
  • QT---概览
  • 优化Linux高并发:文件描述符与端口范围的协同调优
  • SPSC无锁环形队列技术(C++)
  • FreeRTOS—空闲任务
  • 【Python系列】Flask 应用中的主动垃圾回收
  • idea打开后project窗口未显示项目名称的解决方案
  • LangGraph快速入门项目部署
  • C++ 中实现 `Task::WhenAll` 和 `Task::WhenAny` 的两种方案
  • 从0搭建YOLO目标检测系统:实战项目+完整流程+界面开发(附源码)
  • jenkins只能运行2个任务,提示:“等待下一个可用的执行器”
  • Redis C++客户端——命令使用
  • 实战演练1:实战演练之命名实体识别
  • Docker 的数据持久化-数据卷
  • (AC)架子鼓
  • 基于Java的KTV点歌系统的设计与实现
  • 【CF】Day112——杂题 (逆向思维 | 二分 + 贪心 | 单调队列优化DP | 二进制 + 前缀和 | 二分图判断 | 暴力枚举)
  • JavaEE--3.多线程
  • python-装饰器
  • 【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
  • QT6 源,七章对话框与多窗体(15)多文档 MDI 窗体 QMdiArea 篇一:属性,公共成员函数,信号与槽函数
  • 多智能体架构
  • 《计算机组成原理与汇编语言程序设计》实验报告四 Debug及指令测试
  • setnonblocking函数用途和使用案例
  • 在本地环境中运行 ‘dom-distiller‘ GitHub 库的完整指南
  • OSPF路由协议 多区域