频繁项挖掘算法Apriori和FGrowth
一:背景介绍
最近在公司用spark的平台做了一个购物车的推荐,用到的算法主要是FGrowth算法,它是Apriori算法的升级版,算法的主要目的是找出频繁进行一起购买的商品。本文主要介绍两个算法的背景,触及到公司的推荐具体流程,这里就不介绍了。
二:Apriori
Apriori算法是挖掘频繁项的基础算法,通过挖掘用户购买订单,发现频繁一起购买的商品集合。它采用一种逐层搜索的迭代方法,用k项集来搜索(k+1)项集。首先通过扫描数据中的订单,累计每项的计数,收集满足最小支持度的项,找出1项集的集合L1,然后用L1来找出频繁2项集的集合L2,使用L2再找出L3,如此循环下去。了解这个算法,有个两个概念需要了解的:支持度和置信度
支持度: support(A=>B)=P(A*B) 表示数据库事务中包含A和B的概率
置信度: confidence(A=>B)=P(B|A) 表示在A发生的情况下B发生的概率
下面用具体例子来理解aprior,某个商场的交易数据中保存如下数据:
|
交易ID |
商品ID列表 |
交易ID |
商品ID列表 |
|
|
T100 |
I1,I2,I5 |
T600 |
I2,I3 |
|
|
T200 |
I2,I4 |
T700 |
I1,I3 |
|
|
T300 |
I2,I3 |
T800 |
I1,I2,I3,I5 |
|
|
T400 |
I1,I2,I4 |
T900 |
I1,I2,I3 |
|
|
T500 |
I1,I3 |
1.1.第一遍,扫描所有的事务,对每个商品出现次数统计
1.2.假设我们指定的支持度为2,则频繁一项集L1,它由大于支持度2的1项集组成,第一遍扫描数据库产生1项集L1,统计结果为:
|
项集 |
支持度计数 |
|
{I1} |
6 |
|
{I2} |
7 |
|
{I3} |
6 |
|
{I4} |
2 |
|
{I5} |
2 |
每个项集的支持度更指定的支持度比较,在指定支持度以上的保留,这里大于支持度为2的,进行保留,得到:
|
项集 |
支持度计数 |
|
{I1} |
6 |
|
{I2} |
7 |
|
{I3} |
6 |
|
{I4} |
2 |
|
{I5} |
2 |
1.3.由L1项集自连接产生2项集L2,然后扫描数据库,得到此2项集在事务中的支持度
|
项集 |
支持度计数 |
|
{I1,I2} |
4 |
|
{I1,I3} |
4 |
|
{I1,I4} |
1 |
|
{I2,I3} |
2 |
|
{I2,I3} |
4 |
|
{I2,I4} |
2 |
|
{I2,I5} |
2 |
|
{I3,I4} |
0 |
|
{I3,I5} |
1 |
|
{I4,I5} |
0 |
大于支持度为2的保留
|
项集 |
支持度计数 |
|
{I1,I2} |
4 |
|
{I1,I3} |
4 |
|
{I2,I3} |
2 |
|
{I2,I3} |
4 |
|
{I2,I4} |
2 |
|
{I2,I5} |
2 |
|
{I3,I5} |
1 |
1.4 由2项集L2自连接产生3项集L3,然后扫描数据库,此3项集在事务中的支持度
|
项集 |
支持度计数 |
|
{I1,I2,I2} |
2 |
|
{I1,I2,I5} |
2 |
保留支持度大于2的3项集,所有之类全部保留下来,得到满足2支持度的3项集:
|
项集 |
支持度计数 |
|
{I1,I2,I2} |
2 |
|
{I1,I2,I5} |
2 |
1.5有频繁项来产生关联规则
当用apriori算法找出频繁项集之后,可以用他们来产生关联规则,关联规则的计算方式为:
P(A|B)=P(AB)/P(B)
即当B发生时,A发生的概率。我们可以用这个来进行推荐,如果我们指定置信度为70%,当P(A|B)>=70%时,我们将在客户买A商品是给他推荐B商品,例如当有个顾客买了把{I1,I2}放进购物车了,我们应该给她推荐什么商品呢?
我们来计算{I1,I2}=>{I5}的概率,即当他把{I1,I2}放进购物车了,我们给他推荐商品{I5}的概率,这里计算的到
置信度为:2/4=50%
即他有50%的概率会选者I5,到底推不推,看你设置的最小置信度了,如果大于你设置的最小置信度则推。
算法缺点:
每次由(k-1)项集L(K-1)产生K项集L(K)时,自连接产生采用枚举的方式,而且产生的项集每次都得去扫描一下数据库
如何提高Apriori算法的效率,有比较多的方法:基于散列,抽样等方式,比较出名的改进算法有FPGrowth算法
由于感觉这里篇幅比较长了,FGrowth算法放到下一篇文章中介绍,点击下面的链接查看
http://www.cnblogs.com/aijianiula/p/5398179.html
频繁项挖掘算法Apriori和FGrowth的更多相关文章
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...
- 【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用
今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 + Mahout0.6 ...
- 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比
最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...
- 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比(Python实现)
最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 关联规则挖掘之apriori算法
前言: 众所周知,关联规则挖掘是数据挖掘中重要的一部分,如著名的啤酒和尿布的问题.今天要学习的是经典的关联规则挖掘算法--Apriori算法 一.算法的基本原理 由k项频繁集去导出k+1项频繁集. 二 ...
- 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...
- 关联规则挖掘算法之Apriori算法
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集. 关于这个算法有一个非常有名的故事:"尿布和啤酒".故事是 ...
- FP-growth算法发现频繁项集(一)——构建FP树
常见的挖掘频繁项集算法有两类,一类是Apriori算法,另一类是FP-growth.Apriori通过不断的构造候选集.筛选候选集挖掘出频繁项集,需要多次扫描原始数据,当原始数据较大时,磁盘I/O次数 ...
随机推荐
- caffe修改需要的东西
https://blog.csdn.net/zhaishengfu/article/details/51971768?locationNum=3&fps=1
- hrbust-1545-基础数据结构——顺序表(2)
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...
- pre-receive hook declined
没有master分支的代码提交权限. 分配权限或者提交分支合并申请
- CS193p Lecture 4 - Foundation, Attributed Strings
消息机制 调用一个实例(instance)的方法(method),就是向该实例的指针发送消息(message),实例收到消息后,从自身的实现(implementation)中寻找响应这条消息的方法. ...
- UVa-156-反片语
这题比较精妙的是,我们对于单词重排,实际上是进行了标准化的处理,即按照字典序排序. 这样的话,就很方便地处理了单词的重排问题,我们不需要使用全排列函数进行排列尝试,我们直接化简为一,然后进行比较就可以 ...
- js-DOM-css的className相关
1.在非标准的浏览器,IE8及以下的浏览器不支持className的操作,包括getElementByClassName,addClassName,removeClassName; 2.getEle ...
- (转)WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
[root@bak1 bak]# scp gwsyj.sql.gz root@192.168.21.65:/data/dbdata/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- 基础训练 FJ的字符串
FJ的字符串 #include<iostream> #include<string.h> using namespace std; int main(){ string str ...
- PAT Basic 1029
1029 旧键盘 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输 ...
- sso简单原理及实现
转自:http://www.cnblogs.com/ywlaker/ 一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态 ...