📄 rule_create.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 + -