KNN算法实现手写识别
import day1.KNN.封装KNN函数 as K
import numpy as np
#该函数能够读取文件夹里的文件
from os import listdir
#第一步 定义函数,读取一个文件的所有数字
def img2vector(filename):
returnVect=np.zeros((1,1024)) # 把32*32的数据转换成向量
fr=open(filename)
for i in range(32):
lineStr=fr.readline() #提出一行
for j in range(32):
returnVect[0,32*i+j]=int(lineStr[j]) #读出一行中所有的数字,第0行第32*i+j列
return returnVect
#第二步,读取文件夹里的所有文件,并生成列表
hwLabels=[] #样本标签,知道这个文件表示的是数字几
#读取文件夹中所有的文件名
trainingFileList=listdir(r'C:\Users\63096\Desktop\机器学习\MachineLearning-master\手写字识别——KNN算法\trainingDigits')
m=len(trainingFileList) #知道有多少个文件
trainingMat=np.zeros((m,1024)) # m行(m个文件) 1024列(一个文件有1024个数字) 训练数据
for i in range(m): #读取文件夹中的所有文件
fileNameStr=trainingFileList[i] #读取文件名
fileStr=fileNameStr.split('.')[0] #去掉文件名的后缀.txt,只剩下0_xxx
classNumStr=int(fileStr.split('_')[0]) #再去掉下划线后面的数字,只剩下开头数字0-9
hwLabels.append(classNumStr) #把开头的0-9 输入到样本标签中
trainingMat[i,:]=img2vector(r'C:\Users\63096\Desktop\机器学习\MachineLearning-master\手写字识别——KNN算法\trainingDigits/%s'%fileNameStr)
print(trainingMat)
#读取测试集执行KNN
testFileList=listdir(r'C:\Users\63096\Desktop\机器学习\MachineLearning-master\手写字识别——KNN算法\testDigits')
errorCount=0.0
mTest=len(testFileList) #获取测试集文件的个数
for i in range(mTest):
fileNameStr = testFileList[i] # 读取文件名
fileStr = fileNameStr.split('.')[0] # 去掉文件名的后缀.txt,只剩下0_xxx
classNumStr = int(fileStr.split('_')[0]) # 再去掉下划线后面的数字,只剩下开头数字0-9
testMat=img2vector(r'C:\Users\63096\Desktop\机器学习\MachineLearning-master\手写字识别——KNN算法\testDigits/%s'%fileNameStr)
results=K.knn(testMat,trainingMat,hwLabels,3) #一次得到一个文件的结果,所以要循环测试集文件的个数次
print("KNN得到的结果为:",results,"实际结果为:",classNumStr)
if results!=classNumStr:
errorCount+=1.0
print('错误数量为:%d'%errorCount)
print('错误率为:',((errorCount/float(mTest))*100),"%")