手写识别系统,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))










