之前写过knn分类算法代码,想把knn用于设别手写体数字,看下正确率。

大概思路:获取图片(可以自己写,我之前有写过黑白图片转文本的代码,也可以网上找,反正数据量大会更好)->转成文本->建立大量的训练数据集->建立好训练数据与类别的关联->测试

注意:训练数据一定要明确给出类别。本次实验手写体数字一共就是10中类别,0-9

获取图片转成文本之前写过,跳过,直接从建立训练数据开始。

首先加载数据,图片保存在文本里,不方便处理,转成数组。这里的32都是保存图片的宽和高(px),按照具体图片大小决定。

之后将所有训练数据存储在一个数组里,一个文本存储在数组的一行里,一共有多少文本,就有多少行,列数是固定的,32*32=1024

上图就是建立了类别和训练数据的联系。

测试数据,用knns算法去给测试数据分类。

单个手写体数字文件识别:

trainarray,labels=traindata()

tfile="1_32.txt"#注意:1是该文本的真实类别,32是该类别第32个数据

tarray=datatoarray("D:/xx/testdata"+tfile)

result=knn(4,tarray,trainarray,labels)

print(result)

批量手写体数字文件识别:

结果:

一共是964个文件,设别错误11个,k为4,可以看出KNN正确率还是可以的。

源码:

from numpy import *

import operator

from os import listdir

def knn(k, testdata, traindata, labels):

traindatasize = traindata.shape[0]

dif = tile(testdata, (traindatasize, 1)) - traindata

sqdif = dif ** 2

sumsqdif = sqdif.sum(axis=1)

distance = sumsqdif ** 0.5

sortdistance = distance.argsort()

count = {}

for i in range(0, k):

vote = labels[sortdistance[i]]

count[vote] = count.get(vote, 0) + 1

sortcount = sorted(count.items(), key=operator.itemgetter(1), reverse=True)

return sortcount[0][0]

from PIL import Image

im=Image.open("C:/xx/xx/3.jpg")

fh=open("C:/xx/xx/3_20.txt","a")

width=im.size[0]

height=im.size[1]

for i in range(0,width):

for j in range(0,height):

cl=im.getpixel((i,j))

clall=cl[0]+cl[1]+cl[2]

if(clall==0):

fh.write("1")

else:

fh.write("0")

fh.write("\n")

fh.close()

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

# 建立一个函数取文件名前缀

def seplabel(fname):

filestr = fname.split(".")[0]

label = int(filestr.split("_")[0])

return label

def traindata():

labels = []

trainfile = listdir("D:/xx/traindata")

num = len(trainfile)

trainarr = zeros((num, 1024))

for i in range(0, num):

thisfname = trainfile[i]

thislabel = seplabel(thisfname)

labels.append(thislabel)

trainarr[i, :] = datatoarray("D:/xx/traindata/" + thisfname)

return trainarr, labels

def datatest():

trainarr, labels = traindata()

testlist = listdir("D:/xx/testdata")

tnum = len(testlist)

count = 0

for i in range(0, tnum):

thistestfile = testlist[i]

reallabel = seplabel(thistestfile)

testarr = datatoarray("D:/xx/" + thistestfile)

rknn = knn(3, testarr, trainarr, labels)

if (rknn != reallabel):

count = count + 1

print("kNN识别的是" + str(rknn) + "错误,真实类别是" + str(reallabel))

print("KNN正确率:" + str((tnum - count) / tnum))

datatest()

'''

#抽某一个测试文件出来进行试验

trainarr,labels=traindata()

testfile=listdir("D:/pythonlianxi/result/traindata")

for i in range(0,len(testfile)):

thisfname=testfile[i]

reallabel=seplabel(thisfname)

testarr[i,:]=datatoarray("D:/pythonlianxi/result/testdata/"+testfile[i])

rknn=knn(4,testarr,trainarr,labels)

print(rknn)

'''

knn分类算法实现手写体数字识别python相关推荐

  1. 基于KNN算法的手写体数字识别

    基于KNN算法的手写体数字识别 KNN分类算法是一种经典的分类算法,属于懒惰学习算法的一种. 1.算法原理 工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道 ...

  2. 手写体数字识别(Python+TensorFlow)

    注意:该作者博客已迁移至https://buxianshan.xyz 先看结果 在MNIST数据集10000张测试图片上的正确率 测试手写数字图片(20张) 原图 测试结果 源文件下载: CSDN下载 ...

  3. 【机器学习实验二】k-NN算法—改进约会网站以及手写体数字识别

    目录 一.改进约会网站 1.项目背景 2.数据收集 3.在约会网站中使用k-近邻算法的流程 4.代码实现 二.手写体数字识别 1.了解手写体数字识别 2.手写体数字识别思路 3.1.导入模块 3.2. ...

  4. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  5. KNN实现手写数字识别Python

    本文章总结了KNN算法字手写数字识别的应用,比较系统的对传统KNN和各种改进的KNN算法进行实现,由于完整的代码量较大(部分代码参考了机器学习实战),不适合全部贴出,但是博主乐于分享,有需要的话可以直 ...

  6. 基于matlab支持向量机SVM多分类手写体数字识别

    此程序为本人模式识别大作业,参考了网上的代码,并进行了一定的修改,希望对大家有所帮助! 此代码主要参考了以下文章: https://blog.csdn.net/Einperson/article/de ...

  7. 分类 手写体数字识别

    分类 手写体数字识别 1.数据集 分离训练集和测试集 2.训练一个二分类器 3.评价分类器的性能 使用交叉验证分类准确率 精准率和召回率 混淆矩阵 精准率和召回率的折衷 ROC 曲线 4.多分类器 5 ...

  8. python分类算法_用Python实现KNN分类算法

    本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下 KNN分类算法应该算得上是机器学习中最简单的分类算法了,所谓KNN即为K-NearestNeighbor(K个最邻 ...

  9. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

最新文章

  1. 代码重构中的几个概念
  2. R语言-包的安装、载入及使用方法
  3. pyqt 照片打上水印
  4. leetcode C++ 13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  5. MPP 二、Greenplum数据加载
  6. 天池-街景字符编码识别5-模型训练与验证
  7. js中数组的操作方法
  8. 惠普战66拆机加固态_惠普战66测评:想要提高办公效率,惠普是你的品质之选...
  9. 链接数据库 远程事务的处理方式
  10. 利用swap()函数来收缩内存
  11. JAVA计算机毕业设计电商后台管理系统Mybatis+系统+数据库+调试部署
  12. jsp 网页计数器代码
  13. 一个管理系统实体联系图
  14. javascript 代码转换为 typescript 代码
  15. php获取后缀的文件名,php获取文件名及其后缀方法一览
  16. OJ 1478 机器翻译
  17. 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
  18. python自己的手稿四之互动沟通
  19. [转载]当你的女友改名为玛丽,你怎能送她一首《菩萨蛮》?——台湾诗人余光中! (2013-08-21 20:55:03)
  20. Kotlin笔记(一)

热门文章

  1. 音频amr格式怎么转换成mp3?
  2. vc830l 说明书_数字万用表vc830l视频教程 视频
  3. JDBC连接MySQL数据库,访问数据库信息完成登录功能——保姆级详细教程(附所有java和jsp源代码)
  4. 长安大学期末计算机网络历年考题,长安大学计算机05-06年基础A试卷.doc
  5. 计算机硬件广告语,ASUS电脑广告语
  6. 求助找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
  7. Spark 杂记--- 键值对操作RDD
  8. QQ2006beta2sp3forsp1的下载地址
  9. 《网页制作与网站建设从入门到精通》版权
  10. python爬虫爬取《斗破苍穹》小说(入门必备)