找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2396|回复: 0
收起左侧

MATLAB模式识别常用算法代码集合

[复制链接]
ID:475537 发表于 2019-2-10 15:27 | 显示全部楼层 |阅读模式
用于模式识别的常用算法,有数十个,都是源程序,可以自己查看
0.png

所有资料51hei提供下载:
MATLAB模式识别与智能计算.rar (40.42 KB, 下载次数: 18)


源程序如下:
  1. %函数名称:C_MONiTuiHuo()
  2. %参数:m_pattern:样品特征库;patternNum:样品数目
  3. %返回值:m_pattern:样品特征库
  4. %函数功能:按照基于模拟退火的K均值算法对全体样品进行分类
  5. function(m_pattern)=C_MONiTuiHuo(m_pattern,patternNum)
  6. (center=DisSelDlg();%获得距离计算类型
  7. (centerNum iterNum Tn Ts)=InputTuiHuoDlg()%获得类中心数和最大迭代次数,最大退火次数,
  8.                                         %退火速度
  9.     for i=1:patternNum
  10.         m_pattern(i).distance=inf;
  11.         m_pattern(i).category=-1;
  12.     end
  13.     randPattern=randpattern(patternNum);
  14.     for i=1:centerNum%初始化,随机分配centerNum个粒子为一类
  15.         m_pattern(randPattern(i)).category=i;
  16.         m_pattern(randPattern(i)).distance=0;
  17.         m_center(i).feature=m_pattern(randPattern(i)).feature;
  18.         m_center(i).index=i;
  19.         m_center(i).patternNum=1;
  20.     end
  21.     counter=0;%记录当前已经循环的次数
  22.     change=1;
  23. while(counter<iterNum&&change~=0)
  24.     counter=counter+1;
  25.     change=0;
  26.     for i=1:precenterNum%对所有样品重新归类
  27.         %计算第i个模式到各个聚类中心的最小距离
  28.         index=-1;
  29.         td=inf;
  30.         for j=1:precenterNum%对所有样品重新归类
  31.             %计算第i个模式到各个聚类中心的最小距离
  32.             index=-1;
  33.             distance=inf;
  34.             for j=1:centerNum
  35.                  tempDis=GetDistance(m_pattern(i),m_center(j),disType);
  36.                  if(distance>tempDis)
  37.                      distance=tempDis;
  38.                      index=j;
  39.                  end
  40.             end
  41.             %比较原中心号与新中心号
  42.             %相同:更新距离
  43.             %不同:新距离小,则归入新中心,更新距离,重新计算前后两个聚类中心模式
  44.             %2,新距离大于原距离,不处理
  45.             
  46.             if(m_pattern(i).category===index)%属于原类
  47.                 m_pattern(i).distance=distance;
  48.             else%不属于同类
  49.                 oldIndex=m_pattern(i).category;%记录原类号
  50.                 m_pattern(i).category=index;%归入新类
  51.                 m_pattern(i).distance=distance;
  52.                 if(oldIndex~=-1)
  53.                     m_center(oldIndex)=CalCenter(m_center(oldIndex),m_pattern,patternNum);
  54.                 end
  55.                 m_center(index)=CalCenter(m_center(index),m_pattern,patternNum);
  56.                 change=1;
  57.             end
  58.         end
  59.     end
  60.     %计算目标函数
  61.     AimFunc=0;
  62.     for j=1:patternNum
  63.          AimFunc=AimFunc+GetDistance(m_pattern(j),m_center(m_pattern(j).category),disType);
  64.     end
  65.     AimOld=AimFunc;
  66.     oldCenter=m_center;
  67.     oldPattern=m_pattern;
  68.     Tc=1;%当前退火次数
  69.     bestAim=AimOld;%最优目标函数
  70.     bestPattern=m_pattern;
  71.     MarkovLength=1000;
  72.     Tb=0;%最优目标函数首次出现的退火次数
  73.     T=AimFunc;%初始化温度参数
  74.     str=('K均值算法,最优目标函数值:'num2str(bestAim));
  75.     disp(str);
  76.     while(Tc<=Tn&&bestAim>0.1)
  77.         for inner=1:MarkovLength
  78.             %产生随机波动
  79.             p=fix(rand*patternNum+1);
  80.             t=fix(rand*(centerNum-1)+1);
  81.             if(m_pattern(p).category+1>centerNum)
  82.                 m_pattern(p).category=m_pattern(p).category+t-centerNum;
  83.             else
  84.                 m_pattern(p).category=m_pattern(p).category+1;
  85.             end
  86.             %重新计算聚类中心
  87.             for i=1:centerNum
  88.                 m_center(i)=CalCenter(m_center(i),m_pattern,patternNum);
  89.             end
  90.             AimFunc=0;
  91.             %计算目标函数
  92.             for j=1:patternNum
  93.                 AimFunc=AimFunc+GetDistance(m_pattern(j),m_center(m_pattern(j).category),disType;
  94.             end
  95.             e=AimFunc-AimOld;
  96.             %记录最优聚类
  97.             if(AimFunc<bestAim)
  98.                 bestAim=AimFunc;
  99.                 bestpattern=m_pattern;
  100.                 Tb=Tc;
  101.             end
  102.             if(bestAim==0)
  103.                 break;
  104.             end
  105.             %判断是否接受新解
  106.             if(e<0)
  107.                 AimOld=AimFunc;
  108.             else
  109.                 k=exp(-e/T);
  110.                 if(rand<exp(-e/T)
  111.                     AimOld=AimFunc;
  112.                 else
  113.                     m_pattern=oldPattern;
  114.                     m_center=oldCenter
  115.                 end
  116.             end
  117.         end
  118.         T=T*Ts;
  119.         if(T==0)
  120.             break;
  121.         end
  122.         Tc=Tc+1;
  123.         if(Tc-Tb>Tn/2)%连续Tn/2次退火无改变,结束退火
  124.             break;
  125.         end
  126.         str=('已退火 num2str(Tc-1) 次;"最优目标函数值:'num2str(bestAim));
  127.         disp(str);
  128.         m_pattern=bestPattern;
  129.     end
  130.     m_pattern=bestPattern;
  131.     str=('当前最优解出现时,已退火次数为:'num2str(Tb));
  132.     msgbox(str,'modal');
  133.   
复制代码


  1. %函数名称:CuCaoTrain()
  2. %参数:
  3. %返回值:
  4. %函数功能:粗糙分类训练
  5. function CuCaoTrain();
  6.     for i=1:10
  7.         for j=1:i-1
  8.             ruleStruct (i,j).rule=CuCao2ClassTrain(i,j);
  9.         end
  10.     end
  11.     %保存规则表
  12.     save ruleStruct ruleStruct;
  13.     msgbox(‘训练结束’)
  14. %函数名称:CuCaoTrainBK()
  15. %参数:class1:类别;class2:类别2;
  16. %返回值:newRule:规则
  17. %函数功能:粗糙集两类分类训练
  18. function newRule=CuCao2ClassTrain(class1,class2);
  19.     load tempelet pattern;
  20.     pattemNum=100;
  21.     bottom=zeros(1,patternNum*2);
  22.     bottom(1,1:patternNum)=0;
  23.     bottom(1,patternNum+1:patternNum*2);
  24.     x=[pattern(class1).feature(:,1:patternNum)
  25.         pattern(class2).feature(:,1:patternNum);bottom];
  26.     x=ceil(x');
  27.     %一致性检测
  28.     ruleNum=patternNum*2;
  29.     %去重规则和不一致规则
  30.     for m=1:ruleNum-1
  31.         if(m>ruleNum-1)
  32.             break;
  33.         end
  34.         for n=m+1:ruleNum
  35.             if(n>ruleNum)
  36.                 break;
  37.             end
  38.             while (x(m,1:25)==x(n,1:25))
  39.                 x(n,:)=[];
  40.                 ruleNum=ruleNum-1;
  41.                 if(n>ruleNum)
  42.                     break;
  43.                 end
  44.             end
  45.         end
  46.     end
  47.    
  48.     x=x(1:ruleNum,:);
  49.     ruleNumY1=0;
  50.     for m=1:ruleNum
  51.         if (x(m,26)==0)
  52.             ruleNumY1=ruleNumY1+1;
  53.         end
  54.     end
  55.     ruleNumY2=ruleNum-ruleNumY1;
  56.     classX=zero(ruleNum,ruleNum);%X属性等价集矩阵
  57.     ruleNum=zero(ruleNum,1);%等价集中元素个数
  58.     m=0;%等价集个数
  59.     n=1;
  60.     %计算条件X等价集
  61.     nun=0;
  62.     [classX,m,classNum]=CalTiaoJian(num,classX,x,ruleNum,classNum);
  63.     %决策D的等价集
  64.     classY1=zero(1,ruleNumY1);
  65.     classY2=zero(1,ruleNumY2);
  66.     classY1=1:ruleNumY1;
  67.     classY2=ruleNumY1+1;ruleNum;
  68.     %决策D的下近似集
  69.     X_Y1=zeros(1,ruleNumY1);
  70.     X_Y2=zeros(1,ruleNumY2);
  71.     [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,classNumY1);
  72.     %计算Pos(X,D)和r(X,D)
  73.     PosXD=[X_Y1 X_Y2];
  74.     rXD=size(PosXD,2)/(classNum);
  75.     xResrve=[];
  76.     for i=1:25;
  77.         %计算条件X-i的等价集
  78.         classX(:;:)=0;
  79.         [classX,m,classNum]=CalTiaoJian(i,classX,x,ruleNum,classNum);
  80.         %计算决策D的下近似集
  81.         [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,ruleNumY1);
  82.         %计算Pos(X-i,D)和r(X,D)
  83.         PosXid=[X_Y1 X_Y2];
  84.         import(i)=size(PosXiaD,2)/(ruleNum);
  85.         if(rXD-import(i)==0)
  86.             if(Consistent(i,x,ruleNumY1,ruleNumY2)==0)%如果删除后一致
  87.                 x(1:ruleNum,i);
  88.             else
  89.                 xReserve=[xReserve i];
  90.             end
  91.         else
  92.             xReserve=[xReserve i];
  93.         end
  94.     end
  95.    
  96.     %得到简化后的决策表
  97.     xReserve=[xReserve 26];
  98.     xNum=size(xReserve,2];
  99.     xNew=zeros(ruleNum,xNum];
  100.     for i=1:ruleNum
  101.         for j=1:xNum
  102.             xNew(i,j)=x(i,xReserve(j));
  103.         end
  104.     end
  105.     rule=[];
  106.     %计算条件X等价集
  107.     num=0;
  108.     classX(:,:);
  109.     [classX,m.classNum]=CalTiaoJian(num,classX,xNew,ruleNum,classNum);
  110.     %获取规则
  111.     cf=[];
  112.     for i=1:m
  113.         temp=zeros(1,2);
  114.         for j=1:classNum(i)
  115.             if(size(find(classY1==classX(i,j),2)=0)
  116.                 temp(1.1)=1;
  117.             end
  118.             if(size(find(classY2==classX(i,j),2)=0)
  119.                 temp(1,2)=1;
  120.             end
  121.             if(temp(1,1)==1&&temp(1,2)==1)
  122.                 cf=[cf i];%记录cf不为1的等价集
  123.                 break;
  124.             end
  125.         end
  126.     end
  127.     temp=size(cf,2);
  128.     if(temp=0)%舍去cf不为1的规则
  129.         for i=1:temp
  130.             for j=1:classNum(cf(i))
  131.                 xNew(classX(cf(i),j),xNum)=2;
  132.             end
  133.         end
  134.         for i=1:ruleNum
  135.             while(x(i,xNum)==2)
  136.                 xNew(i,:)=[];
  137.                 ruleNum=ruleNum-1;
  138.                 if(i>ruleNum)
  139.                     break;
  140.                 end
  141.             end
  142.             if(i>=ruleNum)
  143.                 break;
  144.             end
  145.         end
  146.     end
  147.     %简化规则表,去掉重复规则
  148.     for m=1:ruleNum-1
  149.         if(m>ruleNum-1)
  150.             break;
  151.         end
  152.         for n=m+1:ruleNum
  153.             if(n>ruleNum)
  154.                 break;
  155.             end
  156.             while(xNew(m,1:xNum)==xNew(n,1:xNum))
  157.                 xNew(n,:)=[];
  158.                 ruleNum=ruleNum-1;
  159.                 if(n>ruleNum)
  160.                     break;
  161.                 end
  162.             end
  163.         end
  164.     end
  165.    
  166.     ruleNumY1=0;
  167.     for m=1:ruleNum
  168.         if(xNew(m,xNum)==0)
  169.             ruleNumY1=ruleNumY1+1;
  170.         end
  171.     end
  172.     ruleNumY2=ruleNum-ruleNumY1;
  173.     for m=1:ruleNum
  174.         a=[];
  175.         for j=1:xNum
  176.             a=[a xNew(m,j)];
  177.         end
  178.         rule=[rule;a];
  179.     end
  180.     %规则化简
  181.     oldRule=rule;
  182.     newRule=[];
  183.     ruleJ=[];%统计可化简的规则
  184.     for i=1:size(xReserve,2)
  185.         rule=oldRule;
  186.         rule(:,)=0;
  187.         flag=false;
  188.         for m=1:ruleNumY1-1
  189.             for n=m+1:ruleNumY1
  190.                 if(rule(m,:)==rule(n,:))%可化简
  191.                     rule(m,i)=inf;
  192.                     newRule=[newRule;rule(m,:)];
  193.                     flag=ture;
  194.                     ruleJ=[ruleJ m n];
  195.                     break;
  196.                 end
  197.             end
  198.             if(flag)
  199.                 break;
  200.             end
  201.         end
  202.         flag=false;
  203.         for m=ruleNumY1+1:ruleNum-1
  204.             for n=m+1:ruleNum
  205.                 if(rule(m,:)==rule(n,:))%可简化
  206.                     rule(m,i)=inf;
  207.                     newRule=[newRule;rule(m.:)];
  208.                     flag=true;
  209.                     ruleJ=[ruleJ m n];
  210.                     break;
  211.                 end
  212.             end
  213.             if(flag)
  214.                 break;
  215.             end
  216.         end
  217.     end
  218.    
  219.     for i=1:ruleNum
  220.         b=size(find(ruleJ==i),2);
  221.         if(b==0)%该规则不可约简
  222.             newRule=[newRule;oldRule(i,:)];
  223.         end
  224.     end
  225.     newRule=[newRule;xReserve];
  226.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  227.     %函数名称:CalTiaoJian()
  228.     %参数:num:条件属性号;classX:条件等价集;x:决策表;
  229.     %     ruleNum:规则数;classNum:条件等价集中元素数
  230.     %返回值:classX:条件等价集;m:等价集个数;classNum;条件等价集中元素数
  231.     %函数功能:计算条件等价集
  232.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  233.     function [classX,m,classNum]=CalTiaoJian(num,classX,x,ruleNum,classNum)
  234.         if(num~=0)
  235.             x(1:ruleNum,num)=0;
  236.         end
  237.         xNum=size(x,2);
  238.         x(:,xNum)=0;
  239.         m=0;
  240.         for i=1:ruleNum
  241.             if(x(i,xNum)=0)
  242.                 continue;
  243.             else
  244.                 m=m+1;
  245.                 x(i,xNum)=m;
  246.                 n=1;
  247.                 classX(m.n)=i;
  248.             end
  249.             for j=i+1:ruleNum
  250.                 if (x(j,xNum)=0)
  251.                     continue;
  252.                 end
  253.                 if(x(i,1:xNum-1)==x(j,1:xNum-1))
  254.                     x(j,xNum)=m;
  255.                     n=n+1;
  256.                     classX(m,n)=j;
  257.                 end
  258.             end
  259.             classNum(m)=n;
  260.         end
  261.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  262.         %函数名称:CalXiaJinSi()
  263.         %参数:   classX:条件等价集;m等价集个数;classNumL条件等价集中元素数
  264.         %        ruleNumY1:决策属性1的等价集中的元素数
  265.         %返回值: X_Y1:决策属性1的下近似集;X_Y2:决策属性2的下近似集
  266.         %函数功能:计算各等价集的下近似集
  267.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  268.         
  269.         function [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,ruleNumY1)
  270.             %计算X_Y1,X_Y2
  271.             X_Y1=[];
  272.             X_Y2=[];
  273.             for i=1:m
  274.                 Y1=true;
  275.                 Y2=true;
  276.                 for j=1:classNum(i)
  277.                     if(classX(i,j)>ruleNumY1)%不属于X_Y1;
  278.                         Y1=false;
  279.                     else
  280.                         Y2=false;
  281.                     end
  282.                     if(~Y1&&~Y2)
  283.                         break;
  284.                     end
  285.                 end
  286.                 if(Y1)
  287.                     X_Y1=[X_Y1 classX(i,classNum(i))];
  288.                 else (Y2)
  289.                     X_Y2=[X_Y2 classX(i,classNum(i))];
  290.                 end
  291.             end
  292.             
  293.             %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  294.             %函数名称:Consistent()
  295.             %参数:    num:条件属性号;x:决策表;ruleNumY1:决策属性1的等价集中的元素数;
  296.             %         ruleNumY2:决策属性2的等价集中的元素数
  297.             %返回值:   cons:一致性变量:如果cons为0,则不一致,否则一致
  298.             %函数功能:一致性检测
  299.             %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  300.             function [cons]=Consistent(num,x:ruleNumY1,ruleNumY2)
  301.                 cons=1;
  302.                 x(:,num)=0;
  303.                 for i=1:ruleNumY1
  304.                     for j=ruleNumY1+1:ruleNumY1+ruleNumY2
  305.                         if(x(i,1:25))
  306.                             cons=0;
  307.                         end
  308.                     end
  309.                     
  310.                 end
  311. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  312. %函数名称:CuCao()
  313. %参数:sample:待测样品
  314. %返回值:result:分类结果
  315. %函数功能:粗糙集分类
  316. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  317. function result=CuCao(sample);
  318.     load ruleSrtuct;%读取已训练规则
  319.     num=zeros(1,10);
  320.     classnum=0;
  321.     for i=1:10
  322.         for j=1:i-1
  323.             %两类判别
  324.             G=CuCao2Class(i,j,sample,ruleStrut(i,j).rule);
  325.             if(G==0)
  326.                 num(i)=num(i)+1;
  327.             else if(G==1)
  328.                     num(j)=num(j)+1;
  329.                 end
  330.             end
  331.         end
  332.     end %课本没有这个end,我感觉需要加一个
  333.     [max_val,max_pos]=max(num);
  334.     result=max_pos-1;
  335.    
  336.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  337.     %函数名称:CuCao2Class()
  338.     %参数:class1:类别1;class2:类别2;sample:待测样品;rule:训练规则
  339.     %返回值:result:分类结果
  340.     %函数功能:粗糙集两类分类
  341.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  342.    
  343.     function result=CuCao2Class(class1.class2,sample,rule);
  344.         sample=ceil(sample);%测试样品二值化
  345.         ruleNum=size(rule,1)-1;%规则数
  346.         xNum=size(rule,2)-1;%属性数
  347.         result=-1;
  348.         for i=1:ruleNum %匹配规则
  349.             flag=true;
  350.             for j=1:xNum
  351.                 if(rule(i,j)=100&&sample(rule(ruleNum+1,j))
  352.                     flag=false;
  353.                     break;
  354.                 end
  355.             end
  356.             if(flag)
  357.                 result=rule(i,xNum+1);
  358.                 break;
  359.             end
  360.         end
  361.         %找最相近的规则
  362.         if (result==-1)
  363.             ruleSel=zeros(1,ruleNum);
  364.             for i=1:ruleNum
  365.                 for j=1:xNum
  366.                     if(rule(i,j)=100&&sample(rule(ruleNum+1,j))=rule(i,j)
  367.                         ruleSel(i)=ruleSel(i)+1;
  368.                     end
  369.                 end
  370.             end
  371.             [a b]=min(ruleSel);
  372.             result=rule(b,xNum+1);
  373.         end
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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