fpgrowth算法实战 mlib_sparkmllib关联规则算法(FPGrowth,Apriori)
关联规则算法的思想就是找频繁项集,通过频繁项集找强关联。
介绍下基本概念:
对于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)。
1
2
3
4
分析实例
源码分析
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).toLong
val numParts = if (numPartitions > 0) numPartitions else data.partitions.length
val 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.toSet
if (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.toMap
data.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.items
items.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 confidence
candidates.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.RDD
val 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.FreqItemset
val 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)
}
fpgrowth算法实战 mlib_sparkmllib关联规则算法(FPGrowth,Apriori)相关推荐
- python实现关联算法_python实现关联规则算法Apriori代码示例
本篇文章小编给大家分享一下python实现关联规则算法Apriori代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 首先导入包含apriori ...
- 关联规则算法c语言样例及分析_推荐系统总结系列-关联规则算法(四)
基于关联规则的推荐有三种方法:Apriori关联规则算法FP Tree关联规则算法:PrefixSpan关联规则算法: 关联规则挖掘推荐算法: 关联规则挖掘是一种在大规模交易中识别类似规则关系模式的通 ...
- 《自动驾驶感知算法实战专栏(源代码)》专栏概述
导言 自动驾驶太火?高薪?跃跃欲试,又仅存于想的阶段.动起来,只是看理论,却总也学不会?看不懂,又总没有进度?如果你也有这类问题,那你来看看这个专栏.以实际项目为导向,亲自动手实践,从简单的图像分类. ...
- TopN算法实战 排序算法RangePartitioner解密
1.基础TopN算法实战 2.分组TopN算法实战 3.排序算法RangePartitioner内幕解密 知识点: *只要是改变每一行列的数据,一般都是用Map操作 *RangePartitioner ...
- apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- 关联规则挖掘(Apriori算法和FP-Growth算法)
一.关联规则概述 1.关联规则分析用于在一个数据集中找出各种数据项之间的关联关系,广泛用于购物篮数据.个性化推荐.预警.时尚穿搭.生物信息学.医疗诊断.网页挖掘和科学数据分析中 2.关联规则分析又称购 ...
- sparkmllib关联规则算法(FPGrowth,Apriori)
关联规则算法的思想就是找频繁项集,通过频繁项集找强关联. 介绍下基本概念: 对于A->B 1.置信度:P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ...
- python apriori算法 sklearn_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- 【机器学习】Apriori 算法进行关联分析和FP-growth算法
[机器学习]Apriori 算法进行关联分析和FP-growth算法 文章目录 1 关联分析 2 FP-growth算法理解和实现 3 FP增长算法的频繁项集产生 4 FP-Growth关联分析算法在 ...
- fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法
简介 FP-Growth算法是韩嘉炜等人在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息. 在算法中使用了一种称为 ...
最新文章
- Android学习笔记之-Android性能测试之DDMS的使用
- 全球及中国垃圾发电行业运营管理及十四五投资价值评估报告2021-2027年
- pwn(ctf)中常见的系统调用
- apk ionic 破损_cordova – ionic build android不生成任何.apk文件或错误
- Angular里的style property binding的一个例子
- 使用正则表达式,取得点击次数,函数抽离
- javascript traverse object attributes 遍历对象属性
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
- 计算1至n中数字X出现的次数
- 端口转发、映射、代理
- LOFTER轻博模板设计
- (保姆式教程:从下数据到画图)python如何利用EOF分析SSTA海温异常现象并画图
- 【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
- 调试铁通与联通专线遇到的问题
- JMeter做http接口功能测试
- 技术文档的版本说明格式
- SO逆向入门实战教程四:mfw
- 开始使用WebRTC
- sql 查询之排除某种特定的数据
- TPLINK免驱版网卡插上后无法识别到CD驱动器怎么办?