利用sklearn来训练一个K近邻(k-Nearset Neighbor,KNN)分类器,用于识别数据集DBRHD的手写数字
比较KNN的识别效果与多层感知机的识别效果
DBRHD数据集的每个图片是一个由0或1组成的32*32的文本矩阵;
KNN的输入为图片矩阵展开的一个1024维的向量
步骤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*1024
fr=open(filename)
lines=fr.readlines()
for i in range(32):
for j in range(32):
retmat[i*32+j]=lines[i][j]
return retmat
def 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]=digit
dataset[i]=img2vector(path + '/' + filepath)
return dataset,hwlabels
def 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 +=1
main()