用于模式識別的常用算法,有數十個,都是源程序,可以自己查看
所有資料51hei提供下載:
MATLAB模式識別與智能計算.rar
(40.42 KB, 下載次數: 18)
2019-2-10 15:27 上傳
點擊文件名下載附件
matlab常用算法源程序集合
源程序如下:
- %函數名稱: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
復制代碼
|