Advertisement

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)

还没有任何评论哟~