一.简介

  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. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  2. geoserver发布mysql表数据

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...

  3. 3.App Inventor 2项目导入与导出

    首先熟悉导入.导出项目是为了养成良好的备份习惯. 一.登陆App Inventor 2编程界面都大同小异,在项目菜单下面有导入项目和导出项目菜单. 二.打开导入项目界面,选择要导入的aia文件. 三. ...

  4. 配置Asp.Net Web项目NLog配置文件的位置

    在使用NLog在asp.net项目中发现,如果想单独配其配置文件的位置时没有像Log4Net的特性配置方案,可以使其提供的 XmlLoggingConfiguration类来初始化: 见:https: ...

  5. Linux(CentOS 7)安装测试svn服务

    1.yum install subversion,通过yum安装svn服务 2.svnserve --version,查看是否安装成功 3.mkdir -p /home.svn,创建svn仓库目录 4 ...

  6. ubuntu安装mysql没有让我设置密码

    终端输入: sudo cat /etc/mysql/debian.cnf显示内容:# Automatically generated for Debian scripts. DO NOT TOUCH! ...

  7. Lnmp一键脚本

    #!/bin/bash #================================================================ # Copyright (C) 2018 A ...

  8. Windows10家庭版运行应用提示”管理员已阻止你运行此应用...“的解决办法

    win10版本家庭中文版: 运行应用程序报错: 解决办法(亲试): 1.进入”控制面板“--”用户账户“--”用户账户“,选择”更改用户账户控制设置“,选择最后一项,点击”确定“按钮,如下图: 2.按 ...

  9. Oracle AWRDD报告生成和性能分析

    我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...

  10. 【重学计算机】机组D4章:存储系统

    1. 存储系统层次结构 主存速度缓慢的原因:主存增速与CPU不同步,执行指令期间多次访问主存 主存容量不足的原因: 存在制约主存容量的技术因素:如由CPU.主板等相关技术指标规定了主存容量 应用对主存 ...