手写识别系统,KNN算法实现手写识别系统的准确率
(准确率=测试分对的样本数/总的样本数)
import numpy as np
from itertools import chain
from os import listdir#返回给定目录下的文件名,返回的是一个字符串列表
import operator
#想使用KNN算法,训练集以及训练集的标签,找到训练集以及训练集的标签
#KNN算法,每一次对一个点进行分组
def classify0(inx,dataset,labels,k):
#KNN算法第二步:计算未知点到所有已知类别点的距离
datasetSize=dataset.shape[0]#shape西数读取矩阵的长度,返回的是一个元组,(行数, 列数)
diffMat=np.tile(inx,(datasetSize,1))-dataset
sqDiffMat=diffMat**2
# print(sqDiffMat)
sqDistance=sqDiffMat.sum(axis=1)
# print(sqDiffMat. sum(axis=0) )
distance=np.sqrt(sqDistance)
sortedDistance=distance.argsort()
dict={}
for i in range(k):
votelable=labels[sortedDistance[i]]
#字典里面添加元素dict[key]=value,三种:key:value, get方法,setdefault
dict[votelable]=dict.get(votelable,0)+1#距离测试点最近的k个点的标签
sortedDict=sorted(dict.items(),key=operator.itemgetter(1),reverse=True)
# print(sortedDict)
return sortedDict[0][0]
hwlables=[]#存放训练集的标签
traingFileList=listdir('trainingDigits')#返回训练集文件夹下面所有的文件名
#print( traingFileList)
m=len(traingFileList)#训练集的样本点个数,是训练集矩阵的行数
trainingMat=np.zeros((m,1024))#行数的确定以及列数的确定
for i in range(m):
fileNameStr=traingFileList[i]#训练集文件夹下面对应索引为i的文件名
fileStr=fileNameStr.split(',')[0]
#print(fileStr)
classNumberStr=int(fileStr.split('_')[0])
#print(classNumberStr)
hwlables.append(classNumberStr)
trainingMat[i]=list(chain(*np.genfromtxt('trainingDigits/%s'%fileNameStr,delimiter=1)))#训练集
#找到训练集,以及为了计算正确率,还需要测试集的标签
testFileList=listdir("testDigits")
mTest=len(testFileList)
errcount=0
real=0
for i in range(mTest):
fileNameStr=testFileList[i]
fileStr=fileNameStr.split('.')[0]
classNumberStr=int(fileStr.split('_')[0])#测试点得标签,测试点得数据
VectorUnderTest=list(chain(*np.genfromtxt('testDigits/%s'%fileNameStr,delimiter=1)))
classifierResult=classify0(VectorUnderTest,trainingMat,hwlables,3) #KNN算法得到分类后的结果
# print("分类器分类的结果为: %d,实际得标签,为%d "%(classifierResult,classNumberStr))
if classifierResult != classNumberStr:
errcount += 1
else:
real+=1
print('测试的样本点个数:%f'%mTest)
print('实际发生错误的次数为:%f'%errcount)
print('错误率为:%f'%(errcount/mTest))
print('准确率为:%f'%(real/mTest))