粗糙集属性约简matlab代码
时间: 2023-09-16 19:14:55 浏览: 337
以下是一个基于粗糙集的属性约简的 Matlab 代码示例:
```matlab
% 定义数据集
data = [1 1 1 0;
1 0 1 1;
0 1 0 1;
0 0 1 0;
1 1 0 1;
0 1 1 1];
[n, m] = size(data);
% 定义决策属性
decAttr = m;
% 初始化属性集
attrSet = 1:m-1;
% 粗糙集属性约简
while true
% 计算每个属性的依赖度
dep = zeros(1, length(attrSet));
for i = 1:length(attrSet)
attr = attrSet;
attr(i) = []; % 删除当前属性
% 计算条件熵
condEnt = 0;
for j = 1:2 % 对于每个决策属性值
subData = data(data(:, decAttr)==j, attr);
p = sum(subData(:, i)) / size(subData, 1);
if p == 0 || p == 1 % 避免出现 log(0) 或 log(1)
condEnt = condEnt + 0;
else
condEnt = condEnt - p*log2(p) - (1-p)*log2(1-p);
end
end
% 计算依赖度
dep(i) = (2*condEnt - calcEnt(data(:, decAttr))) / (2*calcEnt(data(:, decAttr)));
end
% 找到依赖度最小的属性
[minDep, minIndex] = min(dep);
if minDep >= 0 % 如果所有属性依赖度都为0或正数,说明已经找到最小集
break;
else % 删除依赖度最小的属性
attrSet(minIndex) = [];
end
end
% 输出属性约简结果
fprintf('属性约简结果为:');
disp(attrSet);
% 计算数据集的熵
function ent = calcEnt(data)
p1 = sum(data==1) / length(data);
p2 = sum(data==2) / length(data);
if p1 == 0 || p1 == 1 % 避免出现 log(0) 或 log(1)
ent = -p2*log2(p2);
elseif p2 == 0 || p2 == 1
ent = -p1*log2(p1);
else
ent = -p1*log2(p1) - p2*log2(p2);
end
end
```
其中,`data`为数据集,每行表示一个样本,每列表示一个属性,最后一列为决策属性;`decAttr`为决策属性所在的列号;`attrSet`为当前属性集合;`dep`为每个属性的依赖度。在代码中,使用了信息熵和条件熵的概念来计算属性的依赖度,最后找到依赖度最小的属性,将其从属性集中删除,并重复上述过程,直到所有属性的依赖度都为0或正数,即找到了最小属性集合。
阅读全文