本文是个人对spmf中example1. mining frequent itemsets by  using the apriori algorithm的学习.

What is Apriori?

Apriori is an algorithm for discovering frequent itemsets in transaction databases. It was proposed by Agrawal & Srikant

input file format:

1 3 4
2 3 5
1 2 3 5
2 5
1 2 3 5

so the transaction is:

Transaction
{1, 3, 4}
{2, 3, 5}
{1, 2, 3, 5}
{2, 5}
{1, 2, 3, 5}

在java实现中,可用

private List<int[]> database = null;

database = new ArrayList<int[]>();  用来存储上面的结构(即存储各个transaction)

output(with minsup of 40%)

itemsets support
{1} 3
{2} 4
{3} 4
{5} 4
{1, 2} 2
{1, 3} 3
{1, 5} 2
{2, 3} 3
{2, 5} 4
{3, 5} 3
{1, 2, 3} 2
{1, 2, 5} 2
{1, 3, 5} 2
{2, 3, 5} 3
{1, 2, 3, 5} 2

java实现的一些实现细节记录

HashMap结构 Map<Integer, Integer> mapItemCount = new HashMap<Integer, Integer>();来记录每个item和其出现的次数

当k=1时,(k为 the size of itemset)

List<Integer> frequent1 = new ArrayList<Integer>();

判断当HashMap中各item出现的次数满足minsup时:

frequent1.add(entry.getKey());
saveItemsetToFile(entry.getKey(), entry.getValue());

下面产生候选集合:

当k=2时,即{1,2}、{1,3}这些itemsets,此时从frequent1中产生候选集合项,生成candidates(所有情况),然后通过计算各候选项集的支持度,找出k=2时满足minsup的项集。(计算各候选项集支持度方法见下文)

当k=3或以上时,选取封装了 k-1时 频繁项集 List<Itemset> 作为 生成大小为K的候选集函数 的输入,生成方法是:“we compare items of itemset1 and itemset2.If they have all the same k-1 items and the last item of itemset1 is smaller than the last item of itemset2, we will combine them to generate a candidate”,之后再利用allSubsetsOfSizeK_1AreFrequent()来检测生成的大小为k的 预备候选集 中,其所有的大小为k-1的子集是否存在于 大小为k-1的频繁项集中,如果都存在,则将此大小为k的预备候选集即被视为候选集,接下来再计算各候选项集的支持度,找出满足minsup的候选集作为频繁项集。

计算各候选项集支持度的计算过程如下:

对于文件(database)中的每行(transaction),用candidates中所有的candidate来试验是否存在于第一个transaction中,方法是,拿第一个transaction中的item与candidate中每个位置(pos)上的item进行比较,能比较到pos == candidate.itemset.length位置上时,说明该candidate已经存在于此transaction中。换个candidate继续上述过程,所有candidate都完成上述过程后,换个transaction继续上述过程。

计算过程核心部分代码如下:

for(int[] transaction: database){
loopCand: for(Itemset candidate : candidatesK){
      int pos = 0;
      for(int item: transaction){
        if(item == candidate.itemset[pos]){
        pos++;
        if(pos == candidate.itemset.length){
        candidate.support++;
        continue loopCand;

        }//end the second if

        }//end the first if

        else if(item > candidate.itemset[pos]){
          continue loopCand;}
}//end for
}//end for 
}//end the first for

Apriori algorithm的更多相关文章

  1. 关联规则算法(The Apriori algorithm)详解

    一.前言 在学习The Apriori algorithm算法时,参考了多篇博客和一篇论文,尽管这些都是很优秀的文章,但是并没有一篇文章详解了算法的整个流程,故整理多篇文章,并加入自己的一些注解,有了 ...

  2. 数据挖掘算法-Apriori Algorithm(关联规则)

    http://www.cnblogs.com/jingwhale/p/4618351.html Apriori algorithm是关联规则里一项基本算法.是由Rakesh Agrawal和Ramak ...

  3. 先验算法(Apriori algorithm) - 机器学习算法

    Apriori is an algorithm for frequent item set mining and association rule learning over transactiona ...

  4. 数据挖掘 Apriori Algorithm python实现

    该算法主要是处理关联分析的: 大多书上面都会介绍,这里就不赘述了: dataset=[[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[ ...

  5. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  6. AprioriTID algorithm

    What is AprioriTID? AprioriTID is an algorithm for discovering frequent itemsets (groups of items ap ...

  7. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  8. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  9. HAWQ + MADlib 玩转数据挖掘之(七)——关联规则方法之Apriori算法

    一.关联规则简介 关联规则挖掘的目标是发现数据项集之间的关联关系,是数据挖据中一个重要的课题.关联规则最初是针对购物篮分析(Market Basket Analysis)问题提出的.假设超市经理想更多 ...

随机推荐

  1. php二分查找

    // 递归版本 function bin_sch($arr,$low,$high,$val) { if($low<$high){ $mid = intval(($low+$high)/2); i ...

  2. NOI十连测 第四测 T2

    思路:线段树套可持久化treap,可持久化treap我还是第一次听说.. 改题的时候没看数据范围..乱开数组T_T #include<algorithm> #include<cstd ...

  3. WPF笔记(2.5 Canvas)——Layout

    原文:WPF笔记(2.5 Canvas)--Layout Canvas是最精确的布局容器--绝对定位,此书作者不建议使用,以为控件的大小一般会随着内部字体图片的动态生成而自动变化,所以使用前三种布局是 ...

  4. 【转】如何查看linux版本 如何查看LINUX是多少位

    原文网址:http://sopace.blog.51cto.com/1227753/670526 如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: ...

  5. poj 1703(带权并查集)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31840   Accepted: ...

  6. Eclipse配置Maven开发环境

    前言: 现在Eclipse版本越来越高.高版本的Eclipse甚至已经集成了Maven像是SpringSource的哪个版本.用习惯了Eclipse.在开发中还是不想更换掉自己的IDE.如此一来就又了 ...

  7. 什么是FastCGI?

    什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...

  8. Python列表及元组

    列表(list)是Python以及其他语言中最常用到的数据结构之一.Python使用使用中括号[ ] 来解析列表.列表是可变的(mutable)——可以改变列表的内容. 如 list1 = ['phy ...

  9. C# 之 抽象类与接口

    抽象类 C#同意把类和方法声明为abstract,即抽象类和抽象方法.抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的对象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构 ...

  10. Swift中的设计模式

    设计模式(Design Pattern)是 对软件设计中普遍存在的各种问题,所提出的解决方案.这个术语是由埃里希·伽玛等人(Erich Gamma,Richard Helm,Ralph Johnson ...