关联规则算法的思想就是找频繁项集,通过频繁项集找强关联。

介绍下基本概念:

对于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)相关推荐

  1. python实现关联算法_python实现关联规则算法Apriori代码示例

    本篇文章小编给大家分享一下python实现关联规则算法Apriori代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 首先导入包含apriori ...

  2. 关联规则算法c语言样例及分析_推荐系统总结系列-关联规则算法(四)

    基于关联规则的推荐有三种方法:Apriori关联规则算法FP Tree关联规则算法:PrefixSpan关联规则算法: 关联规则挖掘推荐算法: 关联规则挖掘是一种在大规模交易中识别类似规则关系模式的通 ...

  3. 《自动驾驶感知算法实战专栏(源代码)》专栏概述

    导言 自动驾驶太火?高薪?跃跃欲试,又仅存于想的阶段.动起来,只是看理论,却总也学不会?看不懂,又总没有进度?如果你也有这类问题,那你来看看这个专栏.以实际项目为导向,亲自动手实践,从简单的图像分类. ...

  4. TopN算法实战 排序算法RangePartitioner解密

    1.基础TopN算法实战 2.分组TopN算法实战 3.排序算法RangePartitioner内幕解密 知识点: *只要是改变每一行列的数据,一般都是用Map操作 *RangePartitioner ...

  5. apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法

    是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...

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

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

  7. sparkmllib关联规则算法(FPGrowth,Apriori)

    关联规则算法的思想就是找频繁项集,通过频繁项集找强关联. 介绍下基本概念: 对于A->B 1.置信度:P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ...

  8. python apriori算法 sklearn_sklearn(九)apriori 关联规则算法,以及FP-growth 算法

    是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...

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

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

  10. fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法

    简介 FP-Growth算法是韩嘉炜等人在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息. 在算法中使用了一种称为 ...

最新文章

  1. Android学习笔记之-Android性能测试之DDMS的使用
  2. 全球及中国垃圾发电行业运营管理及十四五投资价值评估报告2021-2027年
  3. pwn(ctf)中常见的系统调用
  4. apk ionic 破损_cordova – ionic build android不生成任何.apk文件或错误
  5. Angular里的style property binding的一个例子
  6. 使用正则表达式,取得点击次数,函数抽离
  7. javascript traverse object attributes 遍历对象属性
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
  9. 计算1至n中数字X出现的次数
  10. 端口转发、映射、代理
  11. LOFTER轻博模板设计
  12. (保姆式教程:从下数据到画图)python如何利用EOF分析SSTA海温异常现象并画图
  13. 【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
  14. 调试铁通与联通专线遇到的问题
  15. JMeter做http接口功能测试
  16. 技术文档的版本说明格式
  17. SO逆向入门实战教程四:mfw
  18. 开始使用WebRTC
  19. sql 查询之排除某种特定的数据
  20. TPLINK免驱版网卡插上后无法识别到CD驱动器怎么办?

热门文章

  1. python wxpython常用控件实例
  2. 玩一下就停不下来的h5休闲小游戏
  3. Unity调用打印机打印图片
  4. VassistX番茄助手使用技巧
  5. php教程 网易,网易开源镜像使用帮助
  6. python电子书合集
  7. vmp给驱动加壳的注意事项
  8. 高等数学张宇18讲 第十四讲 数学一、数学二专题内容
  9. 黑苹果怎么进recovery_黑苹果怎么自定义Clover GUI启动选项 黑苹果修复Clover GUI启动选项教程...
  10. JAVA基于《美国当代英语语料库COCA词频20000》PDF提取的纯单词文件