K-近邻算法实现手写识别Python代码的实现
“””
Created on Tue Mar 19 08:29:41 2019
使用K-近邻算法实现手写识别系统
@author: 灯前目力虽非昔,犹课蝇头二万言
“””
import numpy as np
from os import listdir
import operator
def img2Vector(filename):
”’
将图片文件32×32转换成[1×1024]向量
filename:文件名
”’
#初始化向量
resultVector = np.zeros((1,1024))
#打开文件
file = open(filename)
#对读取文件的32X32的数据逐行处理
for i in range(32):
lineStr = file.readline()
for j in range(32):
resultVector[0,32*i+j] = int(lineStr[j])
return resultVector
#使用K-近邻算法对输入的数据进行分类
def kNN_classify(inX,dataMat,labels,k):
”’
inX:输入的向量
dataMat:训练样本数据集
labels:训练样本的分类标签
k:选择近邻的个数
”’
#计算矩阵的行数
dataSize = dataMat.shape[0]
#计算距离
diffMat = np.tile(inX,(dataSize,1)) – dataMat
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance**0.5
#对距离进行排序,然后提取其索引赋值给sortedDistance
sortedDistance = distance.argsort()
classCount={}
for i in range(k):
voteLabel = labels[sortedDistance[i]]
classCount[voteLabel] = classCount.get(voteLabel,0)+1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
def handwritingClassTest():
”’
手写识别数字测试
”’
labels =[]
trainingFileList = listdir(‘digits/trainingDigits’)
m = len(trainingFileList)
trainingMat = np.zeros((m,1024))
errorCount=0
#获取训练集
for i in range(m):
#获取文件全称
fileNameStr = trainingFileList[i]
#获取文件名
fileStr = fileNameStr.split(“.”)[0]
#获取对应的标签
classNumStr = int(fileStr.split(“_”)[0])
labels.append(classNumStr)
#将对应的文件转换成向量
trainingMat[i,:] = img2Vector(“digits/trainingDigits/%s” %fileNameStr)
#测试
testFileList = listdir(“digits/testDigits”)
errorCount = 0
mTest = len(testFileList)
#获取测试集
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split(“.”)[0]
classNumStr = int(fileStr.split(“_”)[0])
#使用kNN算法对测试数据集进行测试
vectorsForTest = img2Vector(“digits/testDigits/%s” %fileNameStr)
#分类
classifierResult = kNN_classify(vectorsForTest,trainingMat,labels,3)
if classifierResult != classNumStr:
print(“分类器是%d,结果是%d” %(classifierResult,classNumStr))
errorCount+=1;
print(“\n错误的总数量是:%d,测试的总数是%d” %(errorCount,mTest))
print(“\n正确率的百分比是%f” %(1-errorCount/float(mTest)))
#主方法入口
if __name__==’__main__’:
handwritingClassTest()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195573.html