2.3FP_Growth算法
1)、基本思想
FP-Growth即频繁模式增长算法是韩家炜老师于2000年提出的关联分析算法。
①该算法采用分治策略:将提供的频繁项集的数据压缩到一颗频繁模式树(FP-Tree),但仍保留项集关联信息。
②该算法与Apriori算法有两个不同:第一,不产生候选集;第二,只需要两次遍历数据库。
2)、步骤
(1)构造FP-树:
①扫描事务数据库D一次,收集频繁项的集合F和它们的支持度。
②对F按支持度降序排列,结果为频繁项表L。
③创建FP-树的根节点,以“null”标记它。
④对于D中每个事务Trans,执行:选择Trans中的频繁项,并按L中的次序排序。
⑤设排序后的频繁项表为[p | P],其中小p是第一个元素,而大P是剩余元素的表。
⑥调用insert_tree([ p | P ],T),参数是频繁项表和事务。(下面是重点,就是这个树插入操作该怎么执行,不理解可以看实例)
⑦当N.name == p.name(即N为当前事务T中的商品(T的子女),p为从根结点开始事务T之前事务中的的商品), 则N计数+1。
⑧否则,创建一个新的商品N(节点),将其计数设置为1,并且连接到它的父节点T,并且通过结点链结构将其连接到具有相同name的结点。
⑨若果大P非空,递归调用insert_tree(P,N)。
(2)根据FP-树挖掘频繁项集:
①从频繁项表L的尾部商品P开始挖掘FP-tree中的频繁模式。
②遍历所有P的祖先结点,这些P的前缀节点链称为P的条件模式基。
③我们将P的条件模式基作为新的事务数据库,每一行存储P的一个前缀节点链。
④根据第一步构建FP-tree的过程,计算每一行记录中各种物品的支持度,然后按照支持度降序排列,仅保留频繁项集,剔除那些低于支持度阈值的项,建立一棵新的FP-tree,这棵树被称之为P的条件FP-tree。
⑤从PF-tree中得到P的频繁项集。
⑥以此从频繁项表L倒序挖掘频繁模式。
3)、实例
数据:
事务商品IdT1I1,I2,I5T2I2,I4T3I2,I3T4I1,I2,I4T5I1,I3T6I2,I3T7I1,I3T8I1,i2,I3,I5T9I1,I2,I3
(1)构造FP-树:
①
I1I2I3I4I567622
②
I2I1I3I4I576622
③
④⑤
⑥⑦⑧⑨
(2)根据FP-树挖掘频繁项集:
①找到I5
②I5的条件模式基:<(I2,I1:1)>、<(I2,I1,I3:1)>,冒号后面是次数
③
事务商品idt1I2,I1t2I2,I1,I3
④
⑤I5的频繁项集:{{I2,I5:2},{I1,I5:2},{I2,I1,I5:2}}
⑥以此类推,考虑I4,I3,I1:
I4的频繁项集:{{I2,I4:2}};
I3的频繁项集:{{I2,I3:4},{I1,I3:4},{I2,I1,I3:2}};
I1的频繁项集:{{I2,I1:4}}。
4)、优缺点
优点:
①对于大数据,有效的避免了重复扫描数据库的开销。
②采取模式增长的递归策略,创造性的提出来无候选项目集的挖掘方法,而且在挖掘时效率很好。
③采用分治策略,将压缩后的数据库DB分成一组条件数据库Dn,每个条件数据库关联一个频繁项,并分别挖掘每一个条件的数据库,而条件数据库Dn要远远小于数据库DB
缺点:
①在挖掘过程中,如果一项大项集的数量很多,并且由原数据库得到的FP-Tree的分支很多,而且分支长多有很长时,该算法需要构造巨大的条件FP-Tree,不仅费时而且要占用大量的空间,挖掘效率不高。
②由于海量的事物集合存放在大型数据库中,经典的FP-Growth算法在生成新的FP-Tree时,每次都要遍历调减模式两次,导致系统需要反复申请本地以及数据库服务器的资源查询相同内容的海量数据,一方面降低了算法效率,另一方面使服务器负荷,不利于数据库服务器正常工作。
5)练手项目
定义10个交易日内,行业涨幅超过大盘涨幅5%的行业为好行业,查看两个行业的联动可能性,一个行业上涨预测另一个行业趋势,然后提前埋伏进去,获得好的收益。
下面是事务矩阵:
结果:
综合可知:
{ 银行,券商,钢铁:3 / 10 }这三个行业在一周内具有较高的联动可能性。
{ 银行,券商:4 / 10 },{ 银行,钢铁:4 / 10 }表现为,钢铁上涨时,银行接下来一段时间会受影响。