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

📄 rule_create.m

📁 粗糙集建立规则,学习粗糙集的基本程序, 可直接用来直接开发粗糙集
💻 M
字号:
% 生成规则,rule accuracy,
% input: original decision matrix u( m row, n-1 cilumn conditional
% attributes,and 1 decision attribute); DRDM_Reduct,reducted decision relative discriminibility matrix;  
% output:printed rule, such as "if a1=1 and a3=2 then d=1"; and its accuracy
function[rule_accuracy]=rule_create(u,DRDM_Reduct)
[m,n]=size(u);
u1=collection(u);% 将相同行清零
[m1,n1]=size(u1);
u2=delete_zero_line(u1);% 删除全零行
[m2,n2]=size(u2);
[m n]=size(DRDM_Reduct);
mul=zeros(m+1,n^m);% 定义相乘结果矩阵,(m+1)*n^m matrix, m+1 line is the 0, or 1, to show the no and exist
% lv=zeros(m);% define line variant
for i=1:m%  row number
    j=0;
    while j< n^m
        if i==1
            j_position=0;% j  recycle symbol position
        else
            j_position=j;
        end
        for nn=1:n% attribute number
            for j=(1+(nn-1)*n^(m-i)+j_position):(nn*n^(m-i)+ j_position)% cilumn number,changable with the row number i,and attribute number nn
            mul(i,j)=nn;
            end% j loop
        end% nn loop
    end% while loop
end% i loop
% creat the mul matrix
%  
% 每行(项)相乘,记录在矩阵中******************************************
% 以每行中出现的元素值为列值(属性下标值),以行号为行标,表示每一项的项标,记录每一列的最终结果,1表示列中所有元素对应new_t1的元素值为1,即该项存在;0表示至
% 少有一个元素为0,即该项无效

    for j=1:n^m % colum number of mul matrix
        zero_flag=1;
        for i=1:m% row number of mul matrix
            mul_val=mul(i,j);
            if DRDM_Reduct(i,mul_val)==0
                zero_flag=1;
                break;% break i loop
            elseif DRDM_Reduct(i,mul_val)~=0
                zero_flag=0;    
            
            end
        end
        if zero_flag==1
            mul(m+1,j)=0;
        elseif zero_flag==0
            mul(m+1,j)=1;
    end
        
    end
 %提取所有相乘项中非零的项,组成矩阵。即提取mul矩阵中最后一行非零的列,组成结果矩阵
 result_m=zeros(m,1);%result_m中的元素值表示属性下标值,
%  temp_result=zeros(m+1,1);
temp_number=1;
 for j=1:n^m
     if mul(m+1,j)==1
         result_m(:,temp_number)=mul(1:m,j);
         temp_number=temp_number+1;
     end
 end
%每列中相同的属性代号,并将其清零,每列排序
[m,n]=size(result_m);
for j=1:n
    for i_posi=1:m-1
        for i=i_posi+1:m
            if result_m(i_posi,j)==result_m(i,j)
                result_m(i,j)=0;
            end
        end% i  loop
    end% i_posi loop
end% j loop
result_m1=sort(result_m);%按列排序
%打印产生的规则 “if... then... ”
[m,n]=size(result_m1);
%形成规则矩阵,合并,清零行,属性值约简(以-100)代表缺省值,
rule_m=zeros(m2,1);% 根据u2形成规则矩阵

for jj=1:n %对每一种约简形成规则矩阵,合并,清零,属性值约简,打印输出
    rmc=1;% rule_m column number
    for ii=1:m
            rule_m(:,rmc)=u2(:,result_m1(ii,jj));% 向右添加列
            rmc=rmc+1;
    end % ii loop
    rule_m(:,rmc)=u2(:,n2); % decision attribute column
   % 合并
    rule_m1=collection(rule_m);% 将相同行清零
    rule_m2=delete_zero_line(rule_m1);% 删除全零行
    [rm2m,rm2n]=size(rule_m2);
    % 属性值约简: 在每行中删除一个属性值,
    % 比较该行其余属性值与其它不同决策行的条件属性输否相同,若不相同,则说明该属性值可以约简
%     for i_posi=1:rm2m
%         for j_posi=1:rm2n-1
%             for i=i_posi
    for i_posi=1:rm2m
        for j_posi=1:rm2n-1 % locate the supposed default value
            up_flag=0;down_flag=0;i_up=0;i_down=0;
            for i=1:i_posi-1 % compare the up part
                i_up=1;% 上部存在比较
                left_flag=0;right_flag=0;
                    for j=1:j_posi-1 % compare the left part
                        if (rule_m2(i,j)~=rule_m2(i_posi,j))&(rule_m2(i,j)~=-100)&(rule_m2(i_posi,j)~=-100) %不与缺省值比较
                            left_flag=1;% 两行左边不相等
                            break; % terminates j left loop
                        else
                            left_flag=0;% 两行左边相同
                        end
                    end % j left loop
                    for j=j_posi+1:rm2n-1 % compare the right part
                        if left_flag==1
                            break; % terminates j right loop
                        end
                        if (rule_m2(i,j)~=rule_m2(i_posi,j))&(rule_m2(i,j)~=-100)&(rule_m2(i_posi,j)~=-100) %不与缺省值比较
                            right_flag=1;% 两行左边不相等
                            break; % terminates j left loop
                        else
                            right_flag=0;% 两行左边相同
                        end                        
                    end % j right loop
                    if (left_flag==0)&(right_flag==0)
                        up_flag=0;
                        break; %terminates i up loop
                    end
                    if (left_flag==1)|(right_flag==1)
                        up_flag=1;
                    end
            end % i up loop
            % i down loop **************************************************
            for i=i_posi+1:rm2m
                i_down=1;
                if (up_flag==0)&(i_up~=0) %如果上半部分比较中已经有两行相等,则中断下班部分的比较,该属性j_posi不可省略
                    break; % terminates i down loop
                end
                left_flag=0;right_flag=0;
                    for j=1:j_posi-1 % compare the left part
                        if (rule_m2(i,j)~=rule_m2(i_posi,j))&(rule_m2(i,j)~=-100)&(rule_m2(i_posi,j)~=-100) %不与缺省值比较
                            left_flag=1;% 两行左边不相等
                            break; % terminates j left loop
                        else
                            left_flag=0;% 两行左边相同
                        end                        
                    end % j left loop
                    for j=j_posi+1:rm2n-1 % compare the right part
                        if left_flag==1
                            break; % terminates j right loop
                        end
                        if (rule_m2(i,j)~=rule_m2(i_posi,j))&(rule_m2(i,j)~=-100)&(rule_m2(i_posi,j)~=-100) %不与缺省值比较
                            right_flag=1;% 两行左边不相等
                            break; % terminates j left loop
                        else
                            right_flag=0;% 两行左边相同
                        end               
                    end % j right loop
                    if (left_flag==0)&(right_flag==0)
                        down_flag=0;
                        break; %terminates i up loop
                    end
                    if (left_flag==1)|(right_flag==1)
                        down_flag=1;
                    end
            end % i down loop
            if (i_up==1)&(i_down==1) %i_posi 行处于中间位置,有上下两部分比较结果
                if(up_flag==1)&(down_flag==1)
                    rule_m2(i_posi,j_posi)=-100; %设置为缺省值:-100
                end
            elseif i_up==0 % 只含有下部分比较,i_posi=1
                if(down_flag==1)
                    rule_m2(i_posi,j_posi)=-100; %设置为缺省值:-100
                end
            elseif i_down==0 % 只含有上部分比较,i_posi=rm1m,到达表底部行
                if(up_flag==1)
                    rule_m2(i_posi,j_posi)=-100; %设置为缺省值:-100
                end
            end
        end %j_posi loop
    end % i_posi loop****
    temp=0;
   
end % jj loop



 %*************************************************************************
            
            
fprintf('决策表自动产生');fprintf(num2str(n));fprintf('个规则集:\n');
for j=1:n
    fprintf('规则集');fprintf(int2str(j));fprintf('如下:\n');
    for u2i=1:m2
        for i=1:m
            fprintf('If a');fprintf(num2str(result_m1(i,j)));fprintf('=');fprintf(num2str(u2(u2i,result_m1(i,j))));
            if i<m
            fprintf(' and ');
            end % if
        end % i loop
        fprintf('    Then d=');fprintf(num2str(u2(u2i,n2)));fprintf('\n');
    end % u2i loop
end
fprintf('\n');
rule_accuracy=zeros(n);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -