关联规则算法的思想就是找频繁项集,通过频繁项集找强关联。
介绍下基本概念:
对于A->B
1、置信度:P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ⇒ 面包
2、支持度:P(A ∩ B),既有A又有B的概率
假如支持度:3%,置信度:40%
支持度3%:意味着3%顾客同时购买牛奶和面包
置信度40%:意味着购买牛奶的顾客40%也购买面包
3、如果事件A中包含k个元素,那么称这个事件A为k项集事件A满足最小支持度阈值的事件称为频繁k项集。
4、同时满足最小支持度阈值和最小置信度阈值的规则称为强规则

apriori算法的思想

(得出的的强规则要满足给定的最小支持度和最小置信度)
apriori算法的思想是通过k-1项集来推k项集。首先,找出频繁“1项集”的集合,该集合记作L1。L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描(这也是它最大的缺点)。
核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK(频繁项集)中删除。
下面一个比较经典的例子来说明apriori算法的执行步骤:

上面只计算了频繁项集的支持度,没有计算它的置信度。

基本概念

1. 项与项集
这是一个集合的概念,在一篮子商品中的一件消费品即一项(item),则若干项的集合为项集,如{啤酒,尿布}构成一个二元项集。
2、关联规则
关联规则用亍表示数据内隐含的关联性,例如表示购买了尿布的消费者往往也会购买啤酒。关联性强度如何,由3 个概念,即支持度、置信度、提升度来控制和评价。
3、支持度(support)
支持度是指在所有项集中{X, Y}出现的可能性,即项集中同时含有X 和Y 的概率:
设定最小阈值为5%,由亍{尿布,啤酒}的支持度为800/10000=8%,满足最小阈值要求,成为频繁项集,保留规则;而{尿布,面包}的支持度为100/10000=1%,则被剔除。
4、置信度(confidence)
置信度表示在先决条件X 发生的条件下,关联结果Y 发生的概率:这是生成强关联规则的第二个门槛,衡量了所考察的关联规则在“质”上的可靠性。相似地,我们需要对置信度设定最小阈值(mincon)来实现进一步筛选。当设定置信度的最小阈值为70%时,例如{尿布,啤酒}中,购买尿布时会购买啤酒的置信度为800/1000=80%,保留规则;而购买啤酒时会购买尿布的置信度为800/2000=40%,则被剔除。
5. 提升度(lift)
提升度表示在含有X 的条件下同时含有Y 的可能性与没有X 这个条件下项集中含有Y 的可能性之比:公式为置信度(artichok=>cracker)/支持度(cracker)。该指标与置信度同样衡量规则的可靠性,可以看作是置信度的一种互补指标。

FPGrowth 算法

1)扫描事务数据库D 一次。收集频繁项的集合F 和它们的支持度。对F 按支持度降序排序,结果为频繁项
表L。
2)创建FP 树的根节点,以“null”标记它。对亍D 中的每个事务Trans,执行:选择 Trans
中的频繁项,并按L 中的次序排序。设排序后的频繁项表为[p | P],其中,p 是第一个元素,而P 是剩余元素的表。调用insert_tree([p | P], T)。该过程执行情况如下。如果T 有子节点N 使得N.item-name = p.item-name,则N 的计数增加1;否则创建一个新节点N 将其计数设置为1,链接到它的父节点T,并且通过节点的链结构将其链接到具有相同item-name 的节点中。如果P非空,则递归地调用insert_tree(P, N)。

分析实例







源码分析


def run[Item: ClassTag](data: RDD[Array[Item]]): FPGrowthModel[Item] = {if (data.getStorageLevel == StorageLevel.NONE) {logWarning("Input data is not cached.")}val count = data.count()val minCount = math.ceil(minSupport * count).toLongval numParts = if (numPartitions > 0) numPartitions else data.partitions.lengthval partitioner = new HashPartitioner(numParts)val freqItems = genFreqItems(data, minCount, partitioner)val freqItemsets = genFreqItemsets(data, minCount, freqItems, partitioner)new FPGrowthModel(freqItemsets)}
 private def genFreqItems[Item: ClassTag](data: RDD[Array[Item]],minCount: Long,partitioner: Partitioner): Array[Item] = {data.flatMap { t =>val uniq = t.toSetif (t.length != uniq.size) {throw new SparkException(s"Items in a transaction must be unique but got ${t.toSeq}.")}t}.map(v => (v, 1L)).reduceByKey(partitioner, _ + _).filter(_._2 >= minCount).collect().sortBy(-_._2).map(_._1)}
private def genFreqItemsets[Item: ClassTag](data: RDD[Array[Item]],minCount: Long,freqItems: Array[Item],partitioner: Partitioner): RDD[FreqItemset[Item]] = {val itemToRank = freqItems.zipWithIndex.toMapdata.flatMap { transaction =>genCondTransactions(transaction, itemToRank, partitioner)}.aggregateByKey(new FPTree[Int], partitioner.numPartitions)((tree, transaction) => tree.add(transaction, 1L),(tree1, tree2) => tree1.merge(tree2)).flatMap { case (part, tree) =>tree.extract(minCount, x => partitioner.getPartition(x) == part)}.map { case (ranks, count) =>new FreqItemset(ranks.map(i => freqItems(i)).toArray, count)}}
def generateAssociationRules(confidence: Double): RDD[AssociationRules.Rule[Item]] = {val associationRules = new AssociationRules(confidence)associationRules.run(freqItemsets)}
 def run[Item: ClassTag](freqItemsets: RDD[FreqItemset[Item]]): RDD[Rule[Item]] = {// For candidate rule X => Y, generate (X, (Y, freq(X union Y)))val candidates = freqItemsets.flatMap { itemset =>val items = itemset.itemsitems.flatMap { item =>items.partition(_ == item) match {case (consequent, antecedent) if !antecedent.isEmpty =>Some((antecedent.toSeq, (consequent.toSeq, itemset.freq)))case _ => None}}}// Join to get (X, ((Y, freq(X union Y)), freq(X))), generate rules, and filter by confidencecandidates.join(freqItemsets.map(x => (x.items.toSeq, x.freq))).map { case (antecendent, ((consequent, freqUnion), freqAntecedent)) =>new Rule(antecendent.toArray, consequent.toArray, freqUnion, freqAntecedent)}.filter(_.confidence >= minConfidence)}

实例

FP-growth:

import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.rdd.RDDval data = sc.textFile("data/mllib/sample_fpgrowth.txt")val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' '))val fpg = new FPGrowth().setMinSupport(0.2).setNumPartitions(10)
val model = fpg.run(transactions)model.freqItemsets.collect().foreach { itemset =>println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}val minConfidence = 0.8
model.generateAssociationRules(minConfidence).collect().foreach { rule =>println(rule.antecedent.mkString("[", ",", "]")+ " => " + rule.consequent .mkString("[", ",", "]")+ ", " + rule.confidence)
}

Association Rules:

import org.apache.spark.mllib.fpm.AssociationRules
import org.apache.spark.mllib.fpm.FPGrowth.FreqItemsetval freqItemsets = sc.parallelize(Seq(new FreqItemset(Array("a"), 15L),new FreqItemset(Array("b"), 35L),new FreqItemset(Array("a", "b"), 12L)
))val ar = new AssociationRules().setMinConfidence(0.8)
val results = ar.run(freqItemsets)results.collect().foreach { rule =>println("[" + rule.antecedent.mkString(",")+ "=>"+ rule.consequent.mkString(",") + "]," + rule.confidence)
}

sparkmllib关联规则算法(FPGrowth,Apriori)相关推荐

  1. 关联规则算法学习—Apriori

    关联规则算法学习-Apriori 一.实验项目:关联规则算法学习 项目性质:设计型 二.实验目的: 理解并掌握关联规则经典算法Apriori算法,理解算法的原理,能够实现算法,并对给定的数据集进行关联 ...

  2. 关联规则java apriori_关联规则算法(The Apriori algorithm)详解

    一.前言 在学习The Apriori algorithm算法时,参考了多篇博客和一篇论文,尽管这些都是很优秀的文章,但是并没有一篇文章详解了算法的整个流程,故整理多篇文章,并加入自己的一些注解,有了 ...

  3. 关联规则算法(Apriori算法 and FP-growth算法)

    文章目录 前言 Apriori算法 代码 FP-growth算法 代码 前言 由于学习关联规则时没有找到比较浅显易懂的博客,于是打算自己写一篇快速了解关联规则的博客 参考的博客: FP-growth算 ...

  4. 关联规则算法(The Apriori algorithm)

    一.前言         最近在看 无监督学习 的时候,发现欠缺了数据挖掘的知识,回来补充~ 关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物篮分析 (market basket ana ...

  5. 关联规则算法——FP-Growth算法

    1.关联规则的名词解释 项集:数据库中的数据项构成的非空集合 事务:一个事务包含了一个或多个项集 支持度:包含项集x的事务数量与全部事务数量的百分比 置信度:同时包含数据项x和数据项y的事务数量与事务 ...

  6. 利用python实现Apriori关联规则算法

    关联规则 大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布:据说是沃尔玛超市在分析顾客的购买记录时,发现许多客户购买啤酒的同时也会购买婴儿尿布,于是超市调整了啤酒和尿布的货架摆放,让这两个品类摆放 ...

  7. 使用Apriori关联规则算法实现购物篮分析

    Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集,而且算法已经被广泛的应用到商业,网络安全等各个领域. 购物篮分析是通过发视频顾 ...

  8. 关联规则挖掘(Apriori算法和FP-Growth算法)

    一.关联规则概述 1.关联规则分析用于在一个数据集中找出各种数据项之间的关联关系,广泛用于购物篮数据.个性化推荐.预警.时尚穿搭.生物信息学.医疗诊断.网页挖掘和科学数据分析中 2.关联规则分析又称购 ...

  9. python实现关联算法_关联规则算法Apriori学习及Python实现

    关联规则算法Apriori以及FP-growth学习 最近选择了关联规则算法进行学习,目标是先学习Apriori算法,再转FP-growth算法,因为Spark-mllib库支持的关联算法是FP,随笔 ...

最新文章

  1. 阿里开源项目汇总(二十)
  2. visual studio输入法打不了中文_我为什么不用Mac自带输入法
  3. 汇编语言OFFSET运算符:返回数据标号的偏移量
  4. Java基础day14
  5. Java servlet一个最简单的例子
  6. SVN 出错信息汇总/错误信息一览表
  7. 如何查询日志文件中的所有ip,正则表达式
  8. Windows 3.1 往事:历史上第一个真正占据主导地位的操作系统
  9. Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系
  10. 分析QQ和QQ游戏的价值特性极其快速发展的原因,并对其盈利模式进行探讨
  11. 第三章作业题3--队列
  12. 华为服务器故障灯不开机_华为手机开不了机指示灯亮怎么办?
  13. 【电子水尺】高精度测量、免布线、远程传输数据
  14. FEDformer: Frequency Enhanced Decomposed Transformer for Long-termSeries Forecasting(ICML2022)
  15. 20.04Ubuntu安装桌面系统详细教程
  16. [Splay伸展树]splay树入门级教程
  17. 最新猎豹网校C语言数据结构与算法项目实战(共32集)
  18. java毕业设计大学生心理健康系统Mybatis+系统+数据库+调试部署
  19. Python基础之file open r+ w+ a+
  20. Markdown Preview Enhanced 打印PDF。解决打印成PDF/HTML时,CSS样式无法显示的问题

热门文章

  1. 移动云计算gfs的了解_移动云计算
  2. 地下城与勇士服务器都在维护怎么办,DNF:停机维护却被洗号,刷了2个月的100ss全没了,都没异常提示...
  3. windows11时间显示秒
  4. C9高校【哈工大威海校区】拟建未来技术学院
  5. 电子行业MES管理系统的设计思路
  6. idea上如何跑java程序_java – 如何在Intellij IDEA中运行Applet?
  7. spherical cnns
  8. java微信小程序开发难点,赶紧收藏!
  9. 河南省3加2计算机学校,河南省正规的三加二学校是哪所
  10. 人为什么会在35岁以后越来越焦虑?