knn算法测试手写识别系统准确率

该博客介绍了一个使用KNN算法实现的手写数字识别系统,通过计算测试点与训练集中每个点的距离,找出最近的k个点,并根据它们的标签进行投票来决定分类结果。代码中加载了训练集和测试集,计算了准确率,结果显示了测试样本数、错误次数、错误率和准确率。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侬本多情。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值