ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

FP增长算法

2021-12-21 23:03:43  阅读:256  来源: 互联网

标签:FP 增长 项集 频繁 算法 尿布 节点


Apriori原理:如果某个项集是频繁的,那么它的所有子集都是频繁的。

Apriori算法:

1 输入支持度阈值t和数据集
2 生成含有K个元素的项集的候选集(K初始为1)
3 对候选集每个项集,判断是否为数据集中某条记录的子集
4       如果是:增加候选集的计数
5 保留频繁集(计数>t)
6 根据频繁集生成含有K+1个元素的项集候选集
7 循环2-5,直至候选集为空
View Code

Apriori算法是有缺点的

缺点是:1.需要多长扫描 2.产生大量的候选频繁集 3.时间和空间复杂度高。

FP树增长算法是一种挖掘频繁项集的算法。Apriori算法虽然简单易实现,效果也不错,但是需要频繁地扫描数据集,IO费用很大。FP树增长算法有效地解决了这一问题,其通过两次扫描数据集构建FP树,然后通过FP树挖掘频繁项集。

背景知识

1.什么是项和项集?

比如我们在购物的时候,购物车内的每一件商品成为一项,若干个项的集合成为项集。例如{啤酒,尿布}成为一个二元项集。

2.什么是支持度?

支持度是在所有的项集中{X,Y}出现的可能性。

例如:购买商品的数据是(表示4条购物信息):

                                           ①{啤酒,尿布,娃哈哈}

                                           ②{啤酒,方便面}

                                           ③{尿布,奶粉}

                                           ④{啤酒,尿布,洗发水}

在这组数据中,{啤酒,尿布}出现的可能性就是这里面数据的概率。{啤酒,尿布}的支持度是2/4=50%.

{尿布,奶粉}的支持度是1/4=25%

3.什么是频繁项集?

我们首先设置一个最小阈值A,支持度大于A的项集就是频繁项集,小于A的项集被剔除。

比如 我们设置阈值为30%,在上面的例子中{啤酒,尿布}就是频繁项集,{尿布,奶粉}就要被剔除。

问题:如何求出频繁项集?

首先构造FP树 

然后通过FP树可以求出频繁项集

FP算法

其中istance表示购买次数,elements表示每次一次性购买的商品,每个字母表示商品。

步骤一:统计每个元素出现次数,保留频繁元素(假设次数>3),按照元素出 现次数降序排序。

其中h,j,p,w,v,u,n,o,q,p,e,m的次数是小于等于3的.因此把它们去掉,然后把其他的字母按照次数从大到小排列。

 步骤二:构建FP树

通过上面的序列按照每一行进入树根初始化树叶。如果没有相同的字母就重新创建叶子节点,每个叶子节点有字母其次数。

如图所示

 

步骤三:FP树中找到元素的前缀路径(以元素结尾的路径)

 

 为了方便查找,用的链表来加快寻找的前缀路径。

通过上面的操作就得到了如下所示的信息。

 

步骤四:根据前缀路径构造条件FP树

 因此我们可以得到以t为结尾的频繁项集:{y,t}{x,t},{z,t}....一直到{x,y,z,t}。

步骤5:递归构造下一层条件FP树,直至条件FP树为空.

总结:

有一个误区:不是在FP树上找频繁项,而是在条件FP树上找频繁项。    
扫描数据,得到所有频繁一项集的计数,然后删除支持度低于阈值的项,将一项频繁集放入项头表,并按照支持度降序排列。
扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。
读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。
从项头表的底部项依次向上找到项头表项对应的条件模式基。从条件模式基递归挖掘得到项头表项项的频繁项集。
如果不限制频繁项集的项数,则返回步骤4所有的频繁项集,否则只返回满足项数要求的频繁项集。

标签:FP,增长,项集,频繁,算法,尿布,节点
来源: https://www.cnblogs.com/zxz666/p/15713364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有