python sklearn KNN 卷积神经网络-手写字识别实例

手写字识别

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*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()

python sklearn KNN 卷积神经网络-手写字识别实例_第1张图片

你可能感兴趣的:(python,python,sklearn,KNN,KNN)