KNN_识别图片数字

1.实验过程省略灰度化处理过程,用已经处理好的txt数据进行训练

                         3.jpg

bb4f30a96c2e4b89a9c892be989a97d1.png

from PIL import Image
def imgtotxt(imgfile,txtfile,size = (32,32)):image_file = Image.open(imgfile).resize(size,Image.LANCZOS).convert('L')width,height = image_file.sizef = open(txtfile,'w')ascii_char = '10'for i in range(height):pix_char = ''for j in range(width):pixe1 = image_file.getpixel((j,i))pix_char += ascii_char[int(pixe1/128)]pix_char += '\n'f.write(pix_char)f.close()
imgtotxt('3.jpg','3_0.txt')
'''
3_0.txt
00000000000000000000000000000000
00000000000001111100000000000000
00000000111111111111111100000000
00000111111111111111111111000000
00011111111100000111111111100000
00011111000000000000111111110000
00011000000000000000001111111000
00000000000000000000000111111000
00000000000000000000000111111000
00000000000000000000000111111000
00000000000000000000000111111000
00000000000000000000001111110000
00000000000000000000011111110000
00000000000000000000111111100000
00000000000000000111111110000000
00000001111111111111100000000000
00000001111111111111110000000000
00000000111111111111111111000000
00000000000000000000111111110000
00000000000000000000000111111100
00000000000000000000000011111100
00000000000000000000000001111110
00000000000000000000000001111110
00000000000000000000000000111110
00000000000000000000000001111110
00000000000000000000000001111110
00000000000000000000000011111100
00111000000000000000000111111100
00111111100000000000111111111000
00111111111111111111111111100000
00001111111111111111111110000000
00000000011111111111100000000000
'''

2.数据预处理:txt2arry 函数将文本文件转换为 NumPy 数组,每个文件代表一个手写数字的图像,图像大小为 32x32 像素。

3.数据集构建:convert2dataset 函数从指定文件夹中读取所有文件,转换为数据集和标签。数据集中的每个样本都是一个 1x1024 的数组,标签是从文件名中提取的第一个字符。

4.模型训练:使用 KNeighborsClassifier 类训练 KNN 模型。模型参数 n_neighbors=43 表示考虑 43 个最近邻,weights='distance' 表示在投票时考虑距离的权重,p=2 表示使用欧氏距离。

5.模型评估:计算训练集上的准确率,并使用 classification_report 打印测试集的分类报告。

6.错误分析:找到第一个标签为 8 的样本,检查其预测结果,并打印出预测错误的样本。

7.混淆矩阵:使用 confusion_matrix 和 pd.crosstab 打印混淆矩阵,以评估模型的性能。

8.参数调优:测试不同的 k 值(奇数)对模型性能的影响,并绘制训练集和测试集准确率随 k 值变化的图表。

  

import os
import numpy as np
#将文本文件转换为 NumPy 数组。
def txt2arry(filename):#创建了一个形状为 (1, 1024) 的全零数组,用于存储转换后的数据x = np.zeros((1,1024))f = open(filename)for i in range(32):lineStr = f.readline()for j in range(32):#将每个字符转换为整数,并存储在数组 x 的相应位置x[0,32*i+j] = int(lineStr[j])return x
#从指定文件夹中读取所有文件,转换为数据集和标签。
def convert2dataset(file_path):#获取指定文件夹中的所有文件名list_file = os.listdir(file_path)'''m 是文件的数量。datas 是一个形状为 (m, 1024) 的全零数组,用于存储转换后的数据。labels 是一个空列表,用于存储标签'''m = len(list_file)datas = np.zeros((m,1024))labels = []for i in range(m):#num = int(list_file[i][0]) 从文件名#中提取第一个字符并转换为整数,作为标签num = int(list_file[i][0])labels.append(num)#调用 txt2arry 函数将文件内容转换为数组,#并存储在 datas 的相应行中datas[i,:] = txt2arry(file_path+'\\'+list_file[i])return datas,labelsx_train,y_train = convert2dataset('trainingDigits')
x_test,y_test = convert2dataset('testDigits')
from sklearn.neighbors import KNeighborsClassifier#使用 KNeighborsClassifier 训练模型。knn = KNeighborsClassifier(n_neighbors=43,weights='distance',p=2)
knn.fit(x_train,y_train)#计算训练集上的准确率。score = (knn.score(x_train,y_train))
print('pricise = ',score)#使用 classification_report 打印测试集的分类报告from sklearn.metrics import classification_report
y_pred = knn.predict(x_test)
print(classification_report(y_test,y_pred))#找到第一个标签为 8 的样本,检查其预测结果i = y_test.index(8)
for j in range(91):if(y_test[i+j] != y_pred[i+j]):#打印出预测错误的样本print('{}[{}]->{}'.format(y_test[i+j],j,y_pred[i+j]))#使用 confusion_matrix 和 pd.crosstab 打印混淆矩阵import pandas as pd
from sklearn.metrics import confusion_matrix
y_test = np.array(y_test)
cm = confusion_matrix(y_test,y_pred)
cm_df = pd.crosstab(y_test,y_pred,rownames=['真实值'],colnames=['预测值'],margins=True)
print(cm,cm_df,sep='\n')#测试不同的 k 值(奇数)对模型性能的影响。
#绘制训练集和测试集准确率随 k 值变化的图表neighbors = []
for i in range(13,45):if i%2 == 1:neighbors.append(i)
train_accuracy = np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))
for i,k in enumerate(neighbors):knn = KNeighborsClassifier(n_neighbors=k,weights='distance',p=2)knn.fit(x_train,y_train)train_accuracy[i] = round(knn.score(x_train,y_train),2)test_accuracy[i] = round(knn.score(x_test,y_test),2)from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title('k值的变化对准确率的影响')
plt.plot(neighbors,train_accuracy,label='训练样本的准确率')
plt.plot(neighbors,test_accuracy,label='测试样本的准确率')
plt.legend()
plt.xlabel('最近邻k字值')
plt.ylabel('准确率值')
plt.show()
#后期可以遍历找出acc最值时k值
#k 代表的是在进行分类决策时考虑的最近邻的数量
'''
E:\平常学习代码包\mechine_learning\knn_num\.venv\Scripts\python.exe E:\平常学习代码包\mechine_learning\knn_num\knn_Num.py 
pricise =  1.0precision    recall  f1-score   support0       0.99      1.00      0.99        871       0.88      0.97      0.92        972       0.95      0.96      0.95        923       0.95      0.94      0.95        854       1.00      0.93      0.96       1145       1.00      0.94      0.97       1086       0.97      1.00      0.98        877       0.92      1.00      0.96        968       0.96      0.86      0.91        919       0.91      0.93      0.92        89accuracy                           0.95       946macro avg       0.95      0.95      0.95       946
weighted avg       0.95      0.95      0.95       9468[1]->3
8[3]->6
8[13]->2
8[28]->6
8[29]->1
8[30]->1
8[31]->1
8[33]->1
8[40]->1
8[47]->6
8[59]->1
8[62]->1
8[79]->1
[[ 87   0   0   0   0   0   0   0   0   0][  0  94   2   0   0   0   0   1   0   0][  0   1  88   0   0   0   0   2   0   1][  0   0   2  80   0   0   0   0   2   1][  1   2   0   0 106   0   0   3   1   1][  0   0   0   1   0 102   0   0   0   5][  0   0   0   0   0   0  87   0   0   0][  0   0   0   0   0   0   0  96   0   0][  0   8   1   1   0   0   3   0  78   0][  0   2   0   2   0   0   0   2   0  83]]
预测值   0    1   2   3    4    5   6    7   8   9  All
真实值                                                 
0    87    0   0   0    0    0   0    0   0   0   87
1     0   94   2   0    0    0   0    1   0   0   97
2     0    1  88   0    0    0   0    2   0   1   92
3     0    0   2  80    0    0   0    0   2   1   85
4     1    2   0   0  106    0   0    3   1   1  114
5     0    0   0   1    0  102   0    0   0   5  108
6     0    0   0   0    0    0  87    0   0   0   87
7     0    0   0   0    0    0   0   96   0   0   96
8     0    8   1   1    0    0   3    0  78   0   91
9     0    2   0   2    0    0   0    2   0  83   89
All  88  107  93  84  106  102  90  104  81  91  946
'''

f180b8c30ed74c5bb388d32d14f4c3a9.png

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

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

相关文章

外卖开发(六)—— 高查询量数据的缓存

外卖开发(六)—— 高查询量数据的缓存 一、代码实现缓存1、查询缓存2、修改数据时删除缓存 二、spring cache注解实现1、Cacaheable2、CacheEvict 一、代码实现缓存 1、查询缓存 在查询的时候,先去redis中查找数据,如果存在则直…

VAS1260Q奇力LED驱动芯片DCDC降压恒流

VAS1260Q是一款专为车规级LED照明设计的连续模式电感降压驱动器,能够高效地驱动单个或多个串联LED。它集成了高端输出电流检测电路,并通过外部电阻设置标称平均输出电流,具有高可靠性和宽广的应用场景。 核心技术参数 1. 输入…

移动端使用REM插件postcss之postcss-px2rem

目录 一、概念 二、核心特性 三、功能 四、插件模块 注意事项: 五、使用 安装: 配置 一、概念 工具类型:PostCSS是一个基于JavaScript的工具,用于转换CSS的工作流。核心理念:PostCSS的核心理念是“转换而非替…

渗透测试:网络安全的深度探索

一、引言 在当今数字化时代,网络安全问题日益凸显。企业和组织面临着来自各种恶意攻击者的威胁,他们试图窃取敏感信息、破坏系统或进行其他恶意活动。渗透测试作为一种主动的安全评估方法,能够帮助企业发现潜在的安全漏洞,提高网…

JS听到了强运的回响

正则表达式 介绍 正则表达式是用于匹配字符串中字符组合的模式,在JS中,正则表达式也是对象 通常用来查找,替换那些符合正则表达式的文本 就是筛选出符合条件的一类人 比如说 有人喜欢玩艾斯爱慕,那他喜欢的就是这一类人&…

文件的操作

什么是文件 如何是数据持久化——保存在硬盘上(文件,数据库)磁盘上的文件是文件在程序设计中,我们一般谈的文件有两种:程序文件、数据文件程序文件,比如源文件(.c文件)读a文件写到b文件里,此时a…

【18. 自定义类型:结构体类型】

文章目录 一、结构体类型的声明1.1 结构体回顾1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的⾃引⽤ 2. 结构体变量的创建和初始化2.1 对⻬规则2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构成员访问操作符3. 结构体传参 4. 结构体内存对…

疯狂原始人

With every sun comes a new day. 每每旭日东升 A new beginning. 都是崭新的开始 A hope that things will be better today than they were yesterday. 总是期冀今日之美远胜昨日 But not for me. My names Eep. 但不属于我 我叫小伊 And this is my family. The Crood…

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(三):圆弧的绘制

当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(一)5.1.2 饼图布局生成器(二)5.1.3 圆弧的绘制(三) ✔️5.1.4 数据标签的添加(四&…

【C++】LeetCode:LCR 022. 环形链表 II

题目: 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位…

Windows环境中Python脚本开机自启动及其监控自启动

1 开机自启动 Windows 10/Windows Server 201X具有一个名为“启动”的已知文件夹,系统每次启动开始自动运行应用程序、快捷方式和脚本时都会检查该文件夹,而无需额外配置。 要在Windows启动时运行脚本,先使用WindowsR快捷键打开“运行”对话…

【QNX+Android虚拟化方案】132 - QNX 系统内存、CPU负载监控

【QNX+Android虚拟化方案】132 - QNX 系统内存、CPU负载监控 1. 获取 showmem 信息2. 获取 thermal adc sensor 信息3. 获取 CPU Load负载信息4. 获取 CPU Freq 频率信息5. 获取 系统开机时间 uptime基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代…

基于JavaSwing的贪吃蛇项目(最新项目)

Java贪吃蛇游戏 目录 文章目录 Java贪吃蛇游戏目录第一章 项目概述1.1 设计背景1.2 设计目的1.3 开发环境 第二章 需求分析2.1 功能需求2.1.1 基础功能2.1.2 扩展功能 2.2 性能需求2.3 用户体验需求 第三章 概要设计3.1 系统架构3.1.1 总体架构3.1.2 类设计 3.2 核心算法设计3…

SpringBoot 赋能:精铸超稳会员制医疗预约系统,夯实就医数据根基

1绪论 1.1开发背景 传统的管理方式都在使用手工记录的方式进行记录,这种方式耗时,而且对于信息量比较大的情况想要快速查找某一信息非常慢,对于会员制医疗预约服务信息的统计获取比较繁琐,随着网络技术的发展,采用电脑…

golang 协程泄漏、协程退出时机、main函数

父协程中生成子协程 问题:如果在一个父goroutine中生成了子goroutine,请问如果父goroutine先执行完毕,那么子协程会自动退出吗? 答案是:不会 先给出结论: 主协程执行完毕后,子协程会继续执行&a…

基于FPGA的智能电子密码指纹锁(开源全免)

基于FPGA的智能电子密码指纹锁 一、功能描述硬件资源需求 二、整体框架知识准备AS608指纹模块4*4数字键盘模块 三、Verilog代码实现以及仿真验证1.AS608_data模块2.check_hand模块3.four_four_key模块4.check_mima模块5.change_mima模块6.seg_ctrl模块7.uart_top模块8.key_debo…

动态计算加载图片

学习啦 别名路径:①npm install path --save-dev②配置 // vite.config,js import { defineConfig } from vite import vue from vitejs/plugin-vueimport { viteStaticCopy } from vite-plugin-static-copy import path from path export default defineConfig({re…

精确的单向延迟测量:使用普通硬件和软件

论文标题:Precise One-way Delay Measurement with Common Hardware and Software(精确的单向延迟测量:使用普通硬件和软件) 作者信息:Maciej Muehleisen 和 Mazen Abdel Latif,来自Ericsson Research Eri…

基于Java+Swing+Mysql的网络聊天室

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程,音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升,但是笔者仅向大家介绍 Li…