欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
MATLAB模式識別常用算法代碼集合
[打印本頁]
作者:
playgamewy
時間:
2019-2-10 15:27
標題:
MATLAB模式識別常用算法代碼集合
用于模式識別的常用算法,有數十個,都是源程序,可以自己查看
0.png
(8.51 KB, 下載次數: 26)
下載附件
2019-2-10 23:43 上傳
所有資料51hei提供下載:
MATLAB模式識別與智能計算.rar
(40.42 KB, 下載次數: 18)
2019-2-10 15:27 上傳
點擊文件名下載附件
matlab常用算法源程序集合
下載積分: 黑幣 -5
源程序如下:
%函數名稱: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
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1