标题:
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.51hei.com/bbs/)
Powered by Discuz! X3.1