以数据挖掘第三版习题6.6为例 实现算法功能挖掘频繁项集
注:在满足txt的格式的情况下,其他类型数据也可使用
思路:首先使用txt文件存储事务数据,为了让数据维度一致,随后将数据规范化为0 1矩阵,并创建一个编码规则数组,用以转换输出。随后对产生的0 1矩阵进行数据挖掘,循环找出频繁项集,并在对比编码规则数组后输出对应数据。
代码如下:
%% 数据初始化
clear,clc;
% 事务以文件形式存储为data.txt
code = {}; % 数据规范化,1*n形式,包含所有唯一1项集,也是编码规则基础
fid= fopen('data.txt');
tline = fgetl(fid);
lines = 0 ;
while ischar(tline)
lines = lines+1; % 记录行数
tline = deblank(tline);
tline = regexp(tline,',','split');
code = [code tline]; % 合并
code = unique(code); % 去除重复记录
tline = fgetl(fid);
end
fclose(fid);
%% 读取文件,根据编码规则对原始数据进行转换,创建以data为基础的转换矩阵
itemsnum = size(code,2); % code 长度
data = zeros(lines,itemsnum); % data 数据规范化的矩阵 line*code(itemsnum)
fid= fopen('data.txt');
tline = fgetl(fid);
lines = 0;
while ischar(tline)
lines = lines+1; % 记录行数
tline = deblank(tline);
tline = regexp(tline,',','split');
[~,icode,~] = intersect(code,tline); % 寻找下标
data(lines,icode') = 1;
tline = fgetl(fid);
end
fclose(fid);
%% 频繁1项集计算
minSup = 0.6*lines; % 最小支持度
minConf = 0.8*lines; % 最小置信度
%求出所有单个元素出现的次数
C1 = {};
for i = 1:size(data,2)
C1{i} = code{i};
count(i) = sum(data(:,i));
end
%根据最小支持度剪枝,只保留频繁项集
L1 = {}; % 储存频繁项集
sup = {}; % 储存对应支持度 sup 1项
for i = 1:length(C1)
if count(i) >= minSup
L1{end+1} = {C1{i}};
sup{end+1} = {count(i)};
end
end
% 输出频繁项集L1
disp(['频繁1项集与对应支持度:']);
for i = 1:length(L1)
disp([L1{i} sup{i}]);
end
%% 循环求解 k-项频繁项集,直到无法继续延伸
k = 1;
% 循环求解频繁K项集
while length(L1) > 0
% 求出所有可能的 k+1 项候选集
C = {}; % 储存k项集 C
Sup = {}; % 储存对应支持度 Sup -k
for i = 1:length(L1)
for j = i+1:length(L1)
if k == 1 || isequal(L1{i}(1:end-1),L1{j}(1:end-1))
C{end+1} = sort([L1{i},L1{j}{end}]);
else
break;
end
end
end
% 剪枝,只保留频繁项集
L = {}; % 用于保存当前 k-项频繁项集 L
for i = 1:length(C);
count = 0;
for j = 1:size(data,1)
if all(ismember(C{i},code(find(data(j,:))))) % 计算项集出现次数
count = count + 1;
end
end
if count >= minSup
L{end+1} = C{i};
Sup{end+1} = {count};
end
end
% 输出当前得到的 k-项频繁项集
if length(L) > 0
fprintf('频繁%d项集与对应支持度:\n',k+1);
for i = 1:length(L)
disp([L{i} Sup{i}]);
end
end
% 更新本次循环使用的频繁项集,用于下一轮迭代
L1 = L;
k = k+1;
end
data.txt:
运行结果:
其中有重复赋值的代码,为保证代码可读性,故不作删除。
本代码运行软件为matlab R2022b