用于模式识别的常用算法,有数十个,都是源程序,可以自己查看
所有资料51hei提供下载:
MATLAB模式识别与智能计算.rar
(40.42 KB, 下载次数: 18)
源程序如下:
- %函数名称:C_MONiTuiHuo()
- %参数:m_pattern:样品特征库;patternNum:样品数目
- %返回值:m_pattern:样品特征库
- %函数功能:按照基于模拟退火的K均值算法对全体样品进行分类
- function(m_pattern)=C_MONiTuiHuo(m_pattern,patternNum)
- (center=DisSelDlg();%获得距离计算类型
- (centerNum iterNum Tn Ts)=InputTuiHuoDlg()%获得类中心数和最大迭代次数,最大退火次数,
- %退火速度
- for i=1:patternNum
- m_pattern(i).distance=inf;
- m_pattern(i).category=-1;
- end
- randPattern=randpattern(patternNum);
- for i=1:centerNum%初始化,随机分配centerNum个粒子为一类
- m_pattern(randPattern(i)).category=i;
- m_pattern(randPattern(i)).distance=0;
- m_center(i).feature=m_pattern(randPattern(i)).feature;
- m_center(i).index=i;
- m_center(i).patternNum=1;
- end
- counter=0;%记录当前已经循环的次数
- change=1;
- while(counter<iterNum&&change~=0)
- counter=counter+1;
- change=0;
- for i=1:precenterNum%对所有样品重新归类
- %计算第i个模式到各个聚类中心的最小距离
- index=-1;
- td=inf;
- for j=1:precenterNum%对所有样品重新归类
- %计算第i个模式到各个聚类中心的最小距离
- index=-1;
- distance=inf;
- for j=1:centerNum
- tempDis=GetDistance(m_pattern(i),m_center(j),disType);
- if(distance>tempDis)
- distance=tempDis;
- index=j;
- end
- end
- %比较原中心号与新中心号
- %相同:更新距离
- %不同:新距离小,则归入新中心,更新距离,重新计算前后两个聚类中心模式
- %2,新距离大于原距离,不处理
-
- if(m_pattern(i).category===index)%属于原类
- m_pattern(i).distance=distance;
- else%不属于同类
- oldIndex=m_pattern(i).category;%记录原类号
- m_pattern(i).category=index;%归入新类
- m_pattern(i).distance=distance;
- if(oldIndex~=-1)
- m_center(oldIndex)=CalCenter(m_center(oldIndex),m_pattern,patternNum);
- end
- m_center(index)=CalCenter(m_center(index),m_pattern,patternNum);
- change=1;
- end
- end
- end
- %计算目标函数
- AimFunc=0;
- for j=1:patternNum
- AimFunc=AimFunc+GetDistance(m_pattern(j),m_center(m_pattern(j).category),disType);
- end
- AimOld=AimFunc;
- oldCenter=m_center;
- oldPattern=m_pattern;
- Tc=1;%当前退火次数
- bestAim=AimOld;%最优目标函数
- bestPattern=m_pattern;
- MarkovLength=1000;
- Tb=0;%最优目标函数首次出现的退火次数
- T=AimFunc;%初始化温度参数
- str=('K均值算法,最优目标函数值:'num2str(bestAim));
- disp(str);
- while(Tc<=Tn&&bestAim>0.1)
- for inner=1:MarkovLength
- %产生随机波动
- p=fix(rand*patternNum+1);
- t=fix(rand*(centerNum-1)+1);
- if(m_pattern(p).category+1>centerNum)
- m_pattern(p).category=m_pattern(p).category+t-centerNum;
- else
- m_pattern(p).category=m_pattern(p).category+1;
- end
- %重新计算聚类中心
- for i=1:centerNum
- m_center(i)=CalCenter(m_center(i),m_pattern,patternNum);
- end
- AimFunc=0;
- %计算目标函数
- for j=1:patternNum
- AimFunc=AimFunc+GetDistance(m_pattern(j),m_center(m_pattern(j).category),disType;
- end
- e=AimFunc-AimOld;
- %记录最优聚类
- if(AimFunc<bestAim)
- bestAim=AimFunc;
- bestpattern=m_pattern;
- Tb=Tc;
- end
- if(bestAim==0)
- break;
- end
- %判断是否接受新解
- if(e<0)
- AimOld=AimFunc;
- else
- k=exp(-e/T);
- if(rand<exp(-e/T)
- AimOld=AimFunc;
- else
- m_pattern=oldPattern;
- m_center=oldCenter
- end
- end
- end
- T=T*Ts;
- if(T==0)
- break;
- end
- Tc=Tc+1;
- if(Tc-Tb>Tn/2)%连续Tn/2次退火无改变,结束退火
- break;
- end
- str=('已退火 num2str(Tc-1) 次;"最优目标函数值:'num2str(bestAim));
- disp(str);
- m_pattern=bestPattern;
- end
- m_pattern=bestPattern;
- str=('当前最优解出现时,已退火次数为:'num2str(Tb));
- msgbox(str,'modal');
-
复制代码
- %函数名称:CuCaoTrain()
- %参数:
- %返回值:
- %函数功能:粗糙分类训练
- function CuCaoTrain();
- for i=1:10
- for j=1:i-1
- ruleStruct (i,j).rule=CuCao2ClassTrain(i,j);
- end
- end
- %保存规则表
- save ruleStruct ruleStruct;
- msgbox(‘训练结束’)
- %函数名称:CuCaoTrainBK()
- %参数:class1:类别;class2:类别2;
- %返回值:newRule:规则
- %函数功能:粗糙集两类分类训练
- function newRule=CuCao2ClassTrain(class1,class2);
- load tempelet pattern;
- pattemNum=100;
- bottom=zeros(1,patternNum*2);
- bottom(1,1:patternNum)=0;
- bottom(1,patternNum+1:patternNum*2);
- x=[pattern(class1).feature(:,1:patternNum)
- pattern(class2).feature(:,1:patternNum);bottom];
- x=ceil(x');
- %一致性检测
- ruleNum=patternNum*2;
- %去重规则和不一致规则
- for m=1:ruleNum-1
- if(m>ruleNum-1)
- break;
- end
- for n=m+1:ruleNum
- if(n>ruleNum)
- break;
- end
- while (x(m,1:25)==x(n,1:25))
- x(n,:)=[];
- ruleNum=ruleNum-1;
- if(n>ruleNum)
- break;
- end
- end
- end
- end
-
- x=x(1:ruleNum,:);
- ruleNumY1=0;
- for m=1:ruleNum
- if (x(m,26)==0)
- ruleNumY1=ruleNumY1+1;
- end
- end
- ruleNumY2=ruleNum-ruleNumY1;
- classX=zero(ruleNum,ruleNum);%X属性等价集矩阵
- ruleNum=zero(ruleNum,1);%等价集中元素个数
- m=0;%等价集个数
- n=1;
- %计算条件X等价集
- nun=0;
- [classX,m,classNum]=CalTiaoJian(num,classX,x,ruleNum,classNum);
- %决策D的等价集
- classY1=zero(1,ruleNumY1);
- classY2=zero(1,ruleNumY2);
- classY1=1:ruleNumY1;
- classY2=ruleNumY1+1;ruleNum;
- %决策D的下近似集
- X_Y1=zeros(1,ruleNumY1);
- X_Y2=zeros(1,ruleNumY2);
- [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,classNumY1);
- %计算Pos(X,D)和r(X,D)
- PosXD=[X_Y1 X_Y2];
- rXD=size(PosXD,2)/(classNum);
- xResrve=[];
- for i=1:25;
- %计算条件X-i的等价集
- classX(:;:)=0;
- [classX,m,classNum]=CalTiaoJian(i,classX,x,ruleNum,classNum);
- %计算决策D的下近似集
- [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,ruleNumY1);
- %计算Pos(X-i,D)和r(X,D)
- PosXid=[X_Y1 X_Y2];
- import(i)=size(PosXiaD,2)/(ruleNum);
- if(rXD-import(i)==0)
- if(Consistent(i,x,ruleNumY1,ruleNumY2)==0)%如果删除后一致
- x(1:ruleNum,i);
- else
- xReserve=[xReserve i];
- end
- else
- xReserve=[xReserve i];
- end
- end
-
- %得到简化后的决策表
- xReserve=[xReserve 26];
- xNum=size(xReserve,2];
- xNew=zeros(ruleNum,xNum];
- for i=1:ruleNum
- for j=1:xNum
- xNew(i,j)=x(i,xReserve(j));
- end
- end
- rule=[];
- %计算条件X等价集
- num=0;
- classX(:,:);
- [classX,m.classNum]=CalTiaoJian(num,classX,xNew,ruleNum,classNum);
- %获取规则
- cf=[];
- for i=1:m
- temp=zeros(1,2);
- for j=1:classNum(i)
- if(size(find(classY1==classX(i,j),2)=0)
- temp(1.1)=1;
- end
- if(size(find(classY2==classX(i,j),2)=0)
- temp(1,2)=1;
- end
- if(temp(1,1)==1&&temp(1,2)==1)
- cf=[cf i];%记录cf不为1的等价集
- break;
- end
- end
- end
- temp=size(cf,2);
- if(temp=0)%舍去cf不为1的规则
- for i=1:temp
- for j=1:classNum(cf(i))
- xNew(classX(cf(i),j),xNum)=2;
- end
- end
- for i=1:ruleNum
- while(x(i,xNum)==2)
- xNew(i,:)=[];
- ruleNum=ruleNum-1;
- if(i>ruleNum)
- break;
- end
- end
- if(i>=ruleNum)
- break;
- end
- end
- end
- %简化规则表,去掉重复规则
- for m=1:ruleNum-1
- if(m>ruleNum-1)
- break;
- end
- for n=m+1:ruleNum
- if(n>ruleNum)
- break;
- end
- while(xNew(m,1:xNum)==xNew(n,1:xNum))
- xNew(n,:)=[];
- ruleNum=ruleNum-1;
- if(n>ruleNum)
- break;
- end
- end
- end
- end
-
- ruleNumY1=0;
- for m=1:ruleNum
- if(xNew(m,xNum)==0)
- ruleNumY1=ruleNumY1+1;
- end
- end
- ruleNumY2=ruleNum-ruleNumY1;
- for m=1:ruleNum
- a=[];
- for j=1:xNum
- a=[a xNew(m,j)];
- end
- rule=[rule;a];
- end
- %规则化简
- oldRule=rule;
- newRule=[];
- ruleJ=[];%统计可化简的规则
- for i=1:size(xReserve,2)
- rule=oldRule;
- rule(:,)=0;
- flag=false;
- for m=1:ruleNumY1-1
- for n=m+1:ruleNumY1
- if(rule(m,:)==rule(n,:))%可化简
- rule(m,i)=inf;
- newRule=[newRule;rule(m,:)];
- flag=ture;
- ruleJ=[ruleJ m n];
- break;
- end
- end
- if(flag)
- break;
- end
- end
- flag=false;
- for m=ruleNumY1+1:ruleNum-1
- for n=m+1:ruleNum
- if(rule(m,:)==rule(n,:))%可简化
- rule(m,i)=inf;
- newRule=[newRule;rule(m.:)];
- flag=true;
- ruleJ=[ruleJ m n];
- break;
- end
- end
- if(flag)
- break;
- end
- end
- end
-
- for i=1:ruleNum
- b=size(find(ruleJ==i),2);
- if(b==0)%该规则不可约简
- newRule=[newRule;oldRule(i,:)];
- end
- end
- newRule=[newRule;xReserve];
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %函数名称:CalTiaoJian()
- %参数:num:条件属性号;classX:条件等价集;x:决策表;
- % ruleNum:规则数;classNum:条件等价集中元素数
- %返回值:classX:条件等价集;m:等价集个数;classNum;条件等价集中元素数
- %函数功能:计算条件等价集
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function [classX,m,classNum]=CalTiaoJian(num,classX,x,ruleNum,classNum)
- if(num~=0)
- x(1:ruleNum,num)=0;
- end
- xNum=size(x,2);
- x(:,xNum)=0;
- m=0;
- for i=1:ruleNum
- if(x(i,xNum)=0)
- continue;
- else
- m=m+1;
- x(i,xNum)=m;
- n=1;
- classX(m.n)=i;
- end
- for j=i+1:ruleNum
- if (x(j,xNum)=0)
- continue;
- end
- if(x(i,1:xNum-1)==x(j,1:xNum-1))
- x(j,xNum)=m;
- n=n+1;
- classX(m,n)=j;
- end
- end
- classNum(m)=n;
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %函数名称:CalXiaJinSi()
- %参数: classX:条件等价集;m等价集个数;classNumL条件等价集中元素数
- % ruleNumY1:决策属性1的等价集中的元素数
- %返回值: X_Y1:决策属性1的下近似集;X_Y2:决策属性2的下近似集
- %函数功能:计算各等价集的下近似集
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- function [X_Y1,X_Y2]=CalXiaJinSi(classX,m,classNum,ruleNumY1)
- %计算X_Y1,X_Y2
- X_Y1=[];
- X_Y2=[];
- for i=1:m
- Y1=true;
- Y2=true;
- for j=1:classNum(i)
- if(classX(i,j)>ruleNumY1)%不属于X_Y1;
- Y1=false;
- else
- Y2=false;
- end
- if(~Y1&&~Y2)
- break;
- end
- end
- if(Y1)
- X_Y1=[X_Y1 classX(i,classNum(i))];
- else (Y2)
- X_Y2=[X_Y2 classX(i,classNum(i))];
- end
- end
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %函数名称:Consistent()
- %参数: num:条件属性号;x:决策表;ruleNumY1:决策属性1的等价集中的元素数;
- % ruleNumY2:决策属性2的等价集中的元素数
- %返回值: cons:一致性变量:如果cons为0,则不一致,否则一致
- %函数功能:一致性检测
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function [cons]=Consistent(num,x:ruleNumY1,ruleNumY2)
- cons=1;
- x(:,num)=0;
- for i=1:ruleNumY1
- for j=ruleNumY1+1:ruleNumY1+ruleNumY2
- if(x(i,1:25))
- cons=0;
- end
- end
-
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %函数名称:CuCao()
- %参数:sample:待测样品
- %返回值:result:分类结果
- %函数功能:粗糙集分类
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function result=CuCao(sample);
- load ruleSrtuct;%读取已训练规则
- num=zeros(1,10);
- classnum=0;
- for i=1:10
- for j=1:i-1
- %两类判别
- G=CuCao2Class(i,j,sample,ruleStrut(i,j).rule);
- if(G==0)
- num(i)=num(i)+1;
- else if(G==1)
- num(j)=num(j)+1;
- end
- end
- end
- end %课本没有这个end,我感觉需要加一个
- [max_val,max_pos]=max(num);
- result=max_pos-1;
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %函数名称:CuCao2Class()
- %参数:class1:类别1;class2:类别2;sample:待测样品;rule:训练规则
- %返回值:result:分类结果
- %函数功能:粗糙集两类分类
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- function result=CuCao2Class(class1.class2,sample,rule);
- sample=ceil(sample);%测试样品二值化
- ruleNum=size(rule,1)-1;%规则数
- xNum=size(rule,2)-1;%属性数
- result=-1;
- for i=1:ruleNum %匹配规则
- flag=true;
- for j=1:xNum
- if(rule(i,j)=100&&sample(rule(ruleNum+1,j))
- flag=false;
- break;
- end
- end
- if(flag)
- result=rule(i,xNum+1);
- break;
- end
- end
- %找最相近的规则
- if (result==-1)
- ruleSel=zeros(1,ruleNum);
- for i=1:ruleNum
- for j=1:xNum
- if(rule(i,j)=100&&sample(rule(ruleNum+1,j))=rule(i,j)
- ruleSel(i)=ruleSel(i)+1;
- end
- end
- end
- [a b]=min(ruleSel);
- result=rule(b,xNum+1);
- end
复制代码
|