您的位置:首页 > 其它

基于频繁项集的数据挖掘

2015-11-28 12:38 232 查看

频繁项集的定义

一.一些概念

商场购物车事务:

TIDItems
1Bread, Milk

2Bread, Diaper, Beer, Eggs

3Milk, Diaper, Beer, Coke

4Bread, Milk, Diaper, Beer

5Bread, Milk, Diaper, Coke

关联规则的例子:
{Diaper} → {Beer},

{Milk, Bread} → {Eggs,Coke},

{Beer, Bread} → {Milk}

1.项集(Itemset):一个或多个项(Item)组成的集合.例如:{Milk, Bread, Diaper}
2.支持计数(Support count (σ)):一个项集在事务中出现的次数.
3.支持度(Support):项集在事务中出现的次数除以事务的总数.
s=σ ( Milk , Diaper, Beer )/| T |
4.置信度(Confidence):

c= σ ( Milk, Diaper, Beer )/ σ ( Milk , Diaper )

5.频繁项集(Frequent Itemset):支持度大于阈值Minsup threshold的项集.
6.关联规则(Association Rule):例如:{Milk, Diaper} → {Beer}被称为关联规则.

二.Apriori算法

我们进行关联规则挖掘的主要任务就是根据给定的事务,在事务中寻找支持度和置信度均大于阈值的关联规则来满足我们的需求.
还是上面的例子:
{Milk,Diaper} → {Beer} (s=0.4, c=0.67)

{Milk,Beer} → {Diaper} (s=0.4, c=1.0)

{Diaper,Beer} → {Milk} (s=0.4, c=0.67)

{Beer} → {Milk,Diaper} (s=0.4, c=0.67)

{Diaper} → {Milk,Beer} (s=0.4, c=0.5)

{Milk} → {Diaper,Beer} (s=0.4, c=0.5)

由例子可以看到,上面所有的关联规则的支持度都是相同的,但他们的置信度不同,所以我们在计算分析过程中可以将支持度和置信度分开,因此,提出了如下方法:
第一步:生成频繁项集:找到所有支持度大于阈值的频繁项集.
第二步:产生规则:在频繁项集中生成置信度大的关联规则.
我们可以注意到,即使这样,我们产生频繁项集时还会有很大的计算花销,假设我们有d个item,则所需要判断的项集有2的d次方个.这是很吓人的一个数字,会给计算机的计算带来非常大的压力.所以基于以上的原因,我们提出了Apriori算法用来降低算法的复杂度
Apriori算法的核心思想就是任何频繁项集的子集也一定是频繁的,换言之,如果我们能判断出一个项集是非频繁的,那所有以它为子集的父集合都是非频繁的,我们就可以删除这部分从而减少计算量.
具体的算法过程如下:
1.令k=1.
2.产生长度为1的频繁项集.
3.重复执行,直到没有新的频繁项集产生.
·根据长度为k的频繁项集,产生长度为k+1的候选项集.
·删除含有长度为k的的非频繁项集的长度为k+1的候选项集.
·扫描数据库,计算k+1候选项集的支持度.
·去除候选项集中支持度小于阈值的非频繁项集,仅留下频繁项集
一个例子:

通过Apriori算法确实能够减少复杂度,但是我们还有另一个可以提高速度的方法,就是在Apriori算法中,我们会扫描数据库来计算候选项集的支持度,为了减少比较的次数,我们可以将这些候选项集存储在一个哈希结构体中,这样我们在扫描的时候可以直接扫描哈希结构体来进行判断.有如下例子:
假如你有15个长度为3的候选集:
{1 4 5}, {1 2 4}, {4 5 7}, {1 2 5}, {4 5 8}, {1 5 9}, {1 3 6}, {2 3 4}, {5 6 7}, {3 4 5},{3 5 6}, {3 5 7}, {6 8 9}, {3 6 7}, {3 6 8}
你需要一个哈希函数和最大叶节点的大小,即一个叶节点能储存最多多少个项集.(如果存储的候选集的个数超过了最大值则需要分裂该节点)
具体如图所示:

哈希树生成之后,我们再顺序扫描数据库的时候每遇到一个事务,我们只需要将该事务进行一次哈希树遍历就可以对该事务完成计数.大大减少了程序执行的时间.
影响复杂度的因数:
1.Choice of minimum support threshold:在选择支持度阈值的时候如果支持度阈值设置的越小就意味着有更多的频繁项集产生,也就意味着有更多的候选集.
2.Dimensionality(number of items) of the data set:维度越高我们就需要更多的空间来存储每个item的计数值
3.Size of database:数据量越大,算法的执行时间会越长.
4.Average transaction width:事务的平均长度会影响频繁项集的最大长度和进行哈希树遍历的次数.
一些频繁项集产生的代替的方法
1.普通到特殊vs特殊到普通
2.广度优先vs深度优先
3.垂直数据存储vs水平数据存储
三.FP-growth算法
用一种称为FP-tree的数据结构来存储数据库数据.它是根据递归的执行分治(divide-and-conquer)方法来进行频繁项集的数据挖掘的.
FP-tree的构建过程:
·第一次扫描数据库,找到频繁一项集.
·将频繁项集根据频繁程度降序排列,并将数据库中的每一个事务中的项也按降序排列,同时删去非频繁一项集,并产生F-list.
·再一次扫描数据库,构建FP-tree.
具体构建方式如下:

我们在第二次扫描数据库时,分别扫描到了A,B,则将A连接到为空的根节点上,然后将B与A连接,并将其节点的支持设置为1,在扫描到第二条事务的时候,我们扫描到了B,C,D则将它也连接到根节点上,并将支持设置为1,如果在插入频繁一项集的过程中,事务中的节点已经在树中存在了,则使用存在的节点即可,并将该节点的支持度加一,完成后,将树的两侧含有的两个B用指针连接起来,依次向下扫描数据库并且构建FP-Tree,继续构建树.
总结一下,步骤为:

1、 构造项头表:扫描数据库一遍,得到频繁项的集合F和每个频繁项的支持度。把F按支持度递降排序,记为L。

2、 构造原始FPTree:把数据库中每个事物的频繁项按照L中的顺序进行重排。并按照重排之后的顺序把每个事物的每个频繁项插入以null为根的FPTree中。如果插入时频繁项节点已经存在了,则把该频繁项节点支持度加1;如果该节点不存在,则创建支持度为1的节点,并把该节点链接到项头表中。

生成了FP-Tree后,接下来要提出一个Conditional Pattern base(条件模式基)的概念,它是指在树中所有以M节点为叶节点的路径的集合,即项头表中有多少个频繁一项集就有多少个条件模式基,条件模式基的处理方式如下图所示:

即先将含有p的模式摘出来,然后调整每个节点上的支持度,调整完成后去除那些支持度小于阈值的节点,最后剩下的就是频繁项集.

三.ECLAT
采用垂直的数据存储方式,然后由k-1subsets组合成k-itemset,最后计算表的长度就是支持度,它的优点是速度快,但是缺点是往往数据库中的事务非常多,这种方式所形成的表对于内存来讲太长了.
四.树投影
项按照字典顺序排列,每一个节点存储着节点处的项集,按字典顺序所可能的扩展,指向它的祖先节点的指针,关于哪个事务在投影的数据库中含有该项集
五.最大频繁项集(Maximal Frequent Itemsets)
一个项集被称为最大频繁项集,即它的直接的父亲节点中没有频繁的.例如如果A是频繁的,但所有与A相连,包含A的项集都是非频繁的.
六.封闭的项集(Closed Itemsets)
一个项集被成为封闭的,即它的所有父亲项集合都没有与自己相同的支持度的项集.
七.最大项集挖掘算法(MaxMiner Algorithm)
1.初始化,产生一个节点N, h(N) = Φ  and  t(N)  = {A,B,C,D}.
2.考虑扩展N,如果对于某个i,有 i ∈ t(N), h(N) ∪ {i} 是不频繁的, 在扩展N之前,则从t(N)中删除i,如果h(N) ∪ t(N)是频繁的,则不需要扩展N
3.执行全局剪枝:如果一个最大模式被确认了,则剪掉所有h(N) ∪ t(N)是该最大模式的子集的节点.具体的例子如图:

八.挖掘闭模式(CLOSET Algorithm)
     暂时研究不明白
九.支持度分布的影响
许多实时的数据集都有一个关于支持度的偏态分布(skewed support distribution)
我们如何区选择一个合适的minsup threshold的呢,当我们把阈值设置的太高的时候我们也许会错过一些出现的比较少单我们很感兴趣的东西,例如奢侈品,如果选的太低的话又会耗费太多的计算复杂度并且项集的数量也会非常大.所以用单一的一个阈值也许是不够有效的.我们可以采用多个最小的支持度
MS(i): 项i的最小支持度(minimum support for item i)
MS(Milk)=5%, MS(Coke) = 3%,

MS(Broccoli)=0.1%,  MS(Salmon)=0.5%
MS({Milk, Broccoli}) = min (MS(Milk), MS(Broccoli))= 0.1%  
但是这也存在一个挑战,支持度再也不是单调的了,无法满足Apriori算法中的性质.
十.Multiple Minimum Support
1.我们首先根据item的最小的支持度将其升序(in ascending order)排序.
2.修正Apriori算法:(主要修正的是剪枝操作)
L1:频繁项集
F1:满足支持度大于最小支持度的项集
C2:从F1中产生的候选项集,而不是从L1
剪枝时只剪候选集合中包含第一个项的子集,例子如下:(例子不太懂,有的包含了第一个项却没有被删除)

产生规则

产生规则的主要任务就是给定一个频繁项集L,找到所有满足最小置信度要求的关联规则.通常情况下,置信度是不存在抗单调性的即c(ABC →D) 有可能会比 c(AB →D)大,但是对于从同一个项集里产生的规则的话,则有抗单调的属性.
例如:L = {A,B,C,D}:

c(ABC → D) ≥ c(AB → CD) ≥ c(A → BCD):显而易见因为分子相同分母逐渐增大
1.Apriori算法的规则生成:
例子如下:

即在规则结果中分享他们共同的前缀,规则的前半部分求交,后半部分求相同前缀的并.

模式评估
关联规则算法会产生很多关联规则,然而其中有一些是我们并不感性的,还有一些是重复的,兴趣度量可以帮助我们去剪枝和划分模式,但之前我们单单只是采用支持度和置信度作为唯一的评估方法.
我们使用一种叫做可能性表(Contingency table)的结构来计算我们想要的信息,具体的方式如下图:

如果只采用置信度来计算一个模式是否可靠的话可能会存在误导,例子如下:

由于仅仅使用支持度-置信度框架进行相关的度量存在上面的不足,所以我们可以对该框架进行扩充,加入相关规则,即规则的前后是否相关.
   P(S∧B) = P(S) × P(B) => Statistical independence

  P(S∧B) > P(S) × P(B) => Positively correlated

P(S∧B) < P(S) × P(B) => Negatively correlated

我们有很多的评价方法,Lift即是其中之一.

Lift = P ( Y | X )/P ( Y )

由此我们得出一个好的度量有一下三种特性:

1.M(A,B) = 0 如果A,B相互独立的话.

2.当P(A)和 P(B)保持不变的时候M(A,B)会随着P(A,B)的增加而单调递增.

3.当P(A,B)和
P(B)保持不变的时候M(A,B)会随着P(A)的增加而单调递增.

多种模式评估的方式(后续整理)

多层关联规则:(后续整理)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: