1 算法思想

算法使用频繁项集性质的先验知识。Apriori使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描数据库,累积每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记作L1.然后,L1用于找频繁2项集的集合L2,L2用于找L3,如此迭代,直到不能再找到频繁k项集。找每个Lk需要一次数据库全扫描。

Apriori性质可用于压缩搜索空间,提高频繁项集逐层产生的效率。

Apriori性质:频繁项集的所有非空子集也必是频繁的。

Apriori算法主要包括连接步和剪枝步两步组成。在连接步和剪枝步中采用Apriori性质可以提高算法的效率。

1.1 连接步

此步骤用于从频繁k-1项集集合产生候选k项集集合。

为了计算出Lk,根据Apriori性质,需要从Lk-1选择所有可连接的对连接产生候选k项集的集合,记作Ck。假设项集中的项按字典序排序,则可连接的对是指两个频繁项集仅有最后一项不同。例如,若Lk-1的元素l1和l2是可连接的,则l1和l2两个项集的k-1个项中仅有最后一项不同,这个条件仅仅用于保证不产生重复。

1.2 剪枝步

此步骤用于快速缩小Ck包含的项集数目。

由Apriori性质可得,任何非频繁的(k-1)项集都不是频繁k项集的子集,因此,如果Ck中的一条候选k项集的任意一个(k-1)项子集不在Lk-1中,则这条候选k项集必定不是频繁的,从而可以从Ck中删除。这种子集测试可以使用当前所有频繁项集的散列树快速完成。

Ck是Lk的超集,经过子集测试压缩Ck后,即可扫描数据库,确定Ck中每个候选的计数,从而确定Lk。

2 伪代码

算法:Apriori, 使用逐层迭代方法基于候选产生找出频繁项集
输入:
D:事务数据库;
min_sup:最小支持度计数阈值。
输出: L:D中的频繁项集。
方法:
1) L1 = find_frequent_1_itemsets(D);
2) for (k = 2; Lk-1 ≠ ∅; k++) {
3) Ck = aproiri_gen(Lk-1,min_sup);
4) for each transaction t∈D{ //扫描D用来计数
5) Ct = subset(Ck,t); //找出事务t中包含的所有候选k项集,
6) for each candidate c∈Ct //对事务t包含的每个候选k项集的计数加一
7) c.count++;
8) }
9) Lk={c∈Ck | c.count ≥ min_sup}
10) }
11) return L = ∪kLk;
procedure apriori_gen(Lk-1: frequent (k-1)-itemset; min_sup: support)
1) for each itemset l1∈Lk-1
2) for each itemset l2∈Lk-1
3) if (l1[1]=l2[1])∧...∧(l1[k-2]=l2[k-2])∧(l1[k-1]<l2[k-2]) then {
4) c = l1 连接 l2; //连接步: 产生candidates
5) if has_infrequent_subset(c,Lk-1) then
6) delete c; // 剪枝步: 移除非频繁的cadidate
7) else add c to Ck;
8) }
9) return Ck;
procedure has_infrequent_subset(c:candidate k-itemset; Lk-1:frequent (k-1)-itemset)
// 使用先验知识
1) for each (k-1)-subset s of c
2) if c∉Lk-1 then
3) return TRUE;
4) return FALSE;

其中,Lk-1表示频繁k-1项集。

3 实现

4 示例

参考资料:

《数据挖掘:概念与技术》(第二版)

数据挖掘(七):Apriori算法:频繁模式挖掘的更多相关文章

  1. 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比

    最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...

  2. 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比(Python实现)

    最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...

  3. apriori && fpgrowth:频繁模式与关联规则挖掘

    已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...

  4. 【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

    今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6 ...

  5. 八、频繁模式挖掘Frequent Pattern Mining

    频繁模式挖掘(Frequent Pattern Mining): 频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题.建议用户参考维基百科的association r ...

  6. 频繁模式挖掘apriori算法介绍及Java实现

    频繁模式是频繁地出如今数据集中的模式(如项集.子序列或者子结构).比如.频繁地同一时候出如今交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B) ...

  7. 频繁模式挖掘 Apriori算法 FP-tree

    啤酒 尿布 组合营销 X=>Y,其中x属于项集I,Y属于项集I,且X.Y的交集等于空集. 2类算法 Apriori算法 不断地构造候选集.筛选候选集来挖掘出频繁项集,需要多次扫描原始数据.磁盘I ...

  8. 玩转大数据:深入浅出大数据挖掘技术(Apriori算法、Tanagra工具、决策树)

    一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景           “大数据”作为时下最火热的IT行业的词汇,随之而来的数据仓库.数据分析.数据挖掘等等围绕大数据的商业价值的利用逐渐成为 ...

  9. Apriori算法-频繁项集-关联规则

    计算频繁项集: 首先生成一个数据集 def loadDataSet():     return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] 测试数据集da ...

随机推荐

  1. 'adb' 不是内部或外部命令,也不是可运行的程序

    启动adb shell的时候,出现如下问题: 'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件. 在确保自己的SDK安装正确的时候,就很好办了,找到SDK安装目录\platform-to ...

  2. fragment低版本

    http://bbs.csdn.net/topics/390271980 Fragment框架开发东西确实很方便,但是恼人的是从4.0才开始支持.以前的版本必须用兼容模式开发,本人在网上找了大量资料, ...

  3. gcc选项-g与-rdynamic的异同

    摘自http://www.tuicool.com/articles/EvIzUn gcc选项-g与-rdynamic的异同 gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序 ...

  4. android卸载反馈实现

    博客原地址:http://blog.csdn.net/wang_shaner/article/details/41543787 实现原理 fork分叉函数 fork分叉(分裂)函数可以创建一个新进程, ...

  5. Oracle SecureFiles 说明(转)

    Oracle SecureFiles 说明 Oracle Database 11g 将LOB 数据类型作为Oracle SecureFiles 进行了完全重新设计,显著改进了应用程序开发的性能.可管理 ...

  6. C#整理4——循环语句

    一.循环语句  定义:可以反复执行某段代码,直到不满足循环条件为止. 循环的四要素:初始条件.循环条件.状态改变.循环体. 1.初始条件:循环最开始的状态. 2.循环条件:在什么条件下进行循环,不满足 ...

  7. DevExpress Util HelpV3

    using System; using System.Drawing; using DevExpress.XtraCharts; namespace DevExpressUtilHelpV3 { pu ...

  8. IIS中如何建立FTP服务

    文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机.这些文件存储在运行 FTP 服务器软件的服务器计算机上.然后,远程计算机可以使用 FTP 建 ...

  9. c#创建带参数的线程

    1.无参数线程的创建 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void showmes ...

  10. HDU 1038 - Biker's Trip Odometer

    算一下路程和速度... #include <iostream> #include <cstdio> using namespace std; const double p=3. ...