📄 02 粗糙集两类分类训练.txt
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数名称:CuCao TrainBK()
%参数: class:类别1;class:类别2;
%返回值: newRule:规则
%函数功能:粗糙集两类分类训练
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function newRule=CuCao2ClassTrain(class1,class2);
load templet pattern;
patternNum=100;
bottom = zeros(1,patternNum *2);
bottom(1,1:patternNum)=0;
bottom(1,patternNum+1:patternNum * 2)=1;
x=[pattern(class2).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-1
if(m>ruleNum-1)
break;
end
while(x(m,1:3)==x(n,1:3))
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-ruleY1;
classX = zeros(ruleNum,ruleNum);%X属性等价集矩阵
classNum=zeros(ruleNum,1);%等价集中元素个数
m=0;%等价集个数
n=1;
%计算条件X等价集
num=0;
[classX,m,classNum]=CalTiaoJian(num,calssX,x,ruleNum,classNum;)
%决策D的等价集
classY1=zeros(1,ruleNumY1);
classY2=zeros(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,ruleNumY1);
%计算Pos(X,D)和r(X,D)
PosXD=[X_Y1 X_Y2];
rXD=size(PosXD,2)/(ruleNum);
%计算各属性的重要度
import=zeros(1,25);
xReserve=[];
for i=1:25
%计算各属性的重要度
import=zeros(1,25);
xReserve=[];
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_Y1,D)和r(X,D)
PosXiD=[X_Y1 X_Y2];
import(i)=size(PosXiD,2)/(ruleNum);
if(rXD-import(i)==0)
if(Consistent(i,x,ruleNumY1,ruleNumY2)==1)%如果删除后一致
x(1:ruleNum,i)=0;
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(:,:)=0;
[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: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
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(:,i)=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=true;
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=ture;
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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -