《机器学习》KNN算法实现手写数字识别

devtools/2024/12/28 10:48:51/

目录

 一、项目介绍

二、数据集介绍

三、需要解决的问题

四、代码实际展示

代码展示

实验结果

五、使用自己的数据进行测试

代码展示

结果展示

六、总结


 一、项目介绍

通过对一张2000*1000像素写满0-9手写数字的图片进行处理。分割出训练集和测试集使用KNN算法进行训练并且预测测试集的标签。

二、数据集介绍

数据集是一张2000*1000像素的图片,有50行100列手写数字,其中每个手写数字占20*20的像素。将图片对半分割,左侧50列作为训练集,右侧50列作为测试集。当模型建立好后也可以自己传入手写数字图片进行预测。

三、需要解决的问题

1、如何分割训练集以及测试集并将每个手写数字分割出来?

答:可以借助numpy库对图片进行分割

2、如何把得到的训练集以及测试集转换成能传入模型的数值?

答:可以将组成图像的二维数组展开为一行,这样就变成能传入模型的列表数据

3、如何给数据添加标签?

答:可以自己创建与样本数量相同的0-9的数字放在列表中作为标签

4、如何得到模型的正确率?

答:可以将模型输出的结果与测试集标签进行对比,查看相同结果占比

5、如何使用其他图片来验证模型?

答:可以用与样本大小相同的灰度图传入数据进行预测

四、代码实际展示

代码展示

import numpy as np
import cv2
from networkx.classes import neighbors
from sklearn.neighbors import KNeighborsClassifierimg_gray = cv2.imread(r'./data/num.png',0)# 将每张照片分割出来
# 列表推导式
cells = [np.hsplit(row,100) for row in np.vsplit(img_gray,50)]
# 列表推导式展开
# cells = []
# for row in np.vsplit(img_gray,50):
#     cells.append(np.hsplit(row, 100))# 将cells列表转换为数组
x = np.array(cells)
# 将前50列分割为训练集
train = x[:,:50]
# 将后50列分割为测试集
test = x[:,50:100]# 将每张图像展开为一行400列
train_new = train.reshape(-1,400).astype(np.float32)
test_new = test.reshape(-1,400).astype(np.float32)# 创建标签
k = np.arange(0,10)
labels = np.repeat(k,250)
# 创建训练集标签
train_labels = labels[:,np.newaxis]
# 创建测试标签
test_labels = labels[:,np.newaxis]# 创建KNN模型(为cv2库自带)
knn = cv2.ml.KNearest_create()
# 训练模型
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)
# 用测试集测试模型
ret,result,neigh,dist = knn.findNearest(test_new,k=3)
# 计算模型的正确率
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print('使用cv2准确率为:',accuracy)# 使用sklearn库自带的KNN库进行试验
knn1 = KNeighborsClassifier(n_neighbors=3)
knn1.fit(train_new,train_labels)
result1 = knn1.predict(test_new)
result1 = result1[:,np.newaxis]
matches = result1 == test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result1.size
print('使用sklearn准确率为:',accuracy)

实验结果

可见该模型的正确率还挺客观,但远远达不到预期结果。 

五、使用自己的数据进行测试

以下是本人自己写的几张20*20像素的手写数字图片

代码展示

import numpy as np
import cv2
from sklearn.neighbors import KNeighborsClassifierimg_gray = cv2.imread(r'./data/num.png',0)
# 读取自己的数据
img_2 = cv2.imread(r'./data/2.png',0).reshape(-1,400).astype(np.float32)
img_3 = cv2.imread(r'./data/3.png',0).reshape(-1,400).astype(np.float32)
img_5 = cv2.imread(r'./data/5.png',0).reshape(-1,400).astype(np.float32)
img_8 = cv2.imread(r'./data/8.png',0).reshape(-1,400).astype(np.float32)cells = [np.hsplit(row,100) for row in np.vsplit(img_gray,50)]
x = np.array(cells)
train = x[:,:50]
train = train.reshape(-1,400).astype(np.float32)# 将数据纵向合并
test = np.vstack((img_2,img_3,img_5,img_8))# 训练集标签
k = np.arange(0,10)
labels = np.repeat(k,250)
train_labels = labels[:,np.newaxis]
# 设置验证集标签
test_labels = [[2], [3], [5], [8]]# 创建KNN模型
Knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
Knn.fit(train,train_labels)
# 进行预测
result = Knn.predict(test)
result = result[:,np.newaxis]
# 计算正确率
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print('验证自写2、3、5、8正确率为:',accuracy)

结果展示

 

可见模型将数字8预测成了3 

六、总结

KNN算法机器学习的入门算法,所以对初学者来说能够熟练运用对以后的学习有很大意义。虽然模型的正确率不高但对训练模型的学习过程很重要。


http://www.ppmy.cn/devtools/146089.html

相关文章

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知,其PA9和PA10引脚分别为UART的TX和RX(注意:这个电路图是错误的,应该是PA9是X而PA9是RX,我们看下图的官方文件可以看出),那么接下来我们应该找到该引脚的定义是什么&#xf…

[银河麒麟] Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件, 目前已经覆盖了, windows,android, mac, linux 等操作系统。 Geogebra 官网 Geogebra 官网提供了 Geogebra 5.0 版本下载包, Linux Portable 双击 geogebra-portable…

基于自然语言处理(NLP)的智能客服系统

基于自然语言处理(NLP)的智能客服系统是现代客户服务领域的一项重要技术,它通过模拟人类对话的方式,为用户提供及时、准确和个性化的服务。以下是关于基于NLP的智能客服系统的一些关键要素和功能: 1. 自然语言理解&am…

无人机+自组网+通信指挥车:应急救援空地技术详解

“无人机自组网通信指挥车”这一组合在应急救援领域展现出了强大的空地协同能力,为救援行动提供了高效、实时的信息支持和指挥决策。以下是对这一应急救援空地技术的详细解析: 一、系统组成 1. 无人机 作为空中平台,无人机具备广阔的视野和…

通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤

1、什么是Ceph Ceph是一种开源、分布式存储系统,旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的,使得用户可以在无需特定硬件支持的前提下,通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…

Android 之 Activity 的启动模式(launchMode)

一、Activity 启动模式 在实际项目中&#xff0c;应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种&#xff0c;分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity&g…

【ETCD】【实操篇(十四)】etcd 集群备份与还原指南

etcd 是一个高可用的分布式键值存储&#xff0c;常用于分布式系统的配置共享和服务注册。本文将基于提供的启动脚本&#xff0c;详细讲解如何对 etcd 集群进行数据的备份与还原。 目录 一、启动 etcd 集群二、备份 etcd 数据1. 使用 etcdctl 保存快照2. 验证快照文件 三、还原 …

SQL 表连接操作

SQL 表连接操作是数据库查询中一个非常重要的概念&#xff0c;它允许从多个表中检索相关数据。表连接的主要类型包括 INNER JOIN、LEFT JOIN(或 LEFT OUTER JOIN)、RIGHT JOIN(或 RIGHT OUTER JOIN)、FULL JOIN(或 FULL OUTER JOIN)以及 CROSS JOIN。下面是详细解释每种连接操作…