读书笔记1——Apriori算法详解

平时看书就是自认为看懂就算,结果在过一段时间,或是面试的时候别人问我貌似什么都不记得。所以如果能把自己所看的,写下来给比人讲清楚我想是非常重要的。开始第一个简单的机器学习算法的解释。参考资料主要是《数据挖掘概率与技术》第三版。

    
  Apriori算法的主要作用是寻找频繁项集。进一步的是根据频繁项集去产生关联规则。在实际应用中类似啤酒和尿布这种故事就可以使用这种算法去解决。


常用的概念
  • 项集:就是项的集合。如果在输入时数据师 为了发现哪些商品被同时购买,项集就是商品的集合。
  • 支持度:频繁项集的支持度通常用项集在输入数据中出现的次数来计算。在啤机和尿布中就是啤酒喝尿布同时被人购买的次数。当然也可以用出现的概率来计算,这个就是出现的次数除上一个样本总是。
  • 频繁项集:支持度计数>min支持度计数的项集
  • 先验性质:频繁项集的所有非空子集都是频繁的。这个性质是Aprori算法关键的部分。要理解Apriori,首先要搞清楚这个性质的意思,至于为什么成立时很简单的逻辑。还如果购买啤酒的次数少于最小支持度,所有和啤酒一起购买的商品组合的次数不会高于啤酒的购买次数,所以任何和啤酒组合的商品不会是频繁的。

伪代码

  • 输入数据集D,min_support(最小支持度计数)
  • 遍历D找到只有一个项的频繁项集L1;
  • for(k=2;Lk-1!=空集;K++)
    {
    L.append(Lk-1);
    Ck=Apriori_Gen(Lk-1);                                  //利用频繁Lk-1项集产生k项候选集Ck;
    遍历数据集D,for each s in D; 产生s的所有k项子集;如果s的任一个k项子集cs在CK中;则cs.count++;
    LK=Ck中支持度计数大于min_support的项
    }
  • return Lk-1;
      Apriori_gen(Lk-1)这是一个产生候选频繁项的函数,也算是Apriori的核心部分。
     for each  l1 in Lk-1
for each l2 in Lk-1
if(l1 和 l2 只有一个元素不同)//实际应用的时候通常是没有排序的,为了避免重复会增加一个判断来避免重复。
c=l1 和l2 的交集;
                                if  c  不在cK中  ck.insert(c);   //为了提高效率这里还可以增加一步来检验c的所有k-1项集是否在Lk-1中
   return ck;

这其中没有数学知识,只有一些逻辑和编程就能完成。最好是有集合运算的语言能很顺利的完成。不用涉及太多的复杂数据结构。

  优化

 这个算法在很大的数据量的时候应该是相对较慢的。书上写了很多优化算法的方法:

  1. 散列技术:这一点还没怎么看懂,先做个空白   ;
  2. 事务压缩:如果某个样本不包含任何的频繁k-1项集,在产生k项集的时候可以不考虑此样本;这样需要遍历的数据集会越来越小;
  3. 划分:将数据集划分为n个补充叠的集合。寻找每个集合的频繁项。n个集合的频繁项集的并集可作为D的候选频繁项集;遍历一次D选出满足最小支持度的项;这中间有个全局最小支持度和局部最小支持度关系的计算。(局部最小支持度计数=局部样本数/总样本数)*全局最小支持度计数。
  4. 抽样
  5. 动态项集计数:还没看懂,搞明白之后更新。
稍后会在后面贴上Python版本的代码。

你可能感兴趣的:(机器学习,机器学习,算法,python,数据挖掘,读书笔记)