Python 基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示:

手写数字识别系统的测试代码:

from numpy import *

import operator

from os import listdir

#inX    要检测的数据

#dataSet   数据集

#labels    结果集

#k      要对比的长度

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]                 #计算有多少行

# tile(inX, (dataSetSize,1))生成对应inX维度的矩阵,方便做差

diffMat = tile(inX, (dataSetSize,1)) - dataSet

sqDiffMat = diffMat**2                          #差求平方

sqDistances = sqDiffMat.sum(axis=1)             # axis=0, 表示列 axis=1, 表示行。

distances = sqDistances**0.5                   #开方

sortedDistIndicies = distances.argsort()       #argsort()排序,求下标

classCount={}

for i in range(k):

voteIlabel = labels[sortedDistIndicies[i]]   #通过下标索引分类

# 通过构造字典,记录分类频数

classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

# 对字段按值排序(从大到小)

sortedClassCount = sorted(classCount.items(),key=lambda classCount:classCount[1], reverse=True)

return sortedClassCount[0][0]

#手写字体识别

#首先,我们需要将图像格式化处理为一个向量,

# 把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量:

def img2vector(filename):

returnVect = zeros((1,1024))

fr = open(filename)

for i in range(32): #图片矩阵为32*32

lineStr = fr.readline()   #数据量大,所以使用readline

for j in range(32):

returnVect[0,32*i+j] = int(lineStr[j])

return returnVect

#手写字体识别

def handwritingClassTest():

hwLabels = []

trainingFileList = listdir(r‘trainingDigits‘)           #指定文件夹

m = len(trainingFileList)                                 #获取文件夹个数

trainingMat = zeros((m,1024))                             #构造m个1024比较矩阵

for i in range(m):

fileNameStr = trainingFileList[i]          #获取文件名

fileStr = fileNameStr.split(‘.‘)[0]        #按点把文件名字分割

classNumStr = int(fileStr.split(‘_‘)[0])   #按下划线把文件名字分割

hwLabels.append(classNumStr)               #实际值添加保存

trainingMat[i,:] = img2vector(r‘trainingDigits/%s‘ % fileNameStr)

testFileList = listdir(‘testDigits‘)        #测试数据

errorCount = 0.0

mTest = len(testFileList)

for i in range(mTest):#同上,处理测试数据

fileNameStr = testFileList[i]

fileStr = fileNameStr.split(‘.‘)[0]     #take off .txt

classNumStr = int(fileStr.split(‘_‘)[0])

vectorUnderTest = img2vector(r‘testDigits/%s‘ % fileNameStr)

classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)

print ("计算值: %d, 实际值: %d" % (classifierResult, classNumStr))

if (classifierResult != classNumStr): errorCount += 1.0

print ("\n错误出现次数: %d" % errorCount)

print ("\n错误率: %f" % (errorCount/float(mTest)))

handwritingClassTest()

结果:

计算值: 9, 实际值: 9

计算值: 9, 实际值: 9

计算值: 9, 实际值: 9

计算值: 9, 实际值: 9

计算值: 9, 实际值: 9

计算值: 9, 实际值: 9

错误出现次数: 10

错误率: 0.010571

可以看到KNN算法对内存消耗很大(本人12G),中文环境识别不敢想象。

时间: 2024-12-20 19:20:14

Python 基于KNN算法的手写识别系统的相关文章

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(

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

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算

基于K-近邻分类算法的手写识别系统

前言 本文将继续讲解K-近邻算法的项目实例 - 手写识别系统. 该系统在获取用户的手写输入后,判断用户写的是什么. 为了突出核心,简化细节,本示例系统中的输入为32x32矩阵,分类结果也均为数字.但对于汉字或者别的分类情形原理都是一样的. 有了前面学习的基础,下面直接进入项目开发步骤. 第一步:收集并准备数据 在用户主目录的trainingDigits子目录中,存放的是2000个样本数据. 每个样本一个文件,其中一部分如下所示: 文件命名格式为: 分类标签_标签内序号 如 0_20.txt 就表

K-近邻算法构造手写识别系统

为了简单起见,这里构造的系统只能识别数字0到9,需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素的黑白图像.尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理解,我们还是将图像转换为文本格式. ---1.收集数据:提供文本文件 该数据集合修改自“手写数字数据集的光学识别”-一文中的数据集合,该文登载于2010年10月3日的UCI机器学习资料库中http://archive.ics.uci.edu/ml.        ---2.准备数据:将图像转换为测试

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

《机器学习实战》之k-近邻算法(手写识别系统)

这个玩意和改进约会网站的那个差不多,它是提前把所有数字转换成了32*32像素大小的黑白图,然后转换成字符图(用0,1表示),将所有1024个像素点用一维矩阵保存下来,这样就可以通过knn计算欧几里得距离来得到最接近的答案. 1 import os 2 import operator 3 from numpy import * 4 5 def classify0(inX, dataSet, labels, k): 6 dataSetSize = dataSet.shape[0] 7 diffMat

基于tensorflow的MNIST手写识别

这个例子,是学习tensorflow的人员通常会用到的,也是基本的学习曲线中的一环.我也是! 这个例子很简单,这里,就是简单的说下,不同的tensorflow版本,相关的接口函数,可能会有不一样哟.在TensorFlow的中文介绍文档中的内容,有些可能与你使用的tensorflow的版本不一致了,我这里用到的tensorflow的版本就有这个问题. 另外,还给大家说下,例子中的MNIST所用到的资源图片,在原始的官网上,估计很多人都下载不到了.我也提供一下下载地址. 我的tensorflow的版

KNN算法案例--手写数字识别

import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors import KNeighborsClassifier # 加载数据 img_arr = plt.imread('./data/8/8_88.bmp') plt.imshow(img_arr) <matplotlib.image.AxesImage at 0x1786b073780> img_arr.sha

《机器学习实战》菜鸟学习笔记(三)kNN手写识别系统

目的:利用kNN识别数字0-9 材料:32*32的数字方阵(保存形式是文本文件) #-*-coding:utf-8-*- from numpy import * def img2vector(filename): #生成一个1*1024的array(zeros是numpy的函数,至于array与list区别这里就不多介绍了) returnVect = zeros((1,1024)) #使用open函数打开一个文本文件 fr = open(filename) #循环读取文件内容 for i in