关联分析直观理解 算法
关联分析中最有名的例子是“尿布与啤酒”。据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒。这样商店实际上能够将尿布与啤酒放在一块,并确保在周四全价销售从而获利。固然,这家商店并无这么作。数据结构
频繁项集是指那些常常出如今一块儿的物品集合,好比{葡萄酒,尿布, 豆奶}就是频繁项集的一个例子ide
支持度(support)spa
一个项集的支持度(support)被定义为数据集中包含该项集的记录所占的比例 {豆奶}的支持度为4/5。{豆奶,尿布}的支持度为3/5blog
可信度(confidence )排序
可信度或置信度(confidence)是针对一条诸如{尿布} ➞ {葡萄酒}的关联规则来定义的。这条规则的可信度被定义为“支持度({尿布, 葡萄酒})/支持度({尿布})”。因为{尿布, 葡萄酒}的支持度为3/5,尿布的支持度为4/5,因此“尿布 ➞ 葡萄酒”的可信度为3/4=0.75。这意味着对于包含“尿布”的全部记录,咱们的规则对其中75%的记录都适用。Apriori算法的目标是找到最大的K项频繁集 支持度和可信度是用来量化关联分析是否成功的方法。假设想找到支持度大于0.8的全部项集,应该如何去作?一个办法是生成一个物品全部可能组合的清单,而后对每一种组合统计它出现的频繁程度,但当物品成千上万时,很是慢,这时就能用Apriori算法递归
关联分析中最有名的例子是“尿布与啤酒”。据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒。这样商店实际上能够将尿布与啤酒放在一块,并确保在周四全价销售从而获利。固然,这家商店并无这么作。事件
通常咱们使用三个指标来度量一个关联规则,这三个指标分别是:支持度、置信度和提高度。事务
Support(支持度):表示同时包含A和B的事务占全部事务的比例。若是用P(A)表示使用A事务的比例,那么Support=P(A&B)内存
Confidence(可信度):表示使用包含A的事务中同时包含B事务的比例,即同时包含A和B的事务占包含A事务的比例。公式表达:Confidence=P(A&B)/P(A)
Lift(提高度):表示“包含A的事务中同时包含B事务的比例”与“包含B事务的比例”的比值。公式表达:Lift=(P(A&B)/P(A))/P(B)=P(A&B)/P(A)/P(B)。
提高度反映了关联规则中的A与B的相关性,提高度>1且越高代表正相关性越高,提高度<1且越低代表负相关性越高,提高度=1代表没有相关性。
举一个例子:
10000个超市订单(10000个事务),其中购买三元牛奶(A事务)的6000个,购买伊利牛奶(B事务)的7500个,4000个同时包含二者。
那么经过上面支持度的计算方法咱们能够计算出:
三元牛奶(A事务)和伊利牛奶(B事务)的支持度为:P(A&B)=4000/10000=0.4.
三元牛奶(A事务)对伊利牛奶(B事务)的置信度为:包含A的事务中同时包含B的占包含A的事务比例。4000/6000=0.67,说明在购买三元牛奶后,有0.67的用户去购买伊利牛奶。
伊利牛奶(B事务)对三元牛奶(A事务)的置信度为:包含B的事务中同时包含A的占包含B的事务比例。4000/7500=0.53,说明在购买三元牛奶后,有0.53的用户去购买伊利牛奶。
上面咱们能够看到A事务对B事务的置信度为0.67,看似至关高,可是其实这是一个误导,为何这么说?
由于在没有任何条件下,B事务的出现的比例是0.75,而出现A事务,且同时出现B事务的比例是0.67,也就是说设置了A事务出现这个条件,B事务出现的比例反而下降了。这说明A事务和B事务是排斥的。 下面就有了提高度的概念。
咱们把0.67/0.75的比值做为提高度,即P(B|A)/P(B),称之为A条件对B事务的提高度,即有A做为前提,对B出现的几率有什么样的影响,若是提高度=1,说明A和B没有任何关联,若是<1,说明A事务和B事务是排斥的,>1,咱们认为A和B是有关联的,可是在具体的应用之中,咱们认为提高度>3才算做值得承认的关联。
提高度是一种很简单的判断关联关系的手段,可是在实际应用过程当中受零事务的影响比较大,零事务在上面例子中能够理解为既没有购买三元牛奶也没有购买伊利牛奶的订单。数值为10000-4000-2000-3500=500,可见在本例中,零事务很是小,可是在现实状况中,零事务是很大的。在本例中若是保持其余数据不变,把10000个事务改为1000000个事务,那么计算出的提高度就会明显增大,此时的零事务很大(1000000-4000-2000-3500),可见提高度是与零事务有关的。
根据《数据挖掘概念与技术》一书的说法,经常使用的判断方法 还不是提高度,而是 KULC度量+不平衡比(IR) 。他们能够有效的下降零事务形成的影响。
下面补充一下KULC和IR的说明: KULC=0.5*P(B|A)+0.5*P(A|B)
该公式表示 将两种事件做为条件的置信度的均值,避开了支持度的计算,所以不会受零和事务的影响。在上例中,KULC值= (4000/6000+4000/7500)/2=0.6 IR=P(B|A)/P(A|B) ,IR用来指示一种状况 假如在上例中6000个事务包含三元牛奶,75000个包含伊利牛奶,同时购买依旧为4000 则: KULC=0.5*(4000/75000+4000/6000)=0.36 IR=(4000/6000)/(4000/75000)=12.5 这说明这两个事务的关联关系很是不平衡,购买三元牛奶的顾客极可能同时会买伊利牛奶,而购买了伊利牛奶的用户不太会再去买三元牛奶。很好理解,A对B的支持度远远高于B对A的支持度。
Apriori算法
咱们的数据集D有4条记录,分别是134,235,1235和25。
如今咱们用Apriori算法来寻找频繁k项集,最小支持度设置为50%。
首先咱们生成候选频繁1项集,包括咱们全部的5个数据并计算5个数据的支持度,计算完毕后咱们进行剪枝,数据4因为支持度只有25%被剪掉。咱们最终的频繁1项集为1,2,3,5
如今咱们连接生成候选频繁2项集,包括12,13,15,23,25,35共6组。
扫描数据集计算候选频繁2项集的支持度,因为12和15的支持度只有25%而被筛除,获得真正的频繁2项集,包括13,23,25,35。
连接生成候选频繁3项集,按照字典序组合,获得235。
FP-Tree
Apriori做为一个挖掘频繁项集的算法,Apriori算法须要屡次扫描数据,I/O是很大的瓶颈。为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,不管多少数据,只须要扫描两次数据集,所以提升了算法运行的效率。下面咱们就对FP Tree算法作一个总结。
FP Tree算法小结
这里咱们对FP Tree算法流程作一个概括。FP Tree算法包括三步:
1)扫描数据,获得全部频繁一项集的的计数。而后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。
2)扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。
3)读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。若是有共用的祖先,则对应的公用祖先节点计数加1。插入后,若是有新节点出现,则项头表对应的节点会经过节点链表连接上新节点。直到全部的数据都插入到FP树后,FP树的创建完成。
4)从项头表的底部项依次向上找到项头表项对应的条件模式基。从条件模式基递归挖掘获得项头表项项的频繁项集。
5)若是不限制频繁项集的项数,则返回步骤4全部的频繁项集,不然只返回知足项数要求的频繁项集。
FP tree算法总结
FP Tree算法改进了Apriori算法的I/O瓶颈,巧妙的利用了树结构,这让咱们想起了BIRCH聚类,BIRCH聚类也是巧妙的利用了树结构来提升算法运行速度。利用内存数据结构以空间换时间是经常使用的提升算法运行时间瓶颈的办法。
在实践中,FP Tree算法是能够用于生产环境的关联算法,而Apriori算法则作为先驱,起着关联算法指明灯的做用。除了FP Tree,像GSP,CBA之类的算法都是Apriori派系的。