目录
1 关联分析相关概念
2 Apriori算法
2.1 基本概念
2.2 例子
2.3 缺点
2.4 改进
3 FP-growth算法
3.1 基本概念
3.2 例子
3.2.1 构建FP-tree
3.2.2 从FP-tree中挖掘频繁模式(Frequent Patterns)
关联分析又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。
关联分析是从大量数据中发现项集之间有趣的关联和相关联系。关联分析的一个典型例子是购物篮分析。该过程通过发现顾客放人其购物篮中的不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商制定营销策略。其他的应用还包括价目表设计、商品促销、商品的排放和基于购买模式的顾客划分。
定义:
1、事务:每一条交易称为一个事务,例如示例1中的数据集就包含四个事务。
2、项:交易的每一个物品称为一个项,例如Cola、Egg等。
3、项集:包含零个或多个项的集合叫做项集,例如{Cola, Egg, Ham}。
4、k−项集:包含k个项的项集叫做k-项集,例如{Cola}叫做1-项集,{Cola, Egg}叫做2-项集。
5、支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几。例如{Diaper, Beer}出现在事务 002、003和004中,所以它的支持度计数是3。
6、支持度:支持度计数除于总的事务数。例如上例中总的事务数为4,{Diaper, Beer}的支持度计数为3,所以它的支持度是3÷4=75%,说明有75%的人同时买了Diaper和Beer。
关联规则A->B的支持度support=P(AB),指的是事件A和事件B同时发生的概率。
7、频繁项集:支持度大于或等于某个阈值的项集就叫做频繁项集。例如阈值设为50%时,因为{Diaper, Beer}的支持度是75%,所以它是频繁项集。
8、前件和后件:对于规则{Diaper}→{Beer},{Diaper}叫做前件,{Beer}叫做后件。
9、置信度:对于规则{Diaper}→{Beer},{Diaper, Beer}的支持度计数除于{Diaper}的支持度计数,为这个规则的置信度。例如规则{Diaper}→{Beer}的置信度为3÷3=100%。说明买了Diaper的人100%也买了Beer。
置信度confidence=P(B|A)=P(AB)/P(A),指的是发生事件A的基础上发生事件B的概率。
10、强关联规则:大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则。
关联分析的最终目标就是要找出强关联规则。
电子商务中常用的一种数据挖掘方法就是从用户交易数据集中寻找商品之间的关联规则。关联规则中常用的一种算法是Apriori算法。该算法主要包含两个步骤:首先找出数据集中所有的频繁项集,这些项集出现的频繁性要大于或等于最小支持度;然后根据频繁项集产生强关联规则,这些规则必须满足最小支持度和最小置信度。
上面提到了最小支持度和最小置信度,事实上,在关联规则中用于度量规则质量的两个主要指标即为支持度和置信度。那么,给定关联规则X=>Y,即根据X推出Y。形式化定义为:
算法步骤:
1. 找出出现频率最大的一个项L1。
2. 根据L1找频繁“2项集”的集合C2.
3. 并剪掉不满足支持度阈值的项,得到L2。
4. 根据L2找频繁“3项集”的集合C3。
假设D表示交易数据集;K为项集,即包含k个项的集合;Lk表示满足最小支持度的k项集;Ck表示候选k项集。Apriori算法的参考文献描述如下。在该算法中,候选集的计算过程如下所示:
5. 根据性质和支持度阈值进行剪枝,得到L3。
Apriori性质:一个频繁项集的任一子集也应该是频繁项集。也就是,生成一个k-itemset的候选项时,如果这个候选项有子集不在(k-1)-itemset(已经确定是frequent的)中时,那么这个候选项就不用拿去和支持度判断了,直接删除。
6. 循环上述过程,直到得到空集C,即直到不能发现更大的频集L。
7. 计算最大频集L的非空子集,两两计算置信度,得到大于置信度阈值的强关联规则。
假设给定如下电子商务网站的用户交易数据集,其中,定义最小支持度为2/9,即支持度计数为2,最小置信度为70%,现在要计算该数据集的关联规则,如图所示。
步骤1,根据Apriori算法计算频繁项集。
1)计算频繁1项集。扫描交易数据集,统计每种商品出现的次数,选取大于或等于最小支持度的商品,得到了候选项集。
2)根据频繁1项集,计算频繁2项集。首先将频繁1项集和频繁1项集进行连接运算,得到2项集,如下所示:
扫描用户交易数据集,计算包含每个候选2项集的记录数。
根据最小支持度,得到频繁2项集。
3)根据频繁2项集,计算频繁3项集。首先将频繁2项集进行连接,得到{{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}},然后根据频繁项集性质进行剪枝(第一种剪枝),即频繁项集的非空子集必须是频繁的。
{I1,I2,I3}的2项子集为{I1,I2},{I1,I3},{I2,I3},都在频繁2项集中,则保留;
{I1,I2,I5}的2项子集为{I1,I2},{I1,I5},{I2,I5},都在频繁2项集中,则保留;
{I1,I3,I5}的2项子集为{I1,I3},{I1,I5},{I3,I5},由于{I3,I5}不是频繁2项集,移除该候选集;
{I2,I3,I4}的2项子集为{I2,I3},{I2,I4},{I3,I4},由于{I3,I4}不是频繁2项集,移除该候选集;
{I2,I3,I5}的2项子集为{I2,I3},{I2,I5},{I3,I5},由于{I3,I5}不是频繁2项集,移除该候选集;
{I2,I4,I5}的2项子集为{I2,I4},{I2,I5},{I4,I5},由于{I4,I5}不是频繁2项集,移除该候选集。通过剪枝,得到候选集{{I1,I2,I3},{I1,I2,I5}},扫描交易数据库,计算包含候选3项集的记录数(第二种阈值剪枝)。
4)根据频繁3项集,计算频繁4项集。重复上述的思路,得到{I1,I2,I3,I5},根据频繁项集定理,它的子集{I2,I3,I5}为非频繁项集,所以移除该候选集。从而,频繁4项集为空,至此,计算频繁项集的步骤结束。
步骤2,根据频繁项集,计算关联规则。
这里以频繁3项集{I1,I2,I5}为例,计算关联规则。{I1,I2,I5}的非空子集为{I1,I2}、{I1,I5}、{I2,I5}、{I1}、{I2}和{I5}。
规则1,{I1,I2}=>{I5},置信度为{I1,I2,I5}的支持度除以{I1,I2}的支持度,即2/4=50%,因其小于最小置信度,所以删除该规则。
同理,最后可以得到{I1,I5}=>{I2},{I2,I5}=>{I1}和{I5}=>{I1,I2}为3条强关联规则。
(1) 在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;
(2) 每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法。
1)基于划分的方法。
该算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频繁项集,然后把产生的频繁项集合并,用来生成所有可能的频繁项集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频繁项集至少在某一个分块中是频繁项集保证的。
上面所讨论的算法是可以高度并行的。可以把每一分块分别分配给某一个处理器生成频繁项集。产生频繁项集的每一个循环结束后.处理器之间进行通信来产生全局的候选是一项集。通常这里的通信过程是算法执行时间的主要瓶颈。而另一方面,每个独立的处理器生成频繁项集的时间也是一个瓶颈。其他的方法还有在多处理器之间共享一个杂凑树来产生频繁项集,更多关于生成频繁项集的并行化方法可以在其中找到。
2)基于Hash的方法。
Park等人提出了一个高效地产生频繁项集的基于杂凑(Hash)的算法。通过实验可以发现,寻找频繁项集的主要计算是在生成频繁2—项集Lk上,Park等就是利用这个性质引入杂凑技术来改进产生频繁2—项集的方法。
3)基于采样的方法。
基于前一遍扫描得到的信息,对它详细地做组合分析,可以得到一个改进的算法,其基本思想是:先使用从数据库中抽取出来的采样得到一些在整个数据库中可能成立的规则,然后对数据库的剩余部分验证这个结果。这个算法相当简单并显著地减少了FO代价,但是一个很大的缺点就是产生的结果不精确,即存在所谓的数据扭曲(Dataskew)。分布在同一页面上的数据时常是高度相关的,不能表示整个数据库中模式的分布,由此而导致的是采样5%的交易数据所花费的代价同扫描一遍数据库相近。
4)减少交易个数。
减少用于未来扫描事务集的大小,基本原理就是当一个事务不包含长度为k的大项集时,则必然不包含长度为k+1的大项集。从而可以将这些事务删除,在下一遍扫描中就可以减少要进行扫描的事务集的个数。这就是AprioriTid的基本思想。
由于Apriori方法的固有缺陷,即使进行了优化,其效率也仍然不能令人满意。2000年,Han Jiawei等人提出了基于频繁模式树(Frequent Pattern Tree,简称为FP-tree)的发现频繁模式的算法FP-growth。在FP-growth算法中,通过两次扫描事务数据库,把每个事务所包含的频繁项目按其支持度降序压缩存储到FP—tree中。在以后发现频繁模式的过程中,不需要再扫描事务数据库,而仅在FP-Tree中进行查找即可,并通过递归调用FP-growth的方法来直接产生频繁模式,因此在整个发现过程中也不需产生候选模式。该算法克服了Apriori算法中存在的问颢,在执行效率上也明显好于Apriori算法。
FP代表频繁模式(Frequent Pattern) ,算法主要分为两个步骤:FP-tree构建、挖掘频繁项集。
FP树通过逐个读入事务,并把事务映射到FP树中的一条路径来构造。由于不同的事务可能会有若干个相同的项,因此它们的路径可能部分重叠。路径相互重叠越多,使用FP树结构获得的压缩效果越好;如果FP树足够小,能够存放在内存中,就可以直接从这个内存中的结构提取频繁项集,而不必重复地扫描存放在硬盘上的数据。
通常,FP树的大小比未压缩的数据小,因为数据的事务常常共享一些共同项,在最好的情况下,所有的事务都具有相同的项集,FP树只包含一条节点路径;当每个事务都具有唯一项集时,导致最坏情况发生,由于事务不包含任何共同项,FP树的大小实际上与原数据的大小一样。
FP-growth算法通过构建FP-tree来压缩事务数据库中的信息,从而更加有效地产生频繁项集。FP-tree其实是一棵前缀树,按支持度降序排列,支持度越高的频繁项离根节点越近,从而使得更多的频繁项可以共享前缀。
根据2.2的例子,构建FP-tree。
得到新的顺序:
FP-tree的根节点为null,不表示任何项。接下来,对事务型数据库进行第二次扫描,从而开始构建FP-tree:
第一条记录
由于第二条记录
第三条记录
第四条记录
类似地,将第五条记录
第五条记录
以此类推的到最后的树:
我们从头表的底部开始挖掘FP-tree中的频繁模式。在FP-tree中以I5结尾的节点链共有两条,分别是<(I2:7),(I1:4),(I3:2),(I5:1)>和<(I2:7),(I1:4),(I5:1)>。
其中,第一条节点链表表示客户购买的物品清单
同理,第二条节点链表示客户购买的物品清单<(I2:7),(I1:4),(I5:1)>在数据库中只出现了一次。
我们将p的前缀节点链<(I2:1),(I1:1),(I3:1),(I5:1)>和<(I2:1),(I1:1),(I5:1)>称为I5的条件模式基(conditional pattern base)。
我们将I5的条件模式基作为新的事务数据库,每一行存储p的一个前缀节点链,根据第二节中构建FP-tree的过程,计算每一行记录中各种物品的支持度,然后按照支持度降序排列,仅保留频繁项集,剔除那些低于支持度阈值的项,建立一棵新的FP-tree,这棵树被称之为I5的条件FP-tree:
I5的条件FP-tree
从图可以看到I5的条件FP-tree中满足支持度阈值的剩下2个节点,所以以I5结尾的频繁项集有(I5:2),(I1,I5 :2),(I2,I5 :2),(I1,I2,I5 :2)。
同理可得I3的条件FP-tree:
I3的条件FP-tree
得到以I3结尾的频繁项集有(I3:4),(I1,I3 :4),(I2,I3 :4),(I1,I2,I3 :2)。
于是,以I4结尾的频繁项集有(I4:2),(I2,I4 :2),以I2结尾的频繁项集有(I2:7),以I1结尾的频繁项集有(I1:6),(I2,I1 :4)。
最后计算关联。
值得注意的是,对项的关键字排序将会影响FP树的结构。
https://www.jianshu.com/p/469dff109fae
https://blog.csdn.net/wsp_1138886114/article/details/80921905
https://www.cnblogs.com/bigmonkey/p/7478698.html