knn分类算法实现手写体数字识别python

原创 2018年04月17日 17:55:51

之前写过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

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

利用KNN算法实现手写体数字的识别

本文利用KNN算法,实现手写体数字的识别
  • d1240673769
  • d1240673769
  • 2017-08-13 23:26:19
  • 473

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算法之一,算法思想很简单:从训练样本集中选择k个与测试样本“距离”最近的样本,这k个样本中出现频率最高的类别即作...
  • u012162613
  • u012162613
  • 2014-12-06 01:33:19
  • 23572

knn算法实现的数字手写识别

界面 :实现功能 :阿拉伯手写体的识别,正确率在80%以上。实现原理 :在写字板写出字体点击识别按钮后,字体会先被转为base64字符串然后发送到服务器端,服务器取得数据后对字符串解码并转为Java的...
  • kcetry
  • kcetry
  • 2016-04-02 10:19:40
  • 2086

Python实现KNN算法手写识别数字

本文实现用KNN算法实现手写识别数字功能。 语言:Python 训练材料:手写数字素材32*32像素from numpy import * import os from os import lis...
  • yjpeng125
  • yjpeng125
  • 2017-04-01 16:53:01
  • 724

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

一. KNN的原理 KNN的主要思想是找到与待测样本最接近的k个样本,然后把这k个样本出现次数最多的类别作为待测样本的类别。 二. 数据源 mnist数据集,包含42000张28*28的图片,可以从网...
  • whai362
  • whai362
  • 2016-07-03 00:17:06
  • 4981

【监督学习】1:KNN算法实现手写数字识别的三种方法

没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错)。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多,但是我运行了好几个,...
  • zzZ_CMing
  • zzZ_CMing
  • 2017-12-30 16:37:24
  • 980

【Python-Opencv】KNN手写体字符识别

步骤 1、  读入字符图像2、  将图像中的5000个字符数据分割,保存在numpy数组中。利用像素值作为特征集3、  将分割后的数组前50列为训练数据,后面50列为测试数据4、  生成标记5、  ...
  • licong_carp
  • licong_carp
  • 2015-04-18 14:41:35
  • 5763

基于KNN的手写体识别和数码管数字识别

大神符识别主要有数码管数字和手写体数字两种数码管:1.先进行整副图像的处理,可以看出数码管红色很明显,所以可以进行图像通道分离,然后对红色通道二值化效果: 2.进行轮廓提取(findcontours)...
  • qq_35971623
  • qq_35971623
  • 2017-10-21 16:31:56
  • 538

Matlab实现手写数字识别(PCA+KNN)

PCA降维的个人学习笔记
  • sky247391475
  • sky247391475
  • 2016-06-18 17:14:33
  • 5946
收藏助手
不良信息举报
您举报文章:knn分类算法实现手写体数字识别python
举报原因:
原因补充:

(最多只允许输入30个字)