Matlab实现apriori算法
发布时间
阅读量:
阅读量
数据挖掘概念与技术 原书第三版 习题6.6
实现用apriori算法找出频繁项集。
代码可在Matlab R2018a中直接运行。
% 数据集
data = {['M', 'O', 'N', 'K', 'E','Y'];
['D', 'O', 'N', 'K', 'E','Y'];
['M', 'A', 'K', 'E'];
['M', 'U', 'C', 'K', 'Y'];
['C', 'O', 'O', 'K', 'I', 'E']};
% 设置最小支持度(和最小置信度)
min_sup = 0.6; %min_conf = 0.8;
% 用cellfun函数将数据集中所有项转化为单个字符串,然后存储在一个字符串类型的数组str_data中,
str_data = cellfun(@(x) join(x,''),data,'UniformOutput',false);
%使用join函数将每个单元格中的字符数组连接成一个单个字符串。
% 根据最小支持度获取频繁一项集
one_itemset = containers.Map; %创建对象one_itemset,用于存储每个项出现的次数
for i = 1:length(str_data)
for j = 1:length(str_data{i})
if isKey(one_itemset,str_data{i}(j))
one_itemset(str_data{i}(j)) = one_itemset(str_data{i}(j)) + 1;
else
one_itemset(str_data{i}(j)) = 1;
end
end
end %遍历数据集中的每个字符串,对其中的每个字符进行计数
remove_items = {};
for k = keys(one_itemset)
if one_itemset(k{1})/length(str_data) < min_sup
remove_items{end+1} = k{1};
end
end
for i = 1:length(remove_items)
remove(one_itemset,remove_items{i}); %对one_itemset进行遍历,找到计数小于最小支持度的项,并将移除。
end
% 根据最小支持度获取频繁二项集
two_itemset = containers.Map; %创建了一个containers.Map对象two_itemset,用于存储每个二项集出现的次数,
for i = 1:length(str_data)
for j = 1:length(str_data{i})-1
for k = j+1:length(str_data{i})
if isKey(one_itemset,str_data{i}(j)) && isKey(one_itemset,str_data{i}(k))
itemset = [str_data{i}(j),str_data{i}(k)];
if isKey(two_itemset,join(itemset,''))
two_itemset(join(itemset,'')) = two_itemset(join(itemset,'')) + 1;
else %遍历数据集中的每个字符串,对其中的每个字符组合成的二项集进行计数
two_itemset(join(itemset,'')) = 1;
end
end
end
end
end
remove_items = {};
for k = keys(two_itemset)
if two_itemset(k{1})/length(str_data) < min_sup
remove_items{end+1} = k{1};
end
end
for i = 1:length(remove_items)
remove(two_itemset,remove_items{i}); %对two_itemset进行遍历,找到计数小于最小支持度的二项集,并将其从two_itemset中移除
end
% 根据最小支持度获取频繁三项集
three_itemset = containers.Map; %与二项集操作相同
for i = 1:length(str_data)
for j = 1:length(str_data{i})
for k = j+1:length(str_data{i})-1
for l = k+1:length(str_data{i})
if isKey(one_itemset,str_data{i}(j)) && isKey(one_itemset,str_data{i}(k)) && isKey(one_itemset,str_data{i}(l))
itemset = [str_data{i}(j),str_data{i}(k),str_data{i}(l)];
if isKey(three_itemset,join(itemset,''))
three_itemset(join(itemset,'')) = three_itemset(join(itemset,'')) + 1;
else
three_itemset(join(itemset,'')) = 1;
end
end
end
end
end
end
remove_items = {};
for k = keys(three_itemset)
if three_itemset(k{1})/length(str_data) < min_sup
remove_items{end+1} = k{1};
end
end
for i = 1:length(remove_items)
remove(three_itemset,remove_items{i});
end
% 输出频繁项集
disp('频繁一项集:');
disp(keys(one_itemset));
disp('频繁二项集:');
disp(keys(two_itemset));
disp('频繁三项集:');
disp(keys(three_itemset));
AI写代码
事务分析如下:

结果如下:

全部评论 (0)
还没有任何评论哟~
