Spark MLlib FPGrowth关联规则算法
一.简介
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关联规则算法的更多相关文章
- Spark MLlib KMeans 聚类算法
一.简介 KMeans 算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇心的移动距离小于某个给定的值. ...
- Spark MLlib协同过滤算法
算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...
- Spark mllib 随机森林算法的简单应用(附代码)
此前用自己实现的随机森林算法,应用在titanic生还者预测的数据集上.事实上,有很多开源的算法包供我们使用.无论是本地的机器学习算法包sklearn 还是分布式的spark mllib,都是非常不错 ...
- 十二、spark MLlib的scala示例
简介 spark MLlib官网:http://spark.apache.org/docs/latest/ml-guide.html mllib是spark core之上的算法库,包含了丰富的机器学习 ...
- Spark Mllib里如何生成KMeans的训练样本数据、生成线性回归的训练样本数据、生成逻辑回归的训练样本数据和其他数据生成
不多说,直接上干货! 具体,见 Spark Mllib机器学习(算法.源码及实战详解)的第2章 Spark数据操作
- Spark Mllib里的向量标签概念、构成(图文详解)
不多说,直接上干货! Labeled point: 向量标签 向量标签用于对Spark Mllib中机器学习算法的不同值做标记. 例如分类问题中,可以将不同的数据集分成若干份,以整数0.1.2,... ...
- 基于Spark的FPGrowth算法的运用
一.FPGrowth算法理解 Spark.mllib 提供并行FP-growth算法,这个算法属于关联规则算法[关联规则:两不相交的非空集合A.B,如果A=>B,就说A=>B是一条关联规则 ...
- FP-Growth in Spark MLLib
并行FP-Growth算法思路 上图的单线程形成的FP-Tree. 分布式算法事实上是对FP-Tree进行分割,分而治之 首先,假设我们只关心...|c这个conditional transactio ...
- spark mllib k-means算法实现
package iie.udps.example.spark.mllib; import java.util.regex.Pattern; import org.apache.spark.SparkC ...
随机推荐
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- geoserver发布mysql表数据
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...
- 3.App Inventor 2项目导入与导出
首先熟悉导入.导出项目是为了养成良好的备份习惯. 一.登陆App Inventor 2编程界面都大同小异,在项目菜单下面有导入项目和导出项目菜单. 二.打开导入项目界面,选择要导入的aia文件. 三. ...
- 配置Asp.Net Web项目NLog配置文件的位置
在使用NLog在asp.net项目中发现,如果想单独配其配置文件的位置时没有像Log4Net的特性配置方案,可以使其提供的 XmlLoggingConfiguration类来初始化: 见:https: ...
- Linux(CentOS 7)安装测试svn服务
1.yum install subversion,通过yum安装svn服务 2.svnserve --version,查看是否安装成功 3.mkdir -p /home.svn,创建svn仓库目录 4 ...
- ubuntu安装mysql没有让我设置密码
终端输入: sudo cat /etc/mysql/debian.cnf显示内容:# Automatically generated for Debian scripts. DO NOT TOUCH! ...
- Lnmp一键脚本
#!/bin/bash #================================================================ # Copyright (C) 2018 A ...
- Windows10家庭版运行应用提示”管理员已阻止你运行此应用...“的解决办法
win10版本家庭中文版: 运行应用程序报错: 解决办法(亲试): 1.进入”控制面板“--”用户账户“--”用户账户“,选择”更改用户账户控制设置“,选择最后一项,点击”确定“按钮,如下图: 2.按 ...
- Oracle AWRDD报告生成和性能分析
我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...
- 【重学计算机】机组D4章:存储系统
1. 存储系统层次结构 主存速度缓慢的原因:主存增速与CPU不同步,执行指令期间多次访问主存 主存容量不足的原因: 存在制约主存容量的技术因素:如由CPU.主板等相关技术指标规定了主存容量 应用对主存 ...