属性约简(MATLAB算法)有实例有讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
粗糙集属性约简
注:这是我学粗糙集时老师给的作业
属性约简的顺序如下:求正域、生成未经处理的区分矩阵、对区分矩阵进行化简、求核、对已经处理过的区分矩阵进行属性约简。约简后的决策表有26行,所有12个属性都是正域中的属性,核为空
程序:
% main.m
tic;
a=[ 1,1,1,1,0,0,0,0,1,1,0,1;
0,0,0,0,0,0,0,0,0,0,0,0;
1,0,1,0,0,0,0,0,0,1,0,0;
0,0,0,1,1,1,1,0,1,0,1,1;
1,0,0,1,1,1,1,1,0,1,1,0;
0,1,0,1,1,1,1,1,1,0,0,1;
1,0,0,0,1,1,1,0,0,1,1,1;
1,1,1,1,0,0,0,0,1,1,0,1;
1,0,1,1,1,0,0,0,1,1,0,1;
1,1,1,1,0,0,0,0,1,1,0,1;
1,0,1,1,1,0,0,0,1,1,0,1;
1,0,1,1,1,0,0,0,1,1,0,1 ];
d=[1;0;0;0;0;0;0;1;1;1;1;1];
pos=posCD(a,d);
dismat=dismatrix(a,d,pos);
dism=disbe(dismat);
core=cor(dism);
[red,row]=redu(dism);
time=toc
% dismatrix.m
% 生成未经处理的区分矩阵dismat
function dismat=dismatrix(a,d,pos)
[m,n]=size(a);
p=1;
index1=0;index2=0;index=0;
dis=-1*ones(m*(m-1)/2,n);
for i=1:m
for j=i+1:m
if (isxbelongtopos(i,pos)&~isxbelongtopos(j,pos))...
|(~isxbelongtopos(i,pos)&isxbelongtopos(j,pos))...
|(isxbelongtopos(i,pos)&isxbelongtopos(j,pos)&~isxybelongtoindD(i,j,d)) index2=1;
end
if index2==0
continue;
end
for k=1:n
if a(i,k)~=a(j,k)
dis(p,k)=1;
index1=1;
else dis(p,k)=0;
end
end
if index1==1
p=p+1;index=1;
end
index1=0;
index2=0;
end
end
if p<=m*(m-1)/2
if index==0
dismat=[];
return;
end
if dis(p,1)==-1
p=p-1;
end
else p=m*(m-1)/2;
end
dismat=dis(1:p,:);
% redu.m
% 对已经处理过的区分矩阵进行知识约简function [red,row]=redu(dism)
[m,n]=size(dism);
red=[];
row=0;
if m<=0
return;
end
for i=1:n
if dism(1,i)~=0
row=row+1;
end
end
red(1:row,:)=zeros(row,n);
j=1;
for i=1:row
while dism(1,j)==0
j=j+1;
end
red(i,j)=1;
j=j+1;
end
temp=[];tempdis=[];
rowd=0;rowd1=0;
for i=2:m
j=1;
while j<=row
temp=uni(dism(i,:),red(j,:));
[s,n]=size(temp);
rowd1=rowd+s;
tempdis(rowd+1:rowd1,:)=temp;
rowd=rowd1;
j=j+1;
temp=[];
end
red=[];
red=disbe(tempdis);
tempdis=[];
[row,n]=size(red);
rowd=0;rowd1=0;
end
% 对区分矩阵或者约简矩阵进行化简即去掉包含关系function dism=disbe(dis)
[m,n]=size(dis);
p=m;
for i=1:m
if dis(i,1)~=-1
for j=1:m
if i~=j & dis(j,1)~=-1
if dis(i,:)<=dis(j,:)
dis(j,1)=-1;
p=p-1;
elseif dis(i,:)>=dis(j,:)
dis(i,:)=dis(j,:);
dis(j,1)=-1;
p=p-1;
end
end
end
end
end
dism=ones(p,n);
j=1;
for i=1:p
while j<=m & dis(j,1)==-1
j=j+1;
end
dism(i,:)=dis(j,:);
j=j+1;
end
% posCD.m
% a为条件属性矩阵,d为决策属性向量
% pos为正域,保存条件属性矩阵的索引值
function pos=posCD(a,d)
[m,n]=size(a);
p=m;
index=0;
for i=1:m
if a(i,1)~=-1
for j=i+1:m
if a(j,1)~=-1 &(a(i,:)==a(j,:)&d(i)~=d(j))
a(j,1)=-1;p=p-1;index=1;
end