数据挖掘第一课学习笔记(Apriori算法和FPTree算法)

首先明确关联规则挖掘中的几个概念定义:

假设有数据集表示几个客户买的东西如下:

t1: 牛肉、鸡肉、牛奶
t2: 牛肉、奶酪
t3: 奶酪、靴子
t4: 牛肉、鸡肉、奶酪
t5: 牛肉、鸡肉、衣服、奶酪、牛奶
t6: 鸡肉、衣服、牛奶
t7: 鸡肉、牛奶、衣服

ti表示不同的客户在一次购物中买的东西,那么:


事务&事务集合:每次顾客购买的一次商品集合ti就称作一个事务,所有的T={t1,t2……t7}称作事务集合。

商品集合:这个很好理解,就是所有商品的集合I={牛肉、鸡肉、牛奶、奶酪、靴子、衣服}

支持度&置信度:对于一条规则X—>Y,它的支持度(support)=(X,Y).count/T.count(x,y同时出现的事务数除以总事务数),置信度(confidence)=(X,Y).count/X.count (x,y同时出现的事务数除以x出现的事务数)。其中(X,Y).count表示T中同时包含X和Y的事务的个数,X.count表示T中包含X的事务的个数。

举例来说,假如有一条规则为牛肉—>鸡肉,那么同时购买牛肉和鸡肉的顾客比例是3/7,而购买牛肉的顾客当中也购买了鸡肉的顾客比例是3/4。这两个比例参数是很重要的衡量指标,它们在关联规则中称作支持度(support)和置信度(confidence)。对于规则:牛肉—>鸡肉,它的支持度为3/7,表示在所有顾客当中有3/7同时购买牛肉和鸡肉,其反应了同时购买牛肉和鸡肉的顾客在所有顾客当中的覆盖范围;它的置信度为3/4,表示在买了牛肉的顾客当中有3/4的人买了鸡肉,其反应了可预测的程度,即顾客买了牛肉的话有多大可能性买鸡肉。

频繁项集:这个就用百度百科的做解释吧,项的集合称为项集。包含k个项的项集称为k-项集。例如集合{computer,ativirus_software}是一个二项集。项集的出项频率是包含项集的事务数,简称为项集的频率,如果项集I的相对支持度满足预定义的最小支持度阈值,则I是频繁项集。

Apriori算法

这个算法,其实比较简单,好理解,简单来说就是,如果有一个集合S,他不是频繁项集,那么包含他的所有项集都不是频繁项集。举例来说,上面的那个事务集,如果我们定义支持度最小为2,那么显然{靴子}不是频繁项集,那么包含{靴子}的所有集合都不会是频繁项集,在搜索时就可以去掉。
Aprior算法是采取逐步合并的方式,求取频繁k项集,并且在合并之前,要过滤掉非频繁项集。流程类似如下:

原始数据 --> 一级构建 --> 一级过滤 --> 二级构建 --> 二级筛选 --> 三级......


第k级会生成 k项集 和 过滤掉非频繁项集,保留下k项频繁项集。


每一级的构建都会引起数据量的增加,而每一级的过滤后,会大大减少数据量,便于下一级的运算。


逐步过滤和合并,直至生成极少数量的频繁项集,或者极大频繁项集.


Aprior有点类似广度优先的算法。


为了理解这个算法,还是用举例来说明的方式:
1,2,3
1,2,4
1,3,4
1,2,3,5
1,3,5
2,4,5
1,2,3,4
假设最小支持度为3。(或者准确的讲叫3/7)
首先找出1-项集:
{1},{2},{3},{4},{5},
都满足,生成2-项集:

       {1,2},{1,3},{1,4},{1,5}


  {2,3},{2,4},{2,5}


  {3,4},{3,5}


  {4,5}

只有{1,2},{1,3},{1,4},{2,3},{2,4},{2,5}的支持度满足要求,所以得到的2-项集为:

{1,2},{1,3},{1,4},{2,3},{2,4},{2,5}。
继续生成3-项集的时候就应该用上面的这个过滤掉支持度不足的项集的2-项集进行生成:
{1,2,3},{1,2,4},{1,3,4}(但是因为{3,4}不在上述中,所以可以过滤掉),{2,3,4}(过滤),{2,3,5}(同样过滤),再把不满足支持度的{1,2,4}…最后得到的应该是:
{1,2,3},到此算法就结束了。

相对来讲,还是比较好理解的。

FP-tree算法

这一部分是转载:
上面的算法,每次生成一次频繁项集,都需要重新扫描一遍数据库,所以在时间和空间上面的复杂度都是十分可观的,而下面将要介绍的FP-Tree算法,只需要扫描两遍数据库的时候就可以办到上述算法的功能。

还是举例子来讲这个算法吧:
事务集如下:
牛奶,鸡蛋,面包,薯片

鸡蛋,爆米花,薯片,啤酒

鸡蛋,面包,薯片

牛奶,鸡蛋,面包,爆米花,薯片,啤酒

牛奶,面包,啤酒

鸡蛋,面包,啤酒

牛奶,面包,薯片

牛奶,鸡蛋,面包,黄油,薯片

牛奶,鸡蛋,黄油,薯片
仍旧假设最小支持度,minsupport=3。
FP算法 第一步:扫描事务数据库,每项商品按频数递减排序,并删除频数小于最小支持度的商品。

第一次扫描完毕得到的1-项频繁集(已经完成过滤的):

{薯片}:7    {鸡蛋}:7        {面包}:7       {牛奶}:6      {啤酒}:4 ,记作F1 ,F代表Frequency Set


第二步:对于每一条购买记录,按照F1中的顺序重新排序。(第二次也是最后一次扫描数据库)



薯片,鸡蛋,面包,牛奶

薯片,鸡蛋,啤酒

薯片,鸡蛋,面包

薯片,鸡蛋,面包,牛奶,啤酒

面包,牛奶,啤酒

鸡蛋,面包,啤酒

薯片,面包,牛奶

薯片,鸡蛋,面包,牛奶

薯片,鸡蛋,牛奶

第三步:构造FP-Tree
方法如下:
首先构造一个表头项:
薯片:7
鸡蛋:7
面包:7
牛奶:6
啤酒:4
然后构造FP-tree(要开始盗图了→_→!):对每一个事务,按照下面的方式插入节点进行构造(于此同时还需要计数),比如第一个事务:
然后是第二个事务:

同理:

最后构造得到的是:

上面的虚线表示的是指针的链表,表头项的每一项都指向了自己出现的每个每个节点连成一条线(比如表头项薯片指向的就是所有薯片节点,连成一条线)。

第三步:调用算法:



3、 调用FP-growth(Tree,null)开始进行挖掘。伪代码如下,其中Tree为树,a是后缀。初始为初始FP-tree,后缀为空:

procedure FP_growth(Treea)

if Tree 是单条路径then{

         for 路径P中结点的每个组合(记作b

         产生模式b U a,其支持度support = 中结点的最小支持度;

} else {

         for each i 在Tree的表头项(head)里面的{

                  产生一个模式b = i U a,其支持度support .support

                  构造b的条件模式基,然后构造b的条件FP-树Treeb;

                  if Treeb 不为空 then

                            调用 FP_growth (Treeb, b);

           }

}


构造条件模式基意思是:包含FP-Tree中与后缀模式一起出现的前缀路径的集合。也就是同一个频繁项在PF树中的所有节点的祖先路径的集合。

然后把这个集合,再作为事务数据库进行一个构造FP-Tree的操作就得到了条件FP-Tree(只是这个时候传入进来的后缀不为NULL了)。

http://blog.csdn.net/sealyao/article/details/6460578/

http://blog.csdn.net/huagong_adu/article/details/17739247

这两篇博客我觉得讲的比较好,不太理解的地方还可以看下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值