资源简介
python实现K进邻算法对手写数字识别的一个小Demo,含代码和数据集。适合刚入门的小白。棒棒棒棒棒棒棒棒棒棒棒棒
代码片段和文件信息
# encoding:utf-8
import numpy as np
import os
import operator
# 训练数据集文件路径
Dir = ‘C:\Users\zqwke\Desktop\dataset\digits\\trainingDigits\\‘
# 测试数据集文件路径
Dir_test = ‘C:\Users\zqwke\Desktop\dataset\digits\\testDigits\\‘
‘‘‘
算法思路:
1、首先将(32x32)的数据矩阵转化为(1x1024)的格式。
然后把训练数据集最后转化为(Mx1024)的一个矩阵形式,记为A,每一行是一个手写数字
2、同样把要测试的单个手写数字转化为(1x1024)格式,然后重复训练样本个数的次数,得到(Mx1024)的格式,记为B,每一行都一样,M为训练样本总数
3、计算A与B之间的距离,得到单个手写数字与所有训练集的距离
4、对距离数组排序,得到距离最近的K个点
5、在K个点中出现频率最高的数字记为最后分类结果
‘‘‘
# 原数据矩阵转化方法,由 [32 32] → [1 1024]
def ImageVector(Dir filename):
# 创建一个1x1024的零矩阵
ImageVec = np.zeros(1024)
fr = open(Dir + filename)
# 将原数据储存进零矩阵
for i in range(32):
line = fr.readline()
for j in range(32):
ImageVec[32*i+j] = int(line[j])
return ImageVec
# 数据载入
def LoadData(Dir):
List = os.listdir(Dir) # 得到Dir路径下的所有文件目录
NumTraining = len(List) # 计算共用多少个文件
TrainingSet = np.zeros((NumTraining 1024)) # 构建一个Mx1024的矩阵 , M即为文件个数
Labels = np.zeros(NumTraining) # 标签矩阵
# 将训练集储存到一个训练矩阵
for i in range(NumTraining):
FileName = List[i]
int_x = ImageVector(Dir FileName)
for j in range(1024):
TrainingSet[i][j] = int_x[j]
Labels[i] = List[i][0] # 得到每个手写数据的对应标签数组
return TrainingSet Labels
# 计算距离,此处省略对差作平方,这一步放在Classify中,距离公式等于distance = (∑(trainingSet - 输入)**2)**0.5
def DisCompute(Array):
Distance = 0
for i in range(len(Array)):
Distance += Array[i]
return Distance**0.5
# KNN分类
def Classify(input DataSet Label k):
DataSize = DataSet.shape[0]
diffMat = np.tile(input (DataSize 1)) - DataSet
sqDiffMat = diffMat ** 2
Distance_squence = np.zeros(len(sqDiffMat)) # 距离序列
for i in range(len(sqDiffMat)):
distances = DisCompute(sqDiffMat[i])
Distance_squence[i] = distances
sortedDistance = Distance_squence.argsort() # 将距离按升序排列,argsort得到的是升序排序的索引值,而不是距离
classcount = {} # K近邻字典
# 把距离最近的前K个点的标签存进字典,Key为标签。value为出现频数
for i in range(k):
voteLabel = Label[sortedDistance[i]]
classcount[voteLabel] = classcount.get(voteLabel 0) + 1
# 得到排序后的字典,按value值排序,最终返回出现次数最高的类标签,即为分类结果
sortedClassCount = sorted(classcount.iteritems() key=operator.itemgetter(1) reverse=True)
return sortedClassCount[0][0]
def handWritingTest():
print ‘......Loading Training Date......‘
trainingset Label_x = LoadData(Dir)
print ‘......Loading Testing Date.......‘
testingset Label_y = LoadData(Dir_test)
testing_num = len(testingset)
count = 0
print ‘......Testing......‘
# 开始测试,识别正确输出Right和对应序号,识别错误输出False和对应序号
for i in range(testing_num):
output = Classify(testingset[i] trainingset Label_x 5)
if output == Label_y[i]:
print ‘Right %d‘ % i
count += 1
else:
print ‘False %d‘ % i
TheRightRate = float(count)/testing_num
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1088 2010-10-07 21:35 digits\testDigits\0_0.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_1.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_10.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_11.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_12.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_13.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_14.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_15.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_16.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_17.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_18.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_19.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_2.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_20.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_21.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_22.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_23.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_24.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_25.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_26.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_27.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_28.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_29.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_3.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_30.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_31.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_32.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_33.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_34.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_35.txt
文件 1088 2010-10-07 21:35 digits\testDigits\0_36.txt
............此处省略2850个文件信息
评论
共有 条评论