KNN手写数字识别

kNN算法实现手写数字识别(机器学习) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、实验步骤 二、实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻算法识别手写数字 ​ 总结 前言 此时实验利用KNN算法实现手写数字识别,为了简单起见只能识别数字0到9需要识别的数字已经使用图形处理软件处理成相同的色彩和大小:宽高32像素x32像素的黑白图像,并将图像转换为文本格式。 提示:以下是本篇文章正文内容,下面案例可供参考 一 阅读详情

目录

导包

读取数据

将5000张图片全部加载进来

画图显示

加载数据,处理(灰度化)

X,y划分成训练和验证数据

算法训练和预测(验证)

算法预测

提升准确率,将邻居数降为5

n-jobs提升

二值化操作

多次划分训练预测的平均准确率



导包

CV2比matplotlib加载速度快

import numpy as np

import cv2#加载图片

import matplotlib.pyplot as plt

#inline表示将图表嵌入到Notebook中

%matplotlib inline

from sklearn.neighbors import KNeighborsClassifier

读取数据

# bitmap 位图
digit = cv2.imread('./data/0/0_101.bmp')
plt.imshow(digit)
#图为0

一个小方块代表一个像素,数据是三维的。将digit转换为黑白的,数据即会减小。

# 将彩色(三维的)图片转化成黑白的(图片灰度化处理):大大降低数据量
digit = cv2.cvtColor(digit,code = cv2.COLOR_BGR2GRAY)

# 原来的数据(28,28,3) [高度,宽度,像素]----------> (28,28)
#  数据量大大减少了2/3,只有原来的1/3

digit.shape

# digit二维的,高度,宽度,像素(只有一个值)--------用什么颜色表示呢?
# 选择黑白,图片show就是黑白,rainbow显示出来,彩虹效果

plt.imshow(digit,cmap=plt.cm.gray)

 

将5000张图片全部加载进来

X = []
for i in range(10):
    for j in range(1,501):#1-500
        digit = cv2.imread('./data/%d/%d_%d.bmp'%(i,i,j))
        X.append(digit[:,:,0])#切片
# 数据X和目标值y是一一对应
X = np.asarray(X) # 列表转换为numpy对象
y = np.array([i for i in range(10)]*500)#500个是一类 列表乘以500
y.sort()#排序

画图显示

# digit二维的,高度,宽度,像素(只有一个值)--------用什么颜色表示呢?
# 选择黑白,图片show就是黑白,rainbow显示出来,彩虹效果

index = np.random.randint(0,5000,size = 1)[0]

digit = X[index]

print('-----------------------',y[index])

plt.imshow(digit,cmap = plt.cm.gray)

 

加载数据,处理(灰度化)

X,y划分成训练和验证数据

# 模型选择,可以打乱顺序,按照比例进行划分
from sklearn.model_selection import train_test_split

# test_size = 0.2,train_size = 0.8 百分比 random_state:
# 训练:测试= 4:1
# 一一对应的 
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 100)

 

算法训练和预测(验证)


knn = KNeighborsClassifier(n_neighbors= 63)

knn.fit(X_train,y_train)

此时会发现报错了,

数据是三维的,算法是预估,数据不符要求,应用reshape改变形状,变成二维的。

# 数据不合要求,reshape形状改变
# 数据不变
# 三维的数据--------->变成2维
X_train = X_train.reshape(4000,-1)
X_train.shape

再执行,就不报错了。

预测时也要用二维数据

X_test = X_test.reshape(1000,784)

算法预测

%%time
knn = KNeighborsClassifier(n_neighbors= 63)

knn.fit(X_train,y_train)

# 使用算法进行预测
# 保留了1000个数据,算法‘没见过‘这1000个数据
X_test = X_test.reshape(1000,784)
y_ = knn.predict(X_test)
# 准确率
# (y_ == y_test).sum()/1000
print((y_ == y_test).mean())

提升准确率,将邻居数降为5

%%time
# 参数n_neighbors = 5告诉计算机找到最近的5个邻居
# 计算所有,找到最小的5个距离,最近的5个邻居
knn = KNeighborsClassifier(n_neighbors= 5)
knn.fit(X_train,y_train)
# 使用算法进行预测
# 保留了1000个数据,算法‘没见过‘这1000个数据
X_test = X_test.reshape(1000,784)
# 取出一个,找这一个5个邻居(4000个数据中)-----> 遍历------->d[:5]
# 取出一个,找这一个63个邻居(4000个数据中)-----> 遍历------>d[:63]
y_ = knn.predict(X_test)

# 准确率
# (y_ == y_test).sum()/1000
print((y_ == y_test).mean())#

由此可以看出kNN的缺点,时间和空间复杂度都比较大。

设学习和预测的数据一样

%%time
# 参数n_neighbors = 5告诉计算机找到最近的5个邻居
# 计算所有,找到最小的5个距离,最近的5个邻居
knn = KNeighborsClassifier(n_neighbors= 5)
# 算法是‘学习‘,不是死记硬背,存到数据库一样,进行一一对比
knn.fit(X_train,y_train) #算法训练(学习)4000个数据
# 使用算法进行预测
# 保留了1000个数据,算法‘没见过‘这1000个数据
X_test = X_test.reshape(1000,784)
# 取出一个,找这一个5个邻居(4000个数据中)-----> 遍历------->d[:5]
# 取出一个,找这一个63个邻居(4000个数据中)-----> 遍历------>d[:63]
y_ = knn.predict(X_train) #算法预测4000个数据

# 准确率是否可以100% ???
# (y_ == y_test).sum()/1000
print((y_ == y_train).mean())

n-jobs提升

knn = KNeighborsClassifier(n_neighbors= 5,n_jobs=-1)#n_jobs=-1便是使用全部的CPU

算法是去学习,不是死记硬背,不是像数据库一样将数据一一对比,它是学习总结规律的过程,所以即使相同的数据去测试,准确率也不可能是100%。

index = np.random.randint(0,5000,size = 1)[0]
plt.imshow(X[index],cmap = 'gray')

二值化操作

# 二值化操作
for i in range(5000):
    for y in range(28):#高
        for x in range(28):#宽
            if X[i][y,x] < 200:
                X[i][y,x] = 0
            else:
                X[i][y,x] = 255

index = np.random.randint(0,5000,size = 1)[0]
plt.imshow(X[index],cmap = 'gray')

多次划分训练预测的平均准确率

y = np.array([i for i in range(10)]*500)
y.sort()
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state=100)#random_state标记状态

%%time
accuracy = 0
for i in range(30):
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
    # 参数n_neighbors = 5告诉计算机找到最近的5个邻居
    # 计算所有,找到最小的5个距离,最近的5个邻居
    knn = KNeighborsClassifier(n_neighbors= 5,n_jobs=-1)
    # 算法是‘学习‘,不是死记硬背,存到数据库一样,进行一一对比
    knn.fit(X_train.reshape(4000,-1),y_train) #算法训练(学习)4000个数据
    # 使用算法进行预测
    # 保留了1000个数据,算法‘没见过‘这1000个数据
    X_test = X_test.reshape(1000,784)
    # 取出一个,找这一个5个邻居(4000个数据中)-----> 遍历------->d[:5]
    # 取出一个,找这一个63个邻居(4000个数据中)-----> 遍历------>d[:63]
    y_ = knn.predict(X_test.reshape(1000,-1)) #算法预测4000个数据

    # 准确率是否可以100% ???
    # (y_ == y_test).sum()/1000
    accuracy += (y_ == y_test).mean()/30
print('-----------------多次划分训练预测的平均准确率:%0.3f'%(accuracy))

 

 

 

基于knn的手写数字识别 基于sklean的手写数字识别 分别用普通方式和调用sklean库 阅读详情

相关推荐

python实现基于KNN算法的手写数字识别系统 非常详细!!!!

可爱聪明善良的你关注有惊喜哦 实验知识点: 1、K 近邻分类算法 2、从文本文件中解析和导入数据 3、使用 Matplotlib 创建扩散图 4、归一化数值 首先介绍下监督学习和无监督学习: 监督学习:(数据有输入有输出),通过已有的一部分数据和输出数据之间的相应关系,生成一个函数,将输入映射到合适的输出,在准确的说有监督学习就是训练样本中必须有标签或者标记; 无监督学习:(数据只有输入),给定...

springhammer的博客 2万+

机器学习入门-kNN算法实现手写数字识别

实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别,其中kNN算法是机器学习中入门的分类算法。其核心思想是将需要进行分类的目标放入已有充足样本的向量集中,求得与其距离最近的前k(自定超参数)个点,并返回这k个点中出现频率最高的类别,并将此类别作为模型的预测结果。 kNN算法 为了实现手写数字的分类,最重要的是取得分类算法 #kNN算法 def kNNclassi

Keiji582的博客 7049

【AI】Python 实现 KNN 手写数字识别

KNN 实现手写数字分类

Elford的博客 3993

机器学习-神经网络-手写数字识别-KNN(有代码,有解析,有数据集,可视化)

本文主要实现了基于tensorflow的手写数字识别,同时也有一个与KNN实现手写数字识别,内容较为细致,适合初步学习神经网络的友友。

m0_63669388的博客 4185

机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读

一.背景简要说明 书中假设待识别的数字已经使用图形处理软件将其处理为32*32的黑白图像,并将图片转换为文本格式。如下图代表数字0: 每个数字的训练样本大概有200个,每个数字的测试样本大概有100个,分别放在trainingDigits和testDigits中。 二.模块代码及注释 from numpy import * from os import

SCUT_Arucee的博客 6885

用KNN做手写数字识别(mnist)

一. KNN的原理 KNN的主要思想是找到与待测样本最接近的k个样本,然后把这k个样本出现次数最多的类别作为待测样本的类别。 二. 数据源 mnist数据集,包含42000张28*28的图片,可以从网盘下载http://pan.baidu.com/s/1kVi1nc7,下载完解压后如下图所示: 三. 处理方法 1. 把图片读取到一个28*28的矩阵里,然后对图片进行一个简单的二值化,

whai的专栏 2万+

用KNN(K近邻算法)完成手写数字识别python实践

用KNN(K近邻算法)完成手写数字识别 这是我第一次写博客,也是刚学的KNN,写``的目的就是为了增强我对该算法的理解。有问题请大家给我指出,谢谢啦。 一.算法部分 1.客观理解:最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多...

LiuAmber的博客 2669

深度学习入门必看-手写数字识别

前言 目前深度学习框架paddlepaddle、tensorflow、pytorch比较,结合网上大神的总结,pytorch更好学,社区也大,教程较多,莫名其妙的错误比较少。它基于动态图,可以按照正常人的思路玩,API较稳定。 paddlepaddle的话同时支持动态图和静态图,但是社区还在建设中,版本迭代更新快。不过可以嫖百度的云计算服务,值得一试。而且配套的预训练模型和可视化等等开发工具也在上线中,蛮好用的。 tensorflow是出了名新手劝退框架,因为文档比较反萌新,版本兼容性较差(我曾在嫉妒

Python,数据分析,机器学习,深度学习 1万+

KNN算法实战之手写数字识别

文章目录一、说明二、题目三、实践部分3.1 准备数据:将图像转换为测试向量3.2 KNN算法3.3 测试算法:使用kNN识别手写数字四、源代码4.1 KNN.py4.2 KNN.ipynb 一、说明 我是在jupyter完成的,然后导出成markdown格式,ipynb文件导出为markdown的命令如下: jupyter nbconvert --to markdown xxx.ipynb 二...

SCUhzs 3578

基于Python的kNN手写数字识别实践

k近邻算法的概念源自人类的直觉判断,当我们无法确定一个对象的类别时,往往通过观察它与哪些已知类别的对象相似来做出判断。在算法中,这个“相似”通常通过计算特征空间中两点之间的距离来实现,欧氏距离是最常见的度量方式。机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等众多学科。它主要研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

weixin_35750483的博客 804

基于KNN的手写数字识别实战项目

在人工智能领域,手写数字识别是一个经典的入门级问题。它指的是利用计算机技术,让机器能够自动识别手写的数字图像,是机器学习与模式识别技术的重要应用之一。本章将对手写数字识别的基本概念、历史背景以及该技术在现实世界中的应用做初步介绍。K近邻算法(K-Nearest Neighbors, KNN)是一种基本分类与回归方法。KNN的工作原理是:给定一个训练数据集,对新的输入实例,在训练集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类别,则该输入实例也属于这个类别。当K=1时,称为最近邻分类器。

weixin_42388898的博客 924

KNN算法实现手写数字识别

KNN 最邻近分类算法: (近邻取样) 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是机器学习分类技术中最简单的方法之一。 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。 属于监督学习,有类别标记,且KNN是惰性学习。叫做Memory-based learning、也叫instance-based learning. 他...

李玺 2万+

KNN算法实现手写数字识别的三种方法(源码)

KNN算法使用MNIST数据集、0-1二值图集、自写的数字图片集,做手写数字识别的代码,文件夹分类明确。

KNN (K近邻算法) - 识别手写数字

KNN项目实战——手写数字识别 1、 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征...

weixin_30666943的博客 341

期货套利策略(二)

接上一篇期货套利策略,随着对期货套利策略的深入了解,我发现套利策略不是那么好做的。下面将会讲碰到的一些问题。 上一篇文章中没有考虑滑点的问题,这里我们把滑点问题考虑进去。这里先说一些天勤api的买入点,天琴的买入点是当前K线的收盘价。碰到数据传输问题,还有计算等各方面问题,实际情况是无法在当前K线的收盘价买入的。这里我们把这方面问题考虑进去,利用api.wait_update()调到下一个k线数据...

qq_31611005的博客 1713

OMI数据获取与可视化:从下载到大气污染分析

本文详细介绍了如何获取与处理OMI卫星数据,以进行大气污染分析。内容涵盖从NASA GES DISC官方源下载对流层NO2数据、使用MATLAB或Python进行月均数据处理与网格化,到利用m_map或cartopy工具进行专业可视化的完整流程。重点解析了数据下载技巧、NetCDF格式处理、地图投影与填色方法,并探讨了时间序列分析与动态可视化等深度应用,为环境研究者提供了一套从数据到洞察的实用指南。

weixin_29210759的博客 269

手写数字识别算法之kNN

手写数字识别算法之kNN 1、k-近邻算法 ①原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每一个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每一个特征进行比较;然后算法提取样本集中特征最相近数据(最邻近)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-邻近算法中k的出处。通常k是不大于20的整数。最后...

weixin_46824122的博客 5264

单细胞数据分析实战:用scDblFinder快速搞定异质性双细胞检测(附完整R代码)

本文详细介绍了如何使用scDblFinder工具在单细胞RNA测序数据中精准识别异质性双细胞。通过完整的R代码示例,从环境准备、数据加载到核心分析流程和结果可视化,帮助研究人员高效解决双细胞检测问题,提升单细胞数据分析的准确性。scDblFinder的集成算法和鲁棒性设计使其成为处理单细胞数据中技术噪音的理想选择。

weixin_29098117的博客 426

【机器学习】KNN近邻算法及实战案例(鸢尾花、手写数字识别)

K-Nearest Neighbors (KNN) 是一种简单且直观的机器学习算法,它属于监督学习的一种。KNN可以用于分类和回归问题,但最常用于分类。它的核心思想是:一个样本所属的类别可以通过与这个样本最近邻的几个训练样本的类别来决定。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 7976

企业级防火墙实战:用深信服AF8.0打造安全办公网络(含流控/僵尸防护配置)

本文详细介绍了如何利用深信服AF8.0防火墙构建企业级安全办公网络,涵盖设备初始化、多接入方式配置、三维一体安全防护体系(包括应用控制、僵尸防护和智能流控)以及典型问题排查。通过实战案例和配置模板,帮助IT管理员高效部署和优化网络安全管理,提升企业网络安全防护能力。

weixin_28716443的博客 282

基于半经验模型的熔断器燃弧过程计算与分析

本文针对1200V/1250A熔断器建立电弧燃烧半经验模型,通过ANSYS计算弧前时间,结合熔体烧蚀、石英砂烧蚀等物理过程简化建模。模型引入电导率随温度变化函数,利用Matlab拟合实验数据确定参数。分析表明:熔体宽度和节距增加会提高弧压峰值并缩短过零时间;总长固定时,断口数和节距影响较小。弧压峰值需控制在额定电压3倍内,过零时间需满足安全裕度。通过Python代码复现了电弧电导率模型、能量平衡方程及弧压计算,验证了熔体结构尺寸对电弧特性的影响规律。

huanghm88的专栏 259

k-近邻算法(KNN)识别手写数字

k-近邻算法(KNN) 将一个32x32的二进制图像矩阵转化为1x1024的向量。 函数img2vector,将图像转化为向量,该函数创建1x1024的数组,然后打开给定的文件,循环读出文件的前32行,并将每行的头32个字值存储在NumPy数组种,最后返回数组。 #将图像文本数据转换为向量 def img2vector(filename): returnVect =...

weixin_30378623的博客 360

YOLOv11 热力图可视化全流程:从模型解释到科研论证,让检测结果“有理可看”

无论是科研中需要严谨的模型解释,还是工业里要高效的缺陷定位,这套方法都能让你在“模型黑箱”与“业务需求”之间架起一座可视化的桥梁。别再让模型决策“无据可依”——现在就动手生成你的第一幅热力图,让 YOLOv11 的每一次检测都“有理可看”,用可视化的力量推动你的 AI 研究与落地走向深入!某团队在论文中通过热力图对比,证明其改进的注意力模块可使模型对小目标的关注区域更精准,实验论证说服力提升 50%;工业质检场景下,热力图帮助工程师快速定位模型漏检缺陷的原因——原来是对某类缺陷的特征关注不足。

m0_71589036的博客 678

使用KNN算法识别手写数字——简记

KNN的手写体数字识别代码: 相关代码如下: ''' kNN: k Nearest Neighbors Input: inX: vector to compare to existing dataset (1xN) dataSet: size m data set of known vectors (NxM) labels: data s...

专注于AI领域前沿技术学习与分享:目标检测、图像修复、超分重建、AI工程化 2205

Qualcomm AI Engine Direct SDK(QNN)的使用介绍

Qualcomm AI Engine Direct SDK,高通新的AI模型推理框架,又名QNN,为AI开发提供统一API的底层框架。通过这个SDK,可以在高通的 CPU/GPU和HTP上对AI模型进行性能加速。2.Qualcomm AI Engine Direct SDK的公开英文文档。1.Qualcomm AI Engine Direct SDK的下载和安装。

u013250861的博客 6974

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 831
上一篇: 决策树随机森林
下一篇: KNN-iris分类
Wind_know
博客等级 码龄9年 17粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值