手写体识别.docx

上传人:牧羊曲112 文档编号:2792711 上传时间:2023-02-25 格式:DOCX 页数:15 大小:164.78KB
返回 下载 相关 举报
手写体识别.docx_第1页
第1页 / 共15页
手写体识别.docx_第2页
第2页 / 共15页
手写体识别.docx_第3页
第3页 / 共15页
手写体识别.docx_第4页
第4页 / 共15页
手写体识别.docx_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《手写体识别.docx》由会员分享,可在线阅读,更多相关《手写体识别.docx(15页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上分 数: _ 任课教师签字:_ 课程作业学 年 学 期:20172018学年第二学期课 程 名 称:模式识别作 业 名 称:作业七学 生 姓 名:学 号:提 交 时 间:一、问题重述编写手写体识别大作业程序,要求做到以下几点内容:(1)针对“002手写数字数据集(1934+946)”数据包,进行手写体辨识。要求使用之前作业中用到的各类平均值为类中心的最小距离法、KNN近邻法(K取1,3,5)等等。(2)尝试使用神经网络方法进行辨识过程。(3)尝试70000个样本的数据集进行辨识,其中60000个用于训练,10000个用于测试。二、方法原理1、特征选择准则类别可分性准则

2、类别可分性准则值可以衡量样本的可分程度,取值越大表明样本可分程度越小,可以在一定程度上减小最终的分类错误率。类别可分性准则函数值J的计算公式如下所示其中C为类别数,m为总样本均值,mi为某一类均值,X表示样本数据。值得注意的是,并非J取值越大,最终的分类错误率就一定越小。最终的分类结果还与数据的分布特性以及分类器的选择有关。因此在J值取值只需满足条件即可,并非一定要取到最大值。2、特征提取方法PCA降维当样本数据维数较高时,程序当中涉及到矩阵的运算会有很大负荷,算法的执行效率会大幅降低。因此在训练之前,需要将样本数据进行降维处理。主成分分析法(简称PCA)可以减少样本数据的相关性,突出差异性,

3、是分类、辨识当中常用的降维方法。PCA可以将高维的数据降到任意低的维度上。但是为了保证样本数据不失真,一般要求PCA算法降维中,特征值占比不小于所有特征值之和75%。PCA算法的流程如下图所示。图1 PCA降维算法流程图3、分类器分类器是整个分类环节当中的最后一项,也是分类过程的关键所在。分类器分为训练和测试两个环节,相应的算法有很多。常用的有基于类均值的最小距离法、KNN近邻法等基本线性分类算法,以及向量机、神经网络等更为复杂的算法。分类结束之后,计算训练错误率和测试错误率,以此为标准检验分类器算法的优劣以及整个分类过程的好坏。(1)基于类均值的最小距离法基于类均值的最小距离法首先计算每类训

4、练样本的均值点,再分别计算每个均值点到测试样本的距离,测试样本归属于距其最近的均值点所在的数据类型。基于类均值的最小距离法算法流程如下:图2基于类均值的最小距离法流程图(2)KNN近邻法KNN近邻法源自近邻法。KNN近邻法不再单单寻找距测试样本最近的一个点,而是寻找距其最近的K个点,然后按这K个点类型确定测试样本的类型。判断原则往往是少数服从多数。K的取值一般取技术。特别的当K取1,这种方法就是常见的最近邻法。KNN近邻法算法流程如下:图3 KNN近邻法流程图(3)BP神经网络BP网络是一类多层的前馈神经网络。它的名字源于网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为B

5、P学习算法。BP算法的结构简单,可调的参数多,训练的算法也多,而且操作性好。BP网是前向网络的核心部分算法,是神经网络中最精华、最完美的部分。本次作业利用BP神经网络算法对样本进行训练测试,并将结果与其他方法进行对比。三、处理流程本次数据处理的数据集为32*32的二值图,保存格式为文本格式。训练样本数为1934,每个数字大约有200个;测试样本数为926个,每个数字个数从80到120不等。整个手写体辨识过程可以分为以下四个阶段:图4 手写体辨识过程1、数据采集本次作业所用到的数据为二值化后的文本文档,所以数据采集过程只需要将文档中的数据读取到工作空间即可。本阶段将训练样本和测试样本分别存到两个

6、元胞数组的变量当中,每个元胞含有10个元胞元素,依次对应09;每个元胞元素中存放n*1024的矩阵,其中n代表该类数据的样本数,1024代表二值化后的点阵数。2、特征生成本阶段将原始数据进行处理,提取出16个特征元素。特征生成过程如下。将32*32的二值化矩阵平均分成16块,求出每块矩阵当中非零元素的个数,作为相应的特征元素。如,将下图所示的一组数据(类型为0)提取特征值后为3 43 25 0 14 30 19 6 5 30 8 22 0 37 40 11。图5 一组类型为0的原始数据图6 将二值均值分块过程3、特征选择与提取为了减小计算量需要对样本进行降维处理。降维方式选择PCA算法,在保证

7、类别可分性准则值满足要求的条件下,特征值占比不小于75%即可。设n表示PCA处理后的维度。表1 1934与70000两个数据集PCA降维后不同维度下特征值占比和可分性准则PCA处理后的维度1934个样本的数据集70000个样本的数据集特征值占比(%)可分性准则值特征值占比(%)可分性准则值123.932.150424.570.9538243.932.166544.991.0704359.911.851460.020.7927468.871.622269.660.7709576.871.469577.500.7644682.671.307283.800.6956788.091.219788.93

8、0.6667890.791.199192.740.6298993.151.168195.460.60681095.321.124597.010.59411196.791.091597.940.58721297.921.070398.770.57981398.801.053999.310.57571499.421.041699.650.57281599.821.035399.930.5707161001.03161000.5700图7 1934样本集PCA降维后的特征值占比和可分性函数值图8 70000样本集PCA降维后的特征值占比和可分性函数值为了减少计算量,选择特征值占比大于75%维度最小的

9、情况。因此针对1934数据集,利用PCA将其降成5维;针对70000数据集,也利用PCA降成5维。4、分类器将PCA降维后的数据(5维)和不进行PCA降维的数据(16维),分别利用基于类均值的最小距离法训练、KNN近邻法(K取1、3、5)、BP神经网络算法,对样本进行训练、测试,得到的错误率如下:表2 分类错误率分类器1934样本集70000样本集PCA降维后原始数据PCA降维后原始数据训练测试训练测试训练测试训练测试最小距离0.22910.16810.16800.06550.39030.32280.32950.1739最近邻0.27180.11890.15860.03620.38320.25

10、260.32190.12543NN00.175500.070800.316900.17315NN0.1670.10700.06550.01030.34410.34200.18670.2738BP网络0.10340.15430.02900.05070.21270.28030.10010.1690对分类结果以及之前的工作总结,如下:(1) 当数据集规模变大时,各种算法的错误率会增加;(2) PCA降维后虽然会减小运算量,但是会增大分类错误率;(3) 几种方法中,基于类均值的最小距离分类算法的效果相对最差,BP神经网络的分类效果相对最好。(4) 对于基于类均值的最小距离法、KNN近邻法来说,训练错误

11、率一般是略高于测试错误率的。(5) 本作业次设计的分类器对于1934样本集分类效果比较令人满意,但是对于70000样本集分类效果很差,针对大样本数据,算法需要改进四、代码附录:1、 数据采集程序:%手写体识别:1934训练样本+946个测试样本%每个txt文件对应32*32的矩阵,转换为一条行向量。clear allclose all;clc;%保存训练数据PathTrain=cd,trainingDigits;TrainList=dir(PathTrain,*.txt);TrainData_Original=cell(10,1);%保存原始训练数据for i=1:length(TrainLi

12、st) fid=fopen(PathTrain,TrainList(i).name,r); temp_1=textscan(fid,%s); fclose(fid); temp_2=cell2mat(temp_11); temp_3=str2num(reshape(temp_2,1);%存成行向量 label=str2num(TrainList(i).name(1);%该行数据的数据类型 TrainData_Originallabel+1=TrainData_Originallabel+1;temp_3; endsave(TrainData,TrainData_Original);%保存测试数

13、据PathTest=cd,testDigits;TestList=dir(PathTest,*.txt);TestData_Original=cell(10,1);%保存原始测试数据for i=1:length(TestList) fid=fopen(PathTest,TestList(i).name,r); temp_1=textscan(fid,%s); fclose(fid); temp_2=cell2mat(temp_11); temp_3=str2num(reshape(temp_2,1);%存成行向量 label=str2num(TestList(i).name(1);%该行数据的

14、数据类型 TestData_Originallabel+1=TestData_Originallabel+1;temp_3; endsave(TestData,TestData_Original);2、 特征生成程序:clc;clear all;close all;load TrainData;load TestData;Feature_x=4;%水平分为四份Feature_y=4;%垂直分为四份TestData_Feature=cell(10,1); %存放加工后的测试数据TrainData_Feature=cell(10,1); %存放加工后的训练数据for i=1:length(Test

15、Data_Original) temp_1=TestData_Originali; for j=1:size(temp_1,1) temp_2=reshape(temp_1(j,:),32,32);%1*1024的将行向量重塑为32*32的矩阵 Feature=zeros(1,Feature_x*Feature_y);%存放每个元素的特征值 xy_i=0; for x_i=0:Feature_x-1 for y_i=0:Feature_y-1 xy_i=xy_i+1; temp_3=temp_2(32*x_i/Feature_x+1:32*(x_i+1)/Feature_x,32*y_i/Fe

16、ature_y+1:32*(y_i+1)/Feature_y); Feature(xy_i)=nnz(temp_3);%提取生成特征值 end end TestData_Featurei=TestData_Featurei; Feature; endendsave(TestData_Feature,TestData_Feature);for i=1:length(TrainData_Original) temp_1=TrainData_Originali; for j=1:size(temp_1,1) temp_2=reshape(temp_1(j,:),32,32); %1*1024的将行向

17、量重塑为32*32的矩阵 Feature=zeros(1,Feature_x*Feature_y); %存放每个元素的特征值 xy_i=0; for x_i=0:Feature_x-1 for y_i=0:Feature_y-1 xy_i=xy_i+1; temp_3=temp_2(32*x_i/Feature_x+1:32*(x_i+1)/Feature_x,32*y_i/Feature_y+1:32*(y_i+1)/Feature_y); Feature(xy_i)=nnz(temp_3); %提取生成特征值 end end TrainData_Featurei=TrainData_Fea

18、turei; Feature; endendsave(TrainData_Feature,TrainData_Feature);3、特征选择与提取%3、特征选取与提取load(TrainData_Feature);load(TestData_Feature);PCA_train=cell(16,1);Degree=zeros(16,1);for i=1:16 PCA_traini,Degree(i)=PCA_reduction(TrainData_Feature,i)%返回PCA变换矩阵endn_PCA=5; %选择降到5维,特征值占比大于75%TrainData_PCA=cell(lengt

19、h(TrainData_Feature),1);for i=1:length(TrainData_Feature) TrainData_PCAi=TrainData_Featurei*PCA_trainn_PCA;%训练样本降维endTestData_PCA=cell(length(TestData_Feature),1);for i=1:length(TestData_Feature) TestData_PCAi=TestData_Featurei*PCA_trainn_PCA;%测试样本降维endJ=Category_separability(TrainData_PCA)Degree_5=

20、Degree(n_PCA)save(TrainData_PCA,TrainData_PCA,J,Degree_5);save(TestData_PCA,TestData_PCA);%计算类别可分性准则函数J值function J=Category_separability(Data) ALL_C=length(Data);%类别数every_dimension=size(Data1,2);%数据的维度every_number=zeros(ALL_C,1);%每一类的数量every_mean=zeros(ALL_C,every_dimension);%每一类的平均值SW=0;SB=0;all_m

21、ean=every_mean(1,:);%计算总平均值for i=1:ALL_C every_number(i)=size(Datai,1); every_mean(i,:)=mean(Datai); all_mean=every_number(i)*every_mean(i,:)+all_mean; temp_1=pdist2(Datai,every_mean(i,:); Si=sum(temp_1.2); SW=SW+Si;endall_mean=all_mean/sum(every_number(:); for i=1:ALL_C%计算总平均值 SB=SB+every_number(i)

22、*(all_mean-every_mean(i,:)*(all_mean-every_mean(i,:); endJ=SB/SW;3、 分类器:%(1)基于类均值的最小距离法%A是训练样本,B是测试样本,输出output是错误率function output=Min_distance(A,B)TrainData=A;StudyData=B;%训练样本ALL_C_Train=length(TrainData);%类别数%学习样本ALL_C_Study=length(StudyData);%类别数every_number_Study=zeros(ALL_C_Study,1);%每一类的数量Stud

23、y=;for i=1:ALL_C_Study every_number_Study(i)=size(StudyDatai,1); Study=Study;StudyDatai;%求出所有的数据end%求训练样本均值Mean=;for i=1:ALL_C_Train Mean=Mean;mean(TrainDatai);end%基于类均值的最小距离法StudyType_all=zeros(size(Study,1),1);%判别结果StudyType_Standard_all=StudyType_all;for i=1:size(Study,1) ,m=min(pdist2(Study(i,:)

24、,Mean);%求最小距离 StudyType_all(i)=m-1;endnumber=0;for i=1:ALL_C_Study StudyType_Standard_all(number+1:number+every_number_Study(i)=ones(every_number_Study(i),1)*(i-1); number=every_number_Study(i)+number;endoutput=Error_rate(StudyType_all,StudyType_Standard_all);%(2)kNN近邻法,k取1、3、5.function output=Neare

25、stNeighbor_kNN(A,B,k)TrainData=A; StudyData=B; Train=; Study=;%A是训练样本, B是测试样本ALL_C_Train=length(TrainData);%类别数-训练样本 every_number_Train=zeros(ALL_C_Train,1);%每一类的数量for i=1:ALL_C_Train every_number_Train(i)=size(TrainDatai,1); Train=Train;TrainDatai;%求出所有的数据endALL_C_Study=length(StudyData);%类别-数学习样本e

26、very_number_Study=zeros(ALL_C_Study,1);%每一类的数量for i=1:ALL_C_Study every_number_Study(i)=size(StudyDatai,1); Study=Study;StudyDatai;%求出所有的数据endStudyType_all=zeros(size(Study,1),1);%判别结果mink_point=zeros(size(Study,1),k);%距测试样本最近的k个点所在矩阵的行号label=zeros(1,k);%距测试样本最近的k个点的类型for i=1:size(Study,1) %每一个样本-kN

27、N近邻法 S_distance=pdist2(Study(i,:),Train); ,m=sort(S_distance,ascend); mink_point(i,:)=m(1:k); for j=1:k %每个最近点所在的标签 number=0; for ii=1:ALL_C_Train if mink_point(i,j)=number+1&mink_point(i,j)50 %出现次数最多的值的频率,% StudyType_all(i)=countW(value,1); endendStudyType_Standard_all=StudyType_all; number=0;%标准值f

28、or i=1:ALL_C_StudyStudyType_Standard_all(number+1:number+every_number_Study(i)=ones(every_number_Study(i),1)*(i-1); number=every_number_Study(i)+number;endoutput=Error_rate(StudyType_all,StudyType_Standard_all); %测试样本的错误率(3)BP神经网络算法%BP神经网络%function error=BP_Networks(A,B)load TestData_PCA;load TrainD

29、ata_PCA;A=TrainData_PCA;B=TestData_PCA;%测试错误率TrainData=A;StudyData=B;%训练样本ALL_C_Train=length(TrainData);%类别数every_number_Train=zeros(ALL_C_Train,1);%每一类的数量Train=;TrainType_Standard=;for i=1:ALL_C_Train every_number_Train(i)=size(TrainDatai,1); TrainType_Standard=TrainType_Standard;ones(every_number_

30、Train(i),1)*(i);%训练样本类型 Train=Train;TrainDatai;%求出所有的数据end%学习样本StudyType_Standard_all=;Study=;ALL_C_Study=length(StudyData);%类别数every_number_Study=zeros(ALL_C_Study,1);%每一类的数量Study=;for i=1:ALL_C_Studyevery_number_Study(i)=size(StudyDatai,1);StudyType_Standard_all=StudyType_Standard_all;ones(every_n

31、umber_Study(i),1)*(i); Study=Study;StudyDatai;%求出所有的数据end%特征值归一化input,minI,maxI = premnmx( Train) ;%创建神经网络net = newff( minmax(input) , 30 10 , tansig logsig , traingdx ) ; % minmax(input):获取4个输入信号(存储在f1 f2 f3 f4中)的最大值和最小值; 10,3:表示使用2层网络,第一层网络节点数为10,第二层网络节点数为3; logsig purelin : 表示每一层相应神经元的激活函数;tansig

32、 即:第一层神经元的激活函数为logsig(线性函数),第二层为purelin(对数S形转移函数) traingdx:表示学习规则采用的学习方法为traingdx(梯度下降自适应学习率训练函数)%设置训练參数net.trainparam.show = 10 ;% 显示中间结果的周期net.trainparam.epochs = 1000 ;%最大迭代次数(学习次数)net.trainparam.goal = 0 ;%神经网络训练的目标误差net.trainParam.lr = 0.01 ;%学习速率(Learning rate)%开始训练%其中input为训练集的输入信号,对应output为训

33、练集的输出结果%构造输出矩阵s = length( TrainType_Standard) ;output = zeros( s ,ALL_C_Train ) ;for i = 1 : s output( i , TrainType_Standard( i ) ) = 1 ;endnet = train(net,input,output);%开始测试% 測试数据归一化testInput = tramnmx ( Study , minI, maxI ) ;% 仿真 其中net为训练后得到的网络,返回YY=sim(net,testInput); % 统计识别正确率s1,s2 = size(Y) ;hitNum = 0 ;for i = 1 : s2 m,Index = max(Y(:,i) ; if( Index=StudyType_Standard_all(i) hitNum = hitNum + 1 ; endenderror=1- hitNum / s2 ;%错误率sprintf(识别率是 %3.3f%,100 * hitNum / s2 )%正确率专心-专注-专业

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号