⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 02 粗糙集两类分类训练.txt

📁 本程序的主要功能是实现多类别分类。首先获得任意两类的规则集
💻 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 + -