目录

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、事务:每一条交易称为一个事务,例如示例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、强关联规则:大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则。

关联分析的最终目标就是要找出强关联规则。

2 Apriori算法

2.1 基本概念

电子商务中常用的一种数据挖掘方法就是从用户交易数据集中寻找商品之间的关联规则。关联规则中常用的一种算法是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.2 例子

假设给定如下电子商务网站的用户交易数据集,其中,定义最小支持度为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条强关联规则。

2.3 缺点

(1) 在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;

(2) 每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法。

2.4 改进

1)基于划分的方法。

        该算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频繁项集,然后把产生的频繁项集合并,用来生成所有可能的频繁项集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频繁项集至少在某一个分块中是频繁项集保证的。
       上面所讨论的算法是可以高度并行的。可以把每一分块分别分配给某一个处理器生成频繁项集。产生频繁项集的每一个循环结束后.处理器之间进行通信来产生全局的候选是一项集。通常这里的通信过程是算法执行时间的主要瓶颈。而另一方面,每个独立的处理器生成频繁项集的时间也是一个瓶颈。其他的方法还有在多处理器之间共享一个杂凑树来产生频繁项集,更多关于生成频繁项集的并行化方法可以在其中找到。

2)基于Hash的方法。

        Park等人提出了一个高效地产生频繁项集的基于杂凑(Hash)的算法。通过实验可以发现,寻找频繁项集的主要计算是在生成频繁2—项集Lk上,Park等就是利用这个性质引入杂凑技术来改进产生频繁2—项集的方法。

3)基于采样的方法。

基于前一遍扫描得到的信息,对它详细地做组合分析,可以得到一个改进的算法,其基本思想是:先使用从数据库中抽取出来的采样得到一些在整个数据库中可能成立的规则,然后对数据库的剩余部分验证这个结果。这个算法相当简单并显著地减少了FO代价,但是一个很大的缺点就是产生的结果不精确,即存在所谓的数据扭曲(Dataskew)。分布在同一页面上的数据时常是高度相关的,不能表示整个数据库中模式的分布,由此而导致的是采样5%的交易数据所花费的代价同扫描一遍数据库相近。

4)减少交易个数。

        减少用于未来扫描事务集的大小,基本原理就是当一个事务不包含长度为k的大项集时,则必然不包含长度为k+1的大项集。从而可以将这些事务删除,在下一遍扫描中就可以减少要进行扫描的事务集的个数。这就是AprioriTid的基本思想。

3 FP-growth算法

3.1 基本概念

由于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树的大小实际上与原数据的大小一样。

3.2 例子

3.2.1 构建FP-tree

FP-growth算法通过构建FP-tree来压缩事务数据库中的信息,从而更加有效地产生频繁项集。FP-tree其实是一棵前缀树,按支持度降序排列支持度越高的频繁项离根节点越近,从而使得更多的频繁项可以共享前缀。

根据2.2的例子,构建FP-tree。

得到新的顺序:

FP-tree的根节点为null,不表示任何项。接下来,对事务型数据库进行第二次扫描,从而开始构建FP-tree:

第一条记录<I2,I1,I5>对应于FP-tree中的第一条分支<(I2:1),(I1:1),(I5:1)>:

由于第二条记录<I2,I4>与第一条记录有相同的前缀<I2>,因此<I2>的支持度加一,同时在(I2:2)节点下添加节点(I4:1)。所以,FP-tree中的第二条分支是<(I2:2),(I4:1)>:

第三条记录<I2,I3>与前两条记录相比,只有一个共同前缀<I2>,因此,只需要在(I2:3)下添加节点<I3:1>:

第四条记录<I2,I1,I4>与之前所有记录共同前缀<I2,I1>,因此在<I2,I1>节点下添加节点<I4>:

类似地,将第五条记录<I1,I3>作为FP-tree的一个分支,更新相关节点的支持度:

第五条记录

以此类推的到最后的树:

3.2.2 从FP-tree中挖掘频繁模式(Frequent Patterns)

我们从头表的底部开始挖掘FP-tree中的频繁模式。在FP-tree中以I5结尾的节点链共有两条,分别是<(I2:7),(I1:4),(I3:2),(I5:1)><(I2:7),(I1:4),(I5:1)>

其中,第一条节点链表表示客户购买的物品清单<I2,I1,I3,I5>在数据库中共出现了1次。需要注意到是,尽管<I2,I1>在第一条节点链中出现了4次,单个物品<I2>出现了7次,但是它们与I5一起出现只有1次,所以在条件FP-tree中将<(I2:7),(I1:4),(I3:2),(I5:1)>记为<(I2:1),(I1:1),(I3:1),(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

机器学习算法(八):关联分析相关推荐

  1. Python数据挖掘与机器学习,快速掌握聚类算法和关联分析

    摘要:前文数据挖掘与机器学习技术入门实战与大家分享了分类算法,在本文中将为大家介绍聚类算法和关联分析问题.分类算法与聚类到底有何区别?聚类方法应在怎样的场景下使用?如何使用关联分析算法解决个性化推荐问 ...

  2. 【机器学习】Apriori 算法进行关联分析和FP-growth算法

    [机器学习]Apriori 算法进行关联分析和FP-growth算法 文章目录 1 关联分析 2 FP-growth算法理解和实现 3 FP增长算法的频繁项集产生 4 FP-Growth关联分析算法在 ...

  3. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

  4. 《机器学习实战》chapter 11 使用apriori算法进行关联分析

    使用apriori算法进行关联分析 apriori原理:1.一个项集是非频繁的,那么它的所有超集也是非频繁的 2.一个项集是频繁的,那么它的所有子集也是频繁的 一.支持度(support)-使用apr ...

  5. 【大数据实战项目八】使用机器学习算法进行预测分析并进行网上部署

    使用机器学习算法进行预测分析并进行网上部署 9 使用机器学习算法进行预测分析 9.1 数据探索式分析 9.1.1 环境配置与数据读入 9.1.2 探究延误航班有多少数据量 9.1.3 探究出发延期到达 ...

  6. 使用Apriori算法进行关联分析

    目录 1.名词概念 2.频繁项集发现 3.Apriori算法关联分析 4.代码实现 5.参考文章   通过组合交叉变量制定风控策略时有两种方法:一是通过决策树分箱进行变量交叉,可以见文章一个函数实现自 ...

  7. 使用Apriori算法和FP-growth算法进行关联分析

    目录 1. 关联分析 2. Apriori原理 3. 使用Apriori算法来发现频繁集 4. 使用FP-growth算法来高效发现频繁项集 5. 示例:从新闻网站点击流中挖掘新闻报道 扩展阅读 系列 ...

  8. 机器学习算法:关联规则分析

    公众号:尤而小屋 作者:Peter 编辑:Peter 大家好,我是Peter~ 今天给大家分享一个经典的机器学习算法:关联规则分析,从理论到代码到实战,全部拉满. 本文主要内容: 文章过长,建议收藏 ...

  9. Apriori算法进行关联分析实战

    使用Apriori算法进行关联分析(层次聚类) 一.基础知识 1.关联分析定义及存在的问题 定义:从大规模的数据集中寻找物品间的隐含关系,被称为关联分析或关联规则学习. 关联分析存在的主要问题:主要问 ...

  10. ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略

    ML/DL之预测分析类:利用机器学习算法进行预测分析的简介.分析.代码实现之详细攻略 目录 机器学习算法进行预测的简介 机器学习算法进行预测的分析 机器学习算法进行预测的代码实现 机器学习算法进行预测 ...

最新文章

  1. java验证注册页面_Java使用正则表达式对注册页面进行验证功能实现
  2. redis cli 删除key 模糊_Redis集群及雪崩
  3. ShopEx 属性筛选增加 不限 条件
  4. telnet或SQLplus下命令输入错误如何删掉重新输入
  5. 【ArcGIS遇上Python】窗体版Python批量处理地理数据--栅格裁剪
  6. 计算机中的字,双字以及存储
  7. python traceback most recent_pyspider启动错误: Traceback (most recent call last):
  8. 【前端干货】CSS 的空格处理
  9. 在Extjs中对日期的处理,以及在后端数据在SQL语句的判断处理
  10. centos 更新源_centos6 更换yum源
  11. java web 课程设计_javaweb期末课程设计
  12. 马士兵Java自学之路
  13. Python3中使用flask_sqlalchemy的问题
  14. 漏洞利用(CVE-2017-5638)
  15. RedHat7.8安装Microsoft Edge浏览器
  16. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)
  17. mysql association_在mybatis的xml中添加association不生效
  18. 什么是网站备案?如何查询网站是否备案?
  19. JavaScript百炼成仙 1.15 天秀
  20. Odoo + 微信小程序快速搭建商城

热门文章

  1. Java数据结构与算法学习 目前30170字
  2. 青创教育php_青创独家|2019年度教育类创业公司传播影响力排行TOP20
  3. Hibernate三种数据持久状态:临时态、游离态、持久化状态
  4. Openharmony的L0与L2系统环境搭建编译烧录
  5. python怎么安装pandas-datareader_使用Python的pandas-datareader包下载雅虎财经股价数据...
  6. CFileException
  7. Cisco Packet Tracer官网安装配置
  8. OPENSTACK LANDSCAPE云原生景观 | OpenStack地图
  9. bootstraptable 列隐藏_bootstraptable 隐藏列的方法
  10. decimal与BigDecimal用法