无监督学习3--关联算法

无监督学习3–关联算法

什么是关联规则?
“A事件发生,B事件很可能也会发生。“
提到关联规则,肯定会想到那个经典案例,尿布和啤酒。所谓关联规则就是有关联的规则,比如买了啤酒的同时也买尿布,{啤酒}–>{尿布}(X->Y)就是一条关联规则。
这里有两个概念:支持度和置信度
支持度(Support):
Support(A->B)=P(A U B)。支持度揭示了A与B同时出现的概率。如果A与B同时出现的概率小,说明A与B的关系不大;如果A与B同时出现的非常频繁,则说明A与B总是相关的。
置信度(Confidence):
Confidence(A->B)=P(A | B)。置信度揭示了A出现时,B是否也会出现或有多大概率出现。如果置信度度为100%,则A和B可以捆绑销售了。如果置信度太低,则说明A的出现与B是否出现关系不大。

1.Apriori算法简介
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过频繁项集生成和关联规则生成两个阶段来挖掘频繁项集。它的主要任务就是设法发现事物之间的内在联系。
比如在常见的超市购物数据集,或者电商的网购数据集中,如果我们找到了频繁出现的数据集,那么对于超市,我们可以优化产品的位置摆放,对于电商,我们可以优化商品所在的仓库位置,达到节约成本,增加经济效益的目的。
算法已经被广泛的应用到商业、网络安全,移动通信等各个领域。

2.关联规则的挖掘步骤
(1)生成频繁项集和生成规则
(2)找出强关联规则
(3)找到所有满足强关联规则的项集

3.算法举例:
在这里插入图片描述
Apriori使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。其原理是如果某个项集是频繁的,那么它的子集也是频繁的。反过来说,如果一个项集是非频繁的,那么它的所有超集也是非频繁的。比如{1,2}出现的次数已经小于最小支持度了(非频繁的),那么超集{0,1,2}的组合肯定也是非频繁项集。
连接步
若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个项相同,而最后一个项不同,则证明它们是可连接的,即这个k-1项集可以联姻,即可连接生成k项集。使如有两个3项集:{a, b, c}{a, b, d},这两个3项集就是可连接的,它们可以连接生成4项集{a, b, c, d}。又如两个3项集{a, b, c}{a, d, e},这两个3项集显示是不能连接生成3项集的;
剪枝步
若一个项集的子集不是频繁项集,则该项集肯定也不是频繁项集。例如,若存在3项集{a, b, c},如果它的2项子集{a, b}的支持度即同时出现的次数达不到阈值,则{a, b, c}同时出现的次数显然也是达不到阈值的。因此,若存在一个项集的子集不是频繁项集,那么该项集就应该被无情的舍弃。

4.算法的优缺点:
优点:
(1)使用先验原理,大大提高了频繁项集逐层产生的效率;
(2)简单易理解;数据集要求低。
缺点:
(1)每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;
(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法。

5.Apriori算法应用
推荐系统:用关联算法做协同过滤
可以找出用户购买的所有物品数据里频繁出现的项集,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。
注意:
Apriori不适于非重复项集数元素较多的案例,建议分析的商品种类为10类左右。
Apriori算法是一个经典的频繁项集的挖掘算法,很多算法都是基于Apriori算法而产生,包括FP-Growth、GSP、CBA等。这些算法利用了Apriori算法的思想,但是对其做了改进,挖掘效率更好一些,因此现在一般很少直接用Apriori算法来挖掘数据,但理解Apriori算法是理解其它相关算法的前提。

6.FP-growth算法简介
2000年,Han Jiawei等人提出了基于频繁模式树(Frequent Pattern Tree,简称为FP-tree)的发现频繁模式的算法FP-growth。
FP-growth算法建立在Apriori算法的概念之上,不同之处是它采用了更高级的数据结构FP-tree减少扫描数据次数,只需要两次扫描数据库,相比于Apriori减少了I/O操作,克服了Apriori算法需要多次扫描数据库的问题。
由于Apriori方法的固有缺陷.即使进行了优化,其效率也仍然不能令人满意。
在FP-growth算法中,只需要通过两次扫描事务数据库,把每个事务所包含的频繁项目按其支持度降序压缩存储到FP—tree中。在以后发现频繁模式的过程中,不需要再扫描事务数据库,而仅在FP-Tree中进行查找即可,并通过递归调用FP-growth的方法来直接产生频繁模式,因此在整个发现过程中也不需产生候选模式。该算法克服了Apriori算法中存在的问颢.在执行效率上也明显好于Apriori算法。

FP-growth的数据结构:
为了减少I/O次数, FP-growth算法引入了一些数据结构来临时存储数据。这个数据结构包括三部分:
一个项头表里面记录了所有的1项频繁集出现的次数,按照次数降序排列。
FP-Tree将原始数据集映射到了内存中的一颗FP树。
节点链表所有项头表里的1项频繁集都是一个节点链表的头,它依次指向FP树中该1项频繁集出现的位置。这样做主要是方便项头表和FP-Tree之间的联系查找和更新,也好理解。

7.算法举例:
在这里插入图片描述
FP-Tree的建立:
在这里插入图片描述
在这里插入图片描述
项头表和FP树的建立过程。
有了项头表和排序后的数据集,我们就可以开始FP树的建立了。开始时FP树没有数据,建立FP树时我们一条条的读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。
首先,我们插入第一条数据ACEBF,如下图所示。此时FP树没有节点,因此ACEBF是一个独立的路径,所有节点计数为1, 项头表通过节点链表链接上对应的新增节点。
在这里插入图片描述
接着我们插入数据ACG,如图所示。由于ACG和现有的FP树可以有共有的祖先节点序列AC,因此只需要增加一个新节点G,将新节点G的计数记为1。同时A和C的计数加1成为2,对应的G节点的节点链表要更新
在这里插入图片描述
同样的办法可以更新后面8条数据,具体图片省略。
最终的树如下:
在这里插入图片描述
FP-Tree数据结构与挖掘:
得到了FP树和项头表以及节点链表后,怎么去挖掘频繁项集呢?
从项头表的底部项依次向上挖掘。
找到每一项条件模式基:以要挖掘的节点作为叶子节点所对应的FP子树。得到这个FP子树,将子树中每个节点的的计数设置为叶子节点的计数,并删除计数低于支持度的节点。
从条件模式基就可以递归挖掘得到频繁项集。
在这里插入图片描述
还是以上面的例子来讲解。我们看看先从最底下的F节点开始,我们先来寻找F节点的条件模式基,由于F在FP树中只有一个节点,因此候选就只有下图左所示的一条路径,对应{A:8,C:8,E:6,B:2, F:2}。我们接着将所有的祖先节点计数设置为叶子节点的计数,即FP子树变成{A:2,C:2,E:2,B:2, F:2}。一般我们的条件模式基可以不写叶子节点,因此最终的F的条件模式基如下图右所示。
很容易得到F的频繁2项集为{A:2,F:2}, {C:2,F:2}, {E:2,F:2}, {B:2,F:2}。递归合并二项集,得到频繁三项集为{A:2,C:2,F:2},{A:2,E:2,F:2},…还有一些频繁三项集,就不写了。当然一直递归下去,最大的频繁项集为频繁5项集,为{A:2,C:2,E:2,B:2,F:2}
在这里插入图片描述
F挖掘完了,开始挖掘D节点。D节点比F节点复杂一些,因为它有两个叶子节点,因此首先得到的FP子树如图左。接着将所有的祖先节点计数设置为叶子节点的计数,即变成{A:2, C:2,E:1 G:1,D:1, D:1}此时E节点和G节点由于在条件模式基里面的支持度低于阈值,被我们删除,最终在去除低支持度节点并不包括叶子节点后D的条件模式基为{A:2, C:2}。通过它,我们很容易得到D的频繁2项集为{A:2,D:2}, {C:2,D:2}。递归合并二项集,得到频繁三项集为{A:2,C:2,D:2}。D对应的最大的频繁项集为频繁3项集。
在这里插入图片描述
同样的方法可以得到B的条件模式基如下图右边,递归挖掘到B的最大频繁项集为频繁4项集{A:2, C:2, E:2,B:2}。
在这里插入图片描述
挖掘到的G的条件模式基如图右边,递归挖掘到G的最大频繁项集为频繁4项集{A:5, C:5, E:4,G:4}。
在这里插入图片描述
E的条件模式基如图右边,递归挖掘到E的最大频繁项集为频繁3项集{A:6, C:6, E:6}。
在这里插入图片描述
C的条件模式基如下图右边,递归挖掘到C的最大频繁项集为频繁2项集{A:8, C:8}。
至于A,由于它的条件模式基为空,因此可以不用去挖掘。
至此我们得到了所有的频繁项集,如果我们只是要最大的频繁k项集,从上面的分析可以看到,最大的频繁项集为5项集,包括{A:2, C:2, E:2,B:2,F:2}。

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

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

FP-Growth算法优缺点:
优点:
(1) FP-Growth一般要快于Apriori ;
缺点:
(1) FP-Growth实现比较困难,在某些数据集上性能会下降;
(2) FP-Growth适用数据类型:离散型数据

FP-Growth算法使用方法:
目前Python没有API可以直接调用FP-Growth算法,通过编写函数和模块实现,比较复杂;
Spark中提供了相关模块可以直接调用,通过Python可以调用Spark接口Pyspark,创建spark的环境后,调用Spark中的工具库pyspark.mllib.fpm模块中的FPGrowth方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值