Apriori 算法学习

来源:互联网 发布:app用户数据分析维度 编辑:程序博客网 时间:2024/06/06 04:49

  近来小看关联分析的Apriori算法,参考《数据挖掘:概念与技术3rd》,作此篇。

1. 基础概念

-支持度(Support):support( A => B ) = P(A U B)-置信度(Confidence): confidence(A => B ) = P( B | A )-项集(itemset) : 包含K个项的项集成为K项集-频繁项集(frequent itemset) : 如果项集 I 满足最小支持度阈值, 则 I 是频繁项集

2. 算法简介

2.1 简介

  Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。
  首先,通过扫描事务记录,找出所有的频繁1项集,记做L1,利用L1找频繁2项集L2,使用L2找L3,如此下去,直到不能再找到任何频繁k项集。
  为了提高频繁项集逐层产生的效率,一种称为先验性质(Apriori property)的重要性质用于压缩搜索空间.
  先验性质:频繁项集的所有非空子集也一定是频繁的.

2.2 流程

  考察使用Lk-1找出Lk,主要有连接步剪枝步:
  (1)连接步: 为了找出Lk, 通过将Lk-1与自身连接产生候选K项集的集合, 记为Ck. 记li[j]表示li的第j项. Apriori算法假定事务和项集中的项按字典顺序排序. 对于(k-1)项集li, 使得li[1] < li[2] < … < li[k-1]. 如果lk-1的前(k-2)个项相同, 则它是可连接的. 连接Lk-1 连接 Lk-1, 结果{l1[1], l1[2], …, l1[k-1], l2[k-1]}.
  (2)剪枝步: Ck是Lk的超集, 即Ck的成员可以是也可以不是频繁的. 任何非频繁的(k-1)项集都不是频繁k项集的子集. 因此, 如果一个候选k项集的(k-1)项子集不在Lk-1中,则该候选也不可能是频繁的, 从而从Ck中删除.

3. 具体例子

   该例子截图为书中截图.

3.1样例数据:

样例数据

3.2流程:

流程

3.3由L2产生C3并剪枝:

L2生成C3并剪枝

4.伪代码

  伪代码未采用书中代码,摘自wikipedia.
这里写图片描述

5. 后话

  C++代码简单实现: https://github.com/old-windbell/owbML

0 0