手写字识别
KNN实例
利用sklearn来训练一个K近邻(k-Nearset Neighbor,KNN)分类器,用于识别数据集DBRHD的手写数字
比较KNN的识别效果与多层感知机的识别效果
DBRHD数据集的每个图片是一个由0或1组成的32*32的文本矩阵;
KNN的输入为图片矩阵展开的一个1024维的向量
KNN手写识别实体构建
步骤1:建立工程并导入sklearn包
步骤2:加载训练数据
步骤3:构建KNN分类器
步骤4:测试集评价
在sklearnKNN中设置查找算法以及近邻点数量(k)值
KNN是一种懒惰学习法,没有学习过程,只在预测时去查找最近邻的点,数据集的输入就是构建KNN分类器的过程
import numpy as np
from os import listdir
from sklearn import neighbors #加载KNN模块def img2vector(filename):retmat=np.zeros([1024],int) #定义返回的矩阵,大小为1*1024fr=open(filename) lines=fr.readlines()for i in range(32):for j in range(32):retmat[i*32+j]=lines[i][j]return retmatdef readdataset(path):filelist=listdir(path)numfiles=len(filelist)dataset=np.zeros([numfiles,1024],int) #用于存放所有的数字文件hwlabels=np.zeros([numfiles]) #用于存放对应的标签(与神经网络的不同)for i in range(numfiles):filepath=filelist[i]digit=int(filepath.split('_')[0])hwlabels[i]=digitdataset[i]=img2vector(path + '/' + filepath)return dataset,hwlabelsdef main():train_dataset,train_hwlabels=readdataset('trainingdigits')for count in range(1,8):knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=count) #n_neighbors 分类器K值景响分析knn.fit(train_dataset,train_hwlabels)dataset,hwlabels=readdataset('testdigits')res=knn.predict(dataset)error_num=np.sum(res != hwlabels) #统计分类错误的数目num=len(dataset)print('n_neighbors',count,'total num:' ,num,'wrong num:',error_num,'truerate',1-error_num/float(num))count +=1main()