一.简介

  FPGrowth算法是关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息。在算法中使用了一种称为频繁模式树(Frequent Pattern Tree)的数据结构。FP-tree是一种特殊的前缀树,由频繁项头表和项前缀树构成。

  相关术语:

    1.项与项集

      这是一个集合的概念,以购物车为例,一件商品就是一项【item】,若干项的集合为项集,如{特步鞋,安踏运动服}为一个二元项集。

    2.关联规则

      关联规则用于表示数据内隐含的关联性,例如买了新鞋的客户也往往会买袜子。

    3.支持度

      支持度是指在所有项集中{x,y}出现的可能性,即项集中同时出现含有x和y的概率。该指标作为建立强关联规则的第一个门槛,衡量了所考察关联规则在“量”上的多少。

    4.置信度

      表示在先决条件x发生的情况下,关联结果y发生的概率。这是生成强关联规则的第二个门槛,衡量了所考察的关联规则在“质”上的可靠性。

    5.提升度

      表示在含有x的条件下同时含有y的可能性与没有x的条件下项集含有y的可能性之比。

二.测试数据 

r z h k p
z y x w v u t s
s x o n r
x z y m t s q e
z
x z y r q t p

三.代码实现 

package big.data.analyse.mllib

import org.apache.log4j.{Level, Logger}
import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.{SparkContext, SparkConf} /**
* 关联规则
* Created by zhen on 2019/4/11.
*/
object FPG {
Logger.getLogger("org").setLevel(Level.WARN)
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("fpg")
conf.setMaster("local[2]") val sc = new SparkContext(conf) /**
* 加载数据
*/
val data = sc.textFile("data/mllib/sample_fpgrowth.txt")
val data_spl = data.map(row => row.split(" ")).cache() /**
* 创建模型
*/
val minSupport = 0.2
val numPartition = 10
val model = new FPGrowth()
.setMinSupport(minSupport)
.setNumPartitions(numPartition)
.run(data_spl) /**
* 打印结果
*/
println("Number of frequent itemsets : " + model.freqItemsets.count())
model.freqItemsets.collect.foreach{itemset =>
println(itemset.items.mkString("[", ",", "]") + " ==> " + itemset.freq)
}
}
}

四.结果

   .......

五.精简测试数据

  y z

  z y x

  x

  x z y

  z

  x z

六.二次开发代码实现

package big.data.analyse.mllib

import org.apache.log4j.{Level, Logger}
import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkContext, SparkConf} /**
* 关联规则
* Created by zhen on 2019/4/11.
*/
object FPG {
Logger.getLogger("org").setLevel(Level.WARN)
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("fpg")
conf.setMaster("local[2]") val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc) /**
* 加载数据
*/
val data = sc.textFile("data/mllib/sample_fpgrowth.txt")
val data_spl = data.map(row => row.split(" ")).cache() /**
* 创建模型
*/
val minSupport = 0.2
val numPartition = 10
val model = new FPGrowth()
.setMinSupport(minSupport)
.setNumPartitions(numPartition)
.run(data_spl) /**
* 打印结果
*/
//println("Number of frequent itemsets : " + model.freqItemsets.count())
model.freqItemsets.collect.foreach{itemset =>
println(itemset.items.mkString("[", "-", "]") + " ==> " + itemset.freq)
} /**
* 把结果数据转换为Map
*/
val map = model.freqItemsets
.map{row =>
var map : Map[String,Double] = Map()
map += (row.items.mkString("-") -> row.freq.toDouble)
map
}.collect().flatten.toMap val list = map.keysIterator.toList /**
* 拆分比较,计算概率
*/
var mid_result : Map[String, Double] = Map() for(i <- 0 until list.length){
for(j <- 0 until list.length){
if(i != j){
if(list(i).contains(list(j))){ // xy -> xyz
var key = ""
if(list(i).indexOf(list(j)) == 0){ // 子串位于母串开头
key = list(j) + "_" + list(i).replace(list(j) + "-", "")
}else{// 子串位于母串的中间或者末尾
key = list(j) + "_" + list(i).replace("-" + list(j), "")
}
val left = map(list(j))
val right = map(list(i))
val value = right / left
mid_result += (key -> value)
}else{// TODO 分开包含的也要加进行,比较顺序不一定一致,例如:xy -> xzy
val left_key = list(i).split("-")
val right_key = list(j).split("-")
var isno = true
for(x <- 0 until right_key.length){
if(!left_key.contains(right_key(x))){
isno = false
}
}
if(isno){ // 包含
var mid_key = "" // 拼接key
for(y <- 0 until left_key.length){
if(!right_key.contains(left_key(y))){
mid_key += left_key(y) + "-"
}
}
if(mid_key != ""){ // 清除末尾多余的-
mid_key = mid_key.substring(0, mid_key.length-1)
}
val key = list(j) + "_" + mid_key
val left = map(list(j))
val right = map(list(i))
val value = right / left
mid_result += (key -> value)
}
}
}
}
} /**
*平衡标签先后顺序对概率的影响
*/
var result : List[String] = List()
val keys = mid_result.keysIterator.toList
for(i <- 0 until keys.length){
println(keys(i) +":"+ mid_result(keys(i)))
}
for(i <- 0 until keys.length){
for(j <- 0 until keys.length){
if(i != j){
val left = keys(i).split("_")
val right = keys(j).split("_")
if(left(0) == right(1) && left(1) == right(0)){
val value = ((mid_result(keys(i)) + mid_result(keys(j)))/2).formatted("%.2f") // 保留两位小数
if(left(0) < left(1)){
result = result.:+(left(0) + "_" + left(1) + "_" + value)
}else{
result = result.:+(left(1) + "_" + left(0) + "_" + value)
}
}
}
}
}
result = result.distinct // 去重
/*for(i <- 0 until result.length){
println(result(i))
}*/ /**
* 转换为rdd
*/
val result_rdd = sc.parallelize(result).map(row => {
val Array(left, right, probability) = row.split("_")
Row(left, right, probability.toDouble)
}) /**
* 定义结构
*/
val structType = new StructType(Array(
StructField("left", StringType, true),
StructField("right", StringType, true),
StructField("probability", DoubleType, true)
)) val result_df = sqlContext.createDataFrame(result_rdd, structType) import org.apache.spark.sql.functions._
result_df.orderBy(desc("probability")).show()
}
}

七.结果

  

  

  

八.备注

  集群模式出现以下异常【local模式无异常】;

    can not set final scala.collection.mutable.ListBuffer field org.apache.spark.mllib.fpm.FPTree$Summary.nodes to scala.collection.mutable.ArrayBuffer

  解决方案:

    配置:conf.set("spark.serializer", "org.apache.spark.serializer.JavaSerializer")

Spark MLlib FPGrowth关联规则算法的更多相关文章

  1. Spark MLlib KMeans 聚类算法

    一.简介 KMeans 算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇心的移动距离小于某个给定的值. ...

  2. Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  3. Spark mllib 随机森林算法的简单应用(附代码)

    此前用自己实现的随机森林算法,应用在titanic生还者预测的数据集上.事实上,有很多开源的算法包供我们使用.无论是本地的机器学习算法包sklearn 还是分布式的spark mllib,都是非常不错 ...

  4. 十二、spark MLlib的scala示例

    简介 spark MLlib官网:http://spark.apache.org/docs/latest/ml-guide.html mllib是spark core之上的算法库,包含了丰富的机器学习 ...

  5. Spark Mllib里如何生成KMeans的训练样本数据、生成线性回归的训练样本数据、生成逻辑回归的训练样本数据和其他数据生成

    不多说,直接上干货! 具体,见 Spark Mllib机器学习(算法.源码及实战详解)的第2章 Spark数据操作

  6. Spark Mllib里的向量标签概念、构成(图文详解)

    不多说,直接上干货! Labeled point: 向量标签 向量标签用于对Spark Mllib中机器学习算法的不同值做标记. 例如分类问题中,可以将不同的数据集分成若干份,以整数0.1.2,... ...

  7. 基于Spark的FPGrowth算法的运用

    一.FPGrowth算法理解 Spark.mllib 提供并行FP-growth算法,这个算法属于关联规则算法[关联规则:两不相交的非空集合A.B,如果A=>B,就说A=>B是一条关联规则 ...

  8. FP-Growth in Spark MLLib

    并行FP-Growth算法思路 上图的单线程形成的FP-Tree. 分布式算法事实上是对FP-Tree进行分割,分而治之 首先,假设我们只关心...|c这个conditional transactio ...

  9. spark mllib k-means算法实现

    package iie.udps.example.spark.mllib; import java.util.regex.Pattern; import org.apache.spark.SparkC ...

随机推荐

  1. GIS中的坐标系【Esri官方文档部分翻译】

    GCS 地理坐标系(GCS)使用椭圆体表面来定义地球上的位置.地理坐标系有三个部分: 基准面,是地球的椭圆体(椭球体)模型 本初子午线 角度单位 常见基准包括WGS84(用于GPS)和NAD83(用于 ...

  2. odoo:免费开源ERP入门与实践

    Odoo下载安装 Odoo社区版下载链接:http://nightly.odoo.com/ ,下载11.0社区版Windows安装包:http://nightly.odoo.com/11.0/nigh ...

  3. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. 安卓开发笔记(二十):利用夜神模拟器调试运行Android Studio的apk

    一.首先来到夜神模拟器的安装目录下 如下图所示: 再把这整个文件夹添加到我们的windows环境变量里.然后再把android studio 和夜神模拟器都打开,注意必须同时打开而且不能够把夜神模拟器 ...

  5. pod command

    pod 基础使用命令 创建Podfile文件 1 pod init 使用命令打开Podfile文件 1 open -a Xcode Podfile 搜索pod 库 1 pod search 库名 更新 ...

  6. python3 树莓派 + usb摄像头 做颜色识别 二维码识别

    今天又啥也没干 我完蛋了哦  就是没办法沉下心来,咋办....还是先来条NLP吧.. 七,凡事必有至少三个解决方法 对事情只有一个方法的人,必陷入困境,因为别无选择. 对事情有两个方法的人也陷入困境, ...

  7. 【jframe】Java架构师之路 - 第01篇:Get Started

    jframe是什么? jframe是一个基于MIT协议开源的java web应用程序框架,汇聚了我们团队之于java web应用程序的核心架构思想以及大量最佳实践,并且持续在实际项目中不断完善优化. ...

  8. Web地图呈现原理

    地图投影 对于接触互联网地图的同学来说,最开始接触的恐怕就是坐标转换的过程了.由于地球是个近似椭球的形状,有各种各样的椭球模型来模拟地球,最著名的也就是GPS系统使用的WGS84椭球了.但是这些椭球体 ...

  9. selenium+谷歌无头浏览器爬取网易新闻国内板块

    网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...

  10. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...