【KNN近邻算法】实现识别简单数字验证码(算法原理+代码笔记)

K近邻算法(KNN)及案例(Python) 1 算法简介 K近邻算法(英文为K-Nearest Neighbor,因而又简称KNN算法)是非常经典的机器学习算法。 K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。 (K的含义)以下图为例,假设五角星代表爱情片,三角形代表科幻片。此时加入一个新样本正方形,需要判断其类别。当选择以离新样本最近的3个近邻点(K=3)为判断依据时,这3个点由1个五角星和2个三角形 阅读详情

此笔记适合有一定python基础,了解numpy科学计算库的人,有一定线性代数基础的人。对KNN算法原理了解的更容易看懂,笔者水平受限,写以下笔记主要目的是分享自己的学习过程以及便于以后复习查看。

KNN 近邻算法实现原理:


实现步骤:

  ①:处理数据

          ②:数据向量化

          ③:计算欧几里得距离

          ④:根据距离进行分类

训练数据和测试数据:(存放在txt文件里面)

下载地址:链接:http://pan.baidu.com/s/1jHO0PHs 密码:5iba

整体思路:

核心算法(算法思路):

  KNN算法主要实现将传入的测试数据与训练数据做对比,其中训练数据已知类型,测试数据并不知道。

                          KNN算法函数是:knn(k,testdata,traindata,labels):

          参数解释:1、k代表训练样本的个数。

                              2、testdata是测试数据(具体格式后面解释)。

                              3、traindata是训练数据(具体格式后面解释)。

                              4、labels代表训练数据对应的类别。

 算法如下:

from numpy import *
import operator
from os import listdir
def knn(k,testdata,traindata,labels):
    #testdata:[特征1,特征2,特征3]
    #traindata:[[特征1,特征2,特征3],[特征1,特征2,特征3],[特征1,特征2,特征3]]
    traindatasize=traindata.shape[0]
    dif=tile(testdata,(traindatasize,1))-traindata
    sqdif=dif**2
    #sumsqdif已经成为一维的了[a,b,c,d]
    sumsqdif=sqdif.sum(axis=1)
    distance=sumsqdif**0.5
    sortdistance=distance.argsort()
    #sortdistance指的是测试数据与各训练数据的距离由近到远排序之后的结果列表
    count={}#{"类别":"次数"}
    for i in range(0,k):
        vote=labels[sortdistance[i]]#当前距离的类别是谁(由近至远)
        count[vote]=count.get(vote,0)+1
    #print(count)
    sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)
    return sortcount[0][0]


 核心思路:

1、编写函数将训练文件里面的数据按行读取一次存放到一个列表arr中

#数据加载,将数据转换成knn算法支持的向量。
def datatoarray(fname):  #fname是文件名称
    arr=[]#新建一个列表
    fh=open(fname) #打开fname对应的这个文件
    for i in range(0,32):
        thisline=fh.readline()  #按行读取一次存放到列表中
        for j in range(0,32):
            arr.append(int(thisline[j]))  #将按行读取的结果存放到列表中
    return arr#返回列表

2、编写函数得到每一个训练样本的类别

#取文件名前缀(类别)
def seplabel(fname):
    filestr=fname.split(".")[0]  #split函数是分割函数,在这里是以‘.’分割,并且去前面部分
    label=int(filestr.split("_")[0])  #split函数是分割函数,在这里是以‘_’分割,并且去前面部分,就会得到这个数据的类别,
                                      #主要是因为文件名的格式是形如:8_55,8代码这个文件的正确识别结果应该是8              
以上2步是针对单个训练文件

3、针对批量训练文件,全部转换成KNN算法支持的格式,并且将每一个训练样本对应的类别存放在将要传给KNN算法的列表参数labels中,并且每一个列表元素和格式化后的训练数据样本对应

def traindata():
    labels=[]  #存放类别
    trainfile=listdir("D:/trainandtest/traindata") #把文件夹打开并且把文件夹中所
#    有的文件名存放在列表中,为了最后放在datatoarray函数的arr里(那里面也是列表类型)
    num=len(trainfile)
    #建立一个列为1024,行为num的数组模型
    trainarr=zeros((num,1024))
#      {
#       [
#        [      ]
#        [      ]
#        [      ]
#        [      ]   num为行数,1024是每一行存放的特征数目
#               ]}
    for i in range(0,num):
        thisname=trainfile[i]
        thislabel=seplabel(thisname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("D:/trainandtest/traindata/"+thisname)
    return trainarr,labels

              4、其他操作:

trainarr,labels=traindata()  #得到训练样本的类别,及转换成KNN算法支持的向量格式
thistestfile="5_66.txt"       #当前要测试的文件
testarr=datatoarray("D:/trainandtest/testdata/"+thistestfile)   #把测试文件转换成KNN支持的向量格式
rst=knn(3,testarr,trainarr,labels)   #调用KNN算法实现识别,并且把值返回给rst
print "this writing's classify is",rst

完整代码:

#Wrting shibie system.
# encoding=utf-8
#numpy是处理二维矩阵的科学计算库
from numpy import *
import operator
from os import listdir
def knn(k,testdata,traindata,labels):
    #testdata:[特征1,特征2,特征3]
    #traindata:[[特征1,特征2,特征3],[特征1,特征2,特征3],[特征1,特征2,特征3]]
    traindatasize=traindata.shape[0]
    dif=tile(testdata,(traindatasize,1))-traindata
    sqdif=dif**2
    #sumsqdif已经成为一维的了[a,b,c,d]
    sumsqdif=sqdif.sum(axis=1)
    distance=sumsqdif**0.5
    sortdistance=distance.argsort()
    #sortdistance指的是测试数据与各训练数据的距离由近到远排序之后的结果列表
    count={}#{"类别":"次数"}
    for i in range(0,k):
        vote=labels[sortdistance[i]]#当前距离的类别是谁(由近至远)
        count[vote]=count.get(vote,0)+1
    #print(count)
    sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)
    return sortcount[0][0]
#数据加载,将数据转换成knn算法支持的向量。
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#a=datatoarray("D:/Python35/traindata/0_3.txt")
#取文件名前缀(类别)
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
#建立训练数据
#labels:[类别,类别,类别,类别]
#tainarr:[[特征1,特征2,特征3],[特征1,特征2,特征3],[特征1,特征2,特征3]]
def traindata():
    labels=[]  #存放类别
    trainfile=listdir("D:/trainandtest/traindata") #把文件夹打开并且把文件夹中所
#    有的文件名存放在列表中,为了最后放在datatoarray函数的arr里(那里面也是列表类型)
    num=len(trainfile)
    #列为1024,行为num的数组
    trainarr=zeros((num,1024))
#      {
#       [
#        [      ]
#        [      ]
#        [      ]
#        [      ]   num为行数,1024是每一行存放的特征数目
#               ]}
    for i in range(0,num):
        thisname=trainfile[i]
        thislabel=seplabel(thisname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("D:/trainandtest/traindata/"+thisname)
    return trainarr,labels   
        
trainarr,labels=traindata()
thistestfile="5_66.txt"
testarr=datatoarray("D:/trainandtest/testdata/"+thistestfile)
rst=knn(3,testarr,trainarr,labels)
print "this writing's classify is",rst
#小作业
#实现将testdata里面的数据批量识别(提示:通过循环)
#2:实现计算识别准确率SA

运行结果:


                                            

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

相关推荐

【机器学习实战 Task1】 (KNN)k近邻算法的应用

1 背景 1.1 k近邻算法的概述 (1)k近邻算法的简介 k-近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。 (2)k近邻算法的工作原理 给定一个样本的集合,这里称为训练集,并且样本中每个数据都包含标签。对于新输入的一个不包含标签的数据,通过计算这个新的数据与每一个样本之间的距离,选取前k个,通常k小于20,以k个剧里最近的数据的标签中出现次数最多的标签作为该新加入的数据标签。 (3)k近邻算法的案例 当前统计了6部

202xxx的博客 8721

基于Python的KNN数字验证码识别

本项目基于Python爬虫爬取验证码图片,对图片进行去噪、分割,通过KNN算法训练模型,实现验证其准确率。

m0_63019653的博客 2006

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

KNN 实现手写数字分类

Elford的博客 3993

机器学习——Knn算法实现图片验证码识别

第一步:用OpenCV图像处理 1. 所使用的库: pip3 install opencv-python pip3 install numpy 2. 图片处理—对图片进行降噪、二值化处理: (1)先读入样本图片,转为灰度图 im = cv2.imread(img_file) im_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) cv2.ims...

Freya说她写不好博客 2903

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

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

SCUT_Arucee的博客 6885

基于Python爬虫+KNN数字验证码识别系统——机器学习算法应用(含全部工程源码)+训练数据集

项目目标:通过爬虫技术和图像处理算法,实现对验证码图片的自动识别和准确率验证。它可以应用于需要处理大量验证码的场景,如自动化测试、数据采集等。通过训练和验证模型的过程,我们可以不断提升验证码识别的准确性和稳定性,提高验证码处理的效率。

小胡说人工智能的博客 1648

Python教学|Python验证码识别

今天小编也给大家分享一份Python学习资料和公开课,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂。朋友们如果需要可以点击这里【免费获取】

2301_78095909的博客 9453

机器学习之KNN识别验证码

https://mp.youkuaiyun.com/mdeditor/85250661 使用Knn完成验证码识别,环境是python3+jupyter notebook。做完这个就会对knn有深入的理解

Python 代码实现验证码识别,很稳

作者:叶庭云源自:快学python昨天十行代码实现文字识别,感觉怎样,是不是很爽今天咋们继续利用pillow和pytesseract来实现验证码的识别一、环境配置需要 pillow 和 ...

苏克的博客 4万+

基于Python实现KNN算法手写数字识别(源码+数据).rar

1、资源内容:基于Python实现KNN算法手写数字识别(源码+数据).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、更多仿真源码和数据集下载列表(自行寻找自己需要的):https://blog.youkuaiyun.com/m0_62143653?type=download 4、免责声明:本资源作为“参考资料”而不是“定制需求”不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。

Python用 KNN 进行验证码识别的实现方法

主要介绍了Python用 KNN 进行验证码识别的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

KNN算法实现手写数字识别

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

李玺 2万+

C# ArcGIS Engine二次开发——实现“加载shp文件”

private void AddShpDataToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog OpFileDialog=new OpenFileDialog();//OpenFileDialog:打开文件对话框 OpFileDialog.Title="添加矢量数据"; OpFileDialog.Filter="(*.shp)|*.shp";//filter:过滤器;"(*.shp)|*.shp"

weixin_42191203的博客 5254

KNN(k近邻算法)最最最全面总结

KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同。KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别。而KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值。 一 KNN算法概述 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数...

weixin_43589681的博客 1万+

【OpenSearch】从零到一:手把手搭建OpenSearch与Dashboard可视化平台

本文提供了一份详细的OpenSearch与Dashboard可视化平台从零搭建指南。内容涵盖环境准备、系统调优、核心服务安装配置、Dashboard部署与汉化,以及生产环境安全加固建议,帮助用户快速构建一个功能完整的搜索与分析平台。

devops8pract的博客 617

基于simulink的能量管理策略的场景实例:混合动力电动汽车(HEV)的能量回收与分配策略

本文以混合动力电动汽车(HEV)为研究对象,通过Simulink建模详细演示了能量管理策略的设计与实现。内容涵盖HEV系统架构、核心组件工作原理,并分步骤指导搭建车辆动力学模型、动力系统组件模型和基于规则的能量管理策略。重点分析了制动能量回收与功率分配机制,通过仿真验证了逻辑门限策略在提升燃油经济性和维持电池SOC平衡方面的有效性。文章最后展望了更高级控制策略的应用前景,为HEV能量优化提供了完整的仿真研究框架。

xiaoheshang_123的博客 213

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

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

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

目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究

近几年来,在计算机视觉领域,利用深度学习卷积神经网络技术来实现各种任务的算法越来越多。毫米波雷达、相机、激光雷达、超声波雷达等车载传感器生产成本的降低,汽车的自动驾驶技术得到了飞速发展,在我们的日常生活中经常能看到该技术辅助汽车驾驶员进行行车。和非自动驾驶汽车相比,自动驾驶汽车存在诸多优点,如进一步减少交通事故,保障人身安全;提供安全合理的路线,避免交通拥堵;采用清洁无污染的电能作为汽车新能源,从而降低大气污染等。现如今,自动驾驶技术已经逐渐深入到各个领域并发挥着关键的作用。

qq_36130719的博客 3730

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

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

LiuAmber的博客 2669

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

【机器学习】推理时计算优化——思维链(Chain-of-Thought)与慢思考范式 第一章:基础理论与认知框架 第二章:计算优化技术与前沿方法

过程监督在数学推理中展现出显著优势,因其能够定位错误发生的具体步骤,而非仅在最终答案处提供稀疏反馈。然而,高质量过程标注的获取成本高昂,这催生了基于自动验证器的近似方法。

VectorShift的博客 72

k-近邻算法(KNN)Python实现

优快云 博客 创作中心 学院 ...

roc__chen的博客 1万+

Vue - 解决报错 Error: Cannot find module ‘XXX\@vue\cli-service\bin\vue-cli-service.js‘(vue项目编译运行出错,启动失败)

vue报错,Error: Cannot find module ‘@vue\cli-service\bin\vue-cli-service.js‘,vue2项目启动报错,vue3项目运行出错,vue执行npm run serve报错,找不到@vue/cli-service模块,vue项目关于:Error: Cannot find module ‘D:\@vue\cli-service\bin\vue-cli-service.js‘的解决方案,vue项目跑不起来了,Vue项目报错,跑项目报错Cannot fi

🏆 前端领域优质创作者 3115

手写数字识别算法之kNN

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

weixin_46824122的博客 5264

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

K-Nearest Neighbor理解笔记(KNN原理及代码实现)

目录 邻近算法(Nearest Neighbor) 概念原理 算法分析 代码实现 K近邻算法(K-Nearest Neighbor) 概念原理 算法分析 代码实现 优缺点分析: 邻近算法(Nearest Neighbor) 概念原理 邻近算法(Nearest Neighbor)的思想实际上十分简单,就是将测试图片和储存起来的训练集一一进行相...

Dylan的博客 8142

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: pycharm 2016.2或者2016.3激活方式
下一篇: Android开发中Handler的经典总结
Waitfou
博客等级 码龄10年 61粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值