gusucode.com > 用mushrooms数据对模式识别课程讲述的各种模式分类方法matlab源码程序 > pattern-recognition-simulation/Parzen_hypercube.m
clc; clear; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %读取数据,取16个特征 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% samples = textread('data2000.txt'); samples = samples(:,[1:6,9:15,19:22]); %17列 第1列标号,16列特征 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %对样本进行归一化处理 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [ms ns]=size(samples); TMax=max(samples); TMin=min(samples); % 第一列是样本标签,从第二列开始归一化 for i=2:ns samples(:,i)=(samples(:,i)-TMin(i))/(TMax(i)-TMin(i)); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %将样本分为测试样本,第一类训练样本,第二类训练样本 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p = randperm(2000);%对1:2000的整数随机排序 experiment_test=samples(p(1:500),:);%测试样本 exper_test=experiment_test(:,2:ns);%测试样本,不带标签 experiment_train=samples(p(501:2000),:);%训练样本 index1=find(experiment_train(:,1)==1);%找到训练样本中第一类的行号 index2=find(experiment_train(:,1)==2);%找到训练样本中第二类的行号 exper_train_class1=experiment_train(index1,2:ns);%训练样本里属于第一类的样本,不带标签 exper_train_class2=experiment_train(index2,2:ns);%训练样本里属于第二类的样本,不带标签 [m n]=size(exper_test); [m1 n1]=size(exper_train_class1); [m2 n2]=size(exper_train_class2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %计算类条件概率密度 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %计算P(x/wi)=k/(nV) %取边长hn=1的d=10维超立方体 %首先计算落入每个待测样本点的超立方体的点的个数 hn=1; V=hn^n; K1=zeros(m,1);%记录第一类训练样本落入待测样本的超立方体的点的个数 K2=zeros(m,1);%记录第二类训练样本落入待测样本的超立方体的点的个数 R1=zeros(m,1);%记录待测样本在第一类的测试结果 R2=zeros(m,1);%记录待测样本在第二类的测试结果 Result=zeros(m,1);%记录最后分类结果 %先算第一类 for i=1:m%对每个待测样本 for j=1:m1%检测每个训练样本 flag=0; for k=1:n%检查每个分量abs(xi)<(hn/2),如果都小于则待测样本落入超立方体 if(abs(exper_test(i,k)-exper_train_class1(j,k))<(hn/2)) flag=flag+1; end end if flag==n K1(i,1)=K1(i,1)+1; end end R1(i,1)=K1(i,1)/(n*V); end %再算第二类 for i=1:m%对每个待测样本 for j=1:m2%检测每个训练样本 flag=0; for k=1:n%检查每个分量abs(xi)<(hn/2),如果都小于则待测样本落入超立方体 if(abs(exper_test(i,k)-exper_train_class2(j,k))<(hn/2)) flag=flag+1; end end if flag==n K2(i,1)=K2(i,1)+1; end end R2(i,1)=K2(i,1)/(n*V); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画类条件概率密度图,并分类 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %绘图 plot(R1,'-r','LineWidth',2); hold on; plot(R2,'-b','LineWidth',2); xlabel ('待测样本'); ylabel ('类条件概率密度 P(x|wi)'); title ('类条件概率密度图'); %分类 for i=1:m if R1(i,1)>R2(i,1) Result(i,1)=1; else Result(i,1)=2; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %分析结果 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [correct,error,ROC] = analyse_result(experiment_test,Result);