找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

模式识别算法matlab程序 压缩 剪辑近邻法 parzen窗 c均值算法 bayes判别

查看数: 4026 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-4-22 21:12

正文摘要:

关于模式识别中的一些算法的matlab程序 bayes判别\ c均值算法\ parzen窗\ 剪辑近邻法\ 压缩近邻法\ 下面是剪辑近邻法源码: %% 剪辑近邻法 %% 初始化操作 clc close all clear all n=100; N= ...

回复

ID:1 发表于 2017-4-22 22:28
压缩近邻法:
  1. %% 剪辑近邻法
  2. %% 初始化操作
  3. clc
  4. close all
  5. clear all
  6. n=100;
  7. N=3*n;
  8. %% 训练样本1 二维联合正态分布的期望和方差,并随机产生 N 个样本
  9. mu1=[2 3];
  10. SIGMA1=[20 1.5; 1.5 30];
  11. tra_sam1 = mvnrnd(mu1,SIGMA1,N);
  12. %% 训练样本2 二维联合正态分布的期望和方差,并随机产生 N 个样本
  13. mu2=[10,11];
  14. SIGMA2=[20 1.5;1.5 30];
  15. tra_sam2 = mvnrnd(mu2,SIGMA2,N);
  16. %% 保留原始样本
  17. tra_sam_org1=tra_sam1;
  18. tra_sam_org2=tra_sam2;
  19. %% 对样本进行分类,分为3类
  20. num0=0; %% 用于存放上一次剪辑后样本个数
  21. edit_time=0; %% 记录剪辑次数
  22. m=0;    %% 记录没有可被剪辑样本的连续次数
  23. N1=N;N2=N; %%分别记录剪辑后样本类1,类2的样本个数
  24. while m<5
  25.     m11=1;m21=1;m31=1;
  26.     m12=1;m22=1;m32=1;
  27.     %% 将样本分成三类
  28.     for i=1:N1
  29.         t=rand;
  30.         if t<=0.33
  31.             cell_sam11(m11,:)=tra_sam1(i,:);
  32.             m11=m11+1;
  33.         elseif t<=0.66
  34.             cell_sam21(m21,:)=tra_sam1(i,:);
  35.             m21=m21+1;
  36.         else
  37.             cell_sam31(m31,:)=tra_sam1(i,:);
  38.             m31=m31+1;
  39.         end
  40.     end
  41.     for i=1:N2
  42.         s=rand;
  43.         if s<=0.33
  44.             cell_sam12(m12,:)=tra_sam2(i,:);
  45.             m12=m12+1;
  46.         elseif s<=0.66
  47.             cell_sam22(m22,:)=tra_sam2(i,:);
  48.             m22=m22+1;
  49.         else
  50.             cell_sam32(m32,:)=tra_sam2(i,:);
  51.             m32=m32+1;
  52.         end
  53.     end

  54.     %% 对子集进行剪辑,去掉错分的样本
  55.     %% 利用子集2,对子集1中的cell_sam11进行裁剪
  56.     cell_sam11=cutting(cell_sam11,cell_sam21,cell_sam22);
  57.     %% 利用子集2,对子集1中的cell_sam12进行裁剪
  58.     cell_sam12=cutting(cell_sam12,cell_sam22,cell_sam21);

  59.     %% 利用子集3,对子集2中的cell_sam21进行裁剪
  60.     cell_sam21=cutting(cell_sam21,cell_sam31,cell_sam32);
  61.     %% 利用子集3,对子集2中的cell_sam22进行裁剪
  62.     cell_sam22=cutting(cell_sam22,cell_sam32,cell_sam31);

  63.     %% 利用子集1,对子集3中的cell_sam31进行裁剪
  64.     cell_sam31=cutting(cell_sam31,cell_sam11,cell_sam12);
  65.     %% 利用子集1,对子集3中的cell_sam32进行裁剪
  66.     cell_sam32=cutting(cell_sam32,cell_sam12,cell_sam11);
  67.    
  68.     %% 剪辑后对样本进行整理,合并,组成新的训练样本
  69.     tra_sam1=[cell_sam11;cell_sam21;cell_sam31];
  70.     tra_sam2=[cell_sam12;cell_sam22;cell_sam32];
  71.     cell_sam11=zeros(1,2);cell_sam21=zeros(1,2);cell_sam31=zeros(1,2);
  72.     cell_sam12=zeros(1,2);cell_sam22=zeros(1,2);cell_sam32=zeros(1,2);
  73.     [a1,b1]=size(tra_sam1);  
  74.     [c1,d1]=size(tra_sam2);
  75.     num1=a1+c1;  %% 计算剩余总样本个数
  76.     N1=a1;
  77.     N2=c1;
  78.     if (num1-num0==0)
  79.         m=m+1;
  80.     else
  81.         m=0;
  82.     end
  83.     num0=num1;
  84.     edit_time=edit_time+1;
  85.       
  86. end
  87. %% -------------------%%
  88. %% 对剪辑好的样本进行压缩
  89. grabbag1=tra_sam1;
  90. grabbag2=tra_sam2;
  91. grabbag=[grabbag1;grabbag2];
  92. %% 计算存储器grabbag中类1和类2 的个数
  93. [gra_r1,column3]=size(grabbag1);
  94. [gra_r2,column4]=size(grabbag2);
  95. %% 随机选取一个样本放入store中,
  96. %% 可以等价为随机选取类1和类2,两个样本放入store中
  97. store1=grabbag1(1,:);
  98. grabbag1=grabbag1(2:gra_r1,:);
  99. gra_r1=gra_r1-1;
  100. store2=grabbag2(1,:);
  101. grabbag2=grabbag2(2:gra_r2,:);
  102. gra_r2=gra_r2-1;
  103. gra_r=gra_r1+gra_r2;

  104. sto_num1=2;%% store 的下标
  105. sto_num2=2;
  106. gra_tem=0;
  107. m=0;
  108. while(m<2*gra_r)
  109.     t=rand;
  110.     if t<=0.5 %% 如果属于类1
  111.         q=randperm(gra_r1);
  112.         for i=1:sto_num1-1
  113.             distance1(i)=norm(grabbag1(q(1),:)-store1(i,:));
  114.         end
  115.         for i=1:sto_num2-1
  116.             distance2(i)=norm(grabbag1(q(1),:)-store2(i,:));
  117.         end
  118.         dist_min1=min(distance1);
  119.         dist_min2=min(distance2);
  120.         if dist_min1>dist_min2 %% 如果判断错误,放入store
  121.             store1(sto_num1,:)=grabbag1(q(1),:);
  122.             grabbag1=[grabbag1(1:q(1)-1,:);grabbag1(q(1)+1:gra_r1,:)];
  123.             gra_r1=gra_r1-1;
  124.             sto_num1=sto_num1+1;
  125.         end
  126.     else  %% 如果属于类2
  127.         q=randperm(gra_r2);
  128.         for i=1:sto_num1-1
  129.             distance1(i)=norm(grabbag2(q(1),:)-store1(i,:));
  130.         end
  131.         for i=1:sto_num2-1
  132.             distance2(i)=norm(grabbag2(q(1),:)-store2(i,:));
  133.         end
  134.         dist_min1=min(distance1);
  135.         dist_min2=min(distance2);
  136.         if dist_min1<dist_min2 %% 如果判断错误,放入store
  137.             store2(sto_num2,:)=grabbag2(q(1),:);
  138.             grabbag2=[grabbag2(1:q(1)-1,:);grabbag2(q(1)+1:gra_r2,:)];
  139.             gra_r2=gra_r2-1;
  140.             sto_num2=sto_num2+1;
  141.         end   
  142.     end
  143.     gra_r=gra_r1+gra_r2;
  144.     if gra_r==gra_tem
  145.         m=m+1;
  146.     else
  147.         m=0;
  148.     end
  149.     gra_tem=gra_r;
  150. end
  151. edit_time
  152. sto_num1=sto_num1-1
  153. sto_num2=sto_num2-1
  154. %% 绘图
  155. %% 绘制原始样本点
  156. figure('NumberTitle', 'off', 'Name', '原样本点');
  157. scatter(tra_sam_org1(:,1),tra_sam_org1(:,2),'r')
  158. hold on
  159. scatter(tra_sam_org2(:,1),tra_sam_org2(:,2),50,'kx')
  160. axis([-20,30,-20,30])
  161. title('原始样本')
  162. xlabel('特征1')
  163. ylabel('特征2')
  164. legend('类1','类2',2)
  165. %% 绘制剪辑后样本点
  166. figure('NumberTitle', 'off', 'Name', '剪辑后样本点');
  167. scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
  168. hold on
  169. scatter(tra_sam2(:,1),tra_sam2(:,2),50,'kx')
  170. axis([-20,30,-20,30])
  171. title('算法终止时样本点')
  172. xlabel('特征1')
  173. ylabel('特征2')
  174. legend('类1','类2',2)
  175. %% 绘制压缩后样本点
  176. figure('NumberTitle', 'off', 'Name', '压缩后样本点');
  177. scatter(store1(:,1),store1(:,2),'r')
  178. hold on
  179. scatter(store2(:,1),store2(:,2),50,'kx')
  180. axis([-20,30,-20,30])
  181. title('压缩后样本点')
  182. xlabel('特征1')
  183. ylabel('特征2')
  184. legend('类1','类2',2)

  185.    
  186.    
  187.    
复制代码



ID:1 发表于 2017-4-22 22:27
c均值算法:
  1. %% c-均值算法
  2. %% 初始化操作
  3. clc
  4. close all
  5. clear all
  6. n=100;
  7. N=5*n;
  8. %% 产生5类随机样本,假设类别数已知
  9. %% 样本1
  10. mu1=[2 2];
  11. SIGMA1=[1 1.5; 1.5 3];
  12. tra_sam1 = mvnrnd(mu1,SIGMA1,n);
  13. %% 样本2
  14. mu2=[20,20];
  15. SIGMA2=[4 3;3 5];
  16. tra_sam2 = mvnrnd(mu2,SIGMA2,n);
  17. %% 样本3
  18. mu2=[11,11];
  19. SIGMA2=[1 1;1 2];
  20. tra_sam3 = mvnrnd(mu2,SIGMA2,n);
  21. %% 样本4
  22. mu2=[20,2];
  23. SIGMA2=[2 1.2;1.2 4];
  24. tra_sam4 = mvnrnd(mu2,SIGMA2,n);
  25. %% 样本5
  26. mu2=[2,20];
  27. SIGMA2=[3 2;2 3];
  28. tra_sam5 = mvnrnd(mu2,SIGMA2,n);
  29. tra_sam=[tra_sam1;tra_sam2;tra_sam3;tra_sam4;tra_sam5];
  30. %% 将样本随机分成5类,计算代表点
  31. n1=1;n2=1;n3=1;n4=1;n5=1;
  32. for i=1:N
  33.     t=rand;
  34.     if t<=0.2
  35.         cell_sam1(n1,:)=tra_sam(i,:);
  36.         n1=n1+1;
  37.     elseif t<=0.4
  38.         cell_sam2(n2,:)=tra_sam(i,:);
  39.         n2=n2+1;
  40.     elseif t<=0.6
  41.         cell_sam3(n3,:)=tra_sam(i,:);
  42.         n3=n3+1;
  43.     elseif t<0.8
  44.         cell_sam4(n4,:)=tra_sam(i,:);
  45.         n4=n4+1;
  46.     else
  47.         cell_sam5(n5,:)=tra_sam(i,:);
  48.         n5=n5+1;
  49.     end
  50. end
  51. %% 求每类的均值
  52. m1=mean(cell_sam1);
  53. m2=mean(cell_sam2);
  54. m3=mean(cell_sam3);
  55. m4=mean(cell_sam4);
  56. m5=mean(cell_sam5);
  57. m=[m1;m2;m3;m4;m5];

  58. cell_sam1=zeros(1,2);cell_sam2=zeros(1,2);
  59. cell_sam3=zeros(1,2);cell_sam4=zeros(1,2);
  60. cell_sam5=zeros(1,2);
  61. n1=1;n2=1;n3=1;n4=1;n5=1;
  62. %% 获得初始分类
  63. for i=1:N
  64.     for j=1:5
  65.         distance1(j)=norm(tra_sam(i,:)-m(j,:));
  66.     end
  67.     [a,b]=min(distance1);
  68.     if b==1
  69.         cell_sam1(n1,:)=tra_sam(i,:);
  70.         n1=n1+1;
  71.     elseif b==2
  72.         cell_sam2(n2,:)=tra_sam(i,:);
  73.         n2=n2+1;
  74.     elseif b==3
  75.         cell_sam3(n3,:)=tra_sam(i,:);
  76.         n3=n3+1;
  77.     elseif b==4
  78.         cell_sam4(n4,:)=tra_sam(i,:);
  79.         n4=n4+1;
  80.     else
  81.         cell_sam5(n5,:)=tra_sam(i,:);
  82.         n5=n5+1;
  83.     end   
  84. end
  85. %% 移动初始分类的样本使分类更加合理
  86. j_num=0;j_e1=0;
  87. while (j_num<5)
  88.     [cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5);
  89.     [cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5);
  90.     [cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5]=y_move(cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5);
  91.     [cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5]=y_move(cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5);
  92.     [cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4]=y_move(cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4);
  93.     %% 计算改变后的误差平方
  94.     m1=mean(cell_sam1);
  95.     m2=mean(cell_sam2);
  96.     m3=mean(cell_sam3);
  97.     m4=mean(cell_sam4);
  98.     m5=mean(cell_sam5);
  99.     [r1,c1]=size(cell_sam1);
  100.     [r2,c2]=size(cell_sam2);
  101.     [r3,c3]=size(cell_sam3);
  102.     [r4,c4]=size(cell_sam4);
  103.     [r5,c5]=size(cell_sam5);
  104.     j_e=0;
  105.     for i=1:r1
  106.         j_e=j_e+norm(cell_sam1(i,:)-m1)^2;
  107.     end
  108.     for i=1:r2
  109.         j_e=j_e+norm(cell_sam2(i,:)-m2)^2;
  110.     end
  111.     for i=1:r3
  112.         j_e=j_e+norm(cell_sam3(i,:)-m3)^2;
  113.     end
  114.     for i=1:r4
  115.         j_e=j_e+norm(cell_sam4(i,:)-m4)^2;
  116.     end
  117.     for i=1:r5
  118.         j_e=j_e+norm(cell_sam5(i,:)-m5)^2;
  119.     end
  120.     if abs(j_e1-j_e)<=0.001
  121.         j_num=j_num+1;
  122.     else
  123.         j_num=0;
  124.     end
  125.     j_e1=j_e;
  126. end

  127. % 绘图
  128. figure('NumberTitle', 'off', 'Name', '待分类样本点');
  129. scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
  130. hold on
  131. scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
  132. hold on
  133. scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
  134. hold on
  135. scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
  136. hold on
  137. scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
  138. title('待分类样本点')
  139. xlabel('特征1')
  140. ylabel('特征2')
  141. legend('类1','类2','类3','类4','类5',2)

  142. figure('NumberTitle', 'off', 'Name', '分类后样本点与正确分类样本点对比');
  143. scatter(cell_sam1(:,1),cell_sam1(:,2),'rx')
  144. hold on
  145. scatter(cell_sam2(:,1),cell_sam2(:,2),'kx')
  146. hold on
  147. scatter(cell_sam3(:,1),cell_sam3(:,2),'bx')
  148. hold on
  149. scatter(cell_sam4(:,1),cell_sam4(:,2),'yx')
  150. hold on
  151. scatter(cell_sam5(:,1),cell_sam5(:,2),'gx')
  152. hold on
  153. scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
  154. hold on
  155. scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
  156. hold on
  157. scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
  158. hold on
  159. scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
  160. hold on
  161. scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
  162. title('分类后样本点与正确分类样本点对比')
  163. xlabel('特征1')
  164. ylabel('特征2')
  165. legend('类1','类2','类3','类4','类5',2)




复制代码



ID:1 发表于 2017-4-22 22:26
bayes判别:
  1. % 初始设置
  2. clc
  3. clear all
  4. close all
  5. n=2000;           %% 样本个数为 2*n
  6. n1=0;n2=0;       %% 判别为类1的个数为n1,判别为类2的个数为n2
  7. m1=1;m2=1;
  8. error1to2=0;error2to1=0;     %% erroritoj为类i判为类j的错误个数
  9. % 类别1的二维联合正态分布的期望和方差,并随机产生 n 个样本
  10. mu1=[3 4];
  11. sigma1=[1 1.5; 1.5 3];
  12. x1 = mvnrnd(mu1,sigma1,n);

  13. %%类别2的二维联合正态分布的期望和方差,并随机产生 n 个样本
  14. mu2=[8,9];
  15. sigma2=[2 3;3 5];
  16. x2 = mvnrnd(mu2,sigma2,n);
  17. % 判别函数g(x)进行判别

  18. for i=1:1:n
  19.     if g(x1(i,:),mu1,sigma1)>=g(x1(i,:),mu2,sigma2)
  20.         X1(m1,:)=x1(i,:);
  21.         m1=m1+1;
  22.     else
  23.         X2(m2,:)=x1(i,:);
  24.         m2=m2+1;
  25.         erroe1to2=error1to2+1;
  26.     end
  27. end
  28. for i=1:1:n
  29.     if g(x2(i,:),mu1,sigma1)>=g(x2(i,:),mu2,sigma2)
  30.         X1(m1,:)=x2(i,:);
  31.         m1=m1+1;
  32.         error2to1=error2to1+1;
  33.     else
  34.         X2(m2,:)=x2(i,:);
  35.         m2=m2+1;
  36.     end
  37. end
  38. %%%%%%绘图
  39. % 原始样本点
  40. figure('NumberTitle', 'off', 'Name', '原样本点');
  41. scatter(x1(:,1),x1(:,2),'r')
  42. hold on
  43. scatter(x2(:,1),x2(:,2),50,'kx')
  44. title('原始样本')
  45. xlabel('样本1')
  46. ylabel('样本2')
  47. legend('第一类样本','第二类样本',0);
  48.   
  49. % 分类后样本点
  50. figure('NumberTitle', 'off', 'Name', '分类样本点');
  51. scatter(x1(:,1),x1(:,2),'r')
  52. hold on
  53. scatter(x2(:,1),x2(:,2),50,'kx')
  54. hold on
  55. scatter(X1(:,1),X1(:,2),'r')
  56. hold on
  57. scatter(X2(:,1),X2(:,2),50,'kx')
  58. title('分类后的样本')
  59. xlabel('样本1')
  60. ylabel('样本2')
  61. legend('第一类样本','第二类样本',0);
复制代码



小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表