在机器学习中,常用的主题有分类,回归,聚类和关联分析。而关联分析,在实际中的应用场景,有部分是用于商品零售的分析。在Spark中有相应的案例

在关联分析中,有一些概念要熟悉。 频繁项集,关联规则,支持度,置信度,提升度。其中 频繁项集(frequent item sets) 是经常出现在一块的物品的集合,关联规则(association rules)    两种物品之间可能存在很强的关系

  1)支持度 support (x => y)     = P(x y) = freq(x y)/total = confidence (x=>y)* freq(x)/total, 事件x和事件y共同出现的概率;用频次也可以计算,也可以通过置信度计算
  2)置信度 confidence (x => y)  = P(y|x) = freq(xy)/freq(x), ,出现事件x的事件中出现事件y的概率;
  3)提升度 lift (x => y)               = P(y|x)/P(x) = P(xy)/(P(x)*P(y)) = confidence (x=>y)*total/ freq(y),出现x的条件下出现事件y的概率和没有条件x出现y的概率
       4) item_two(x=>y)                   = confidence (x=>y)* freq(x),出现x的条件下出现事件y的概率和没有条件x出现y的概率

主要涉及概率中的乘法公式。条件概率公式,上述的这些知识点可以复习一下基本的概念
实现的算法有两种。apriori 和FP-growth 其中  Apriori及其变形算法需要多次扫描数据库,并需要生成指数级的候选项集。FP-growth 算法通过构建FP-tree来压缩事务数据库中的信息,从而更加有效地产生频繁项集 (Frequent Patterns)。在这些主要是使用这些算法来驱动业务,所以 主要关注FP-growth 解决实际的频繁项集和关联规则挖掘问题。Demo的具体实现参考了Spark的案例,做了部分修改。在生产环境中,基本上要和业务对接,然后针对具体的场景,做参数的调节和关注输入数据的各种数据预处理。

import java.util.Arrays;
import java.util.List;
import org.apache.spark.ml.fpm.FPGrowth;
import org.apache.spark.ml.fpm.FPGrowthModel;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.*;
import static org.apache.spark.sql.functions.col;
import static org.apache.spark.sql.functions.lit;

public class JavaFPGrowth {

public static void main(String[] args) {
SparkSession spark = SparkSession
.builder()
.master("local[2]")
.appName("JavaFPGrowth_spark2.3")
.getOrCreate();
//设定本地日志
spark.sparkContext().setLogLevel("WARN");

List<Row> data = Arrays.asList(
RowFactory.create("1", Arrays.asList("1 2 5".split(" "))),
RowFactory.create("2",Arrays.asList("1 2 3 5".split(" "))),
RowFactory.create("4",Arrays.asList("6".split(" "))),
RowFactory.create("3",Arrays.asList("1 2".split(" ")))
);
StructType schema = new StructType(new StructField[]{
new StructField("user", DataTypes.StringType, false, Metadata.empty()),
new StructField(
"items", new ArrayType(DataTypes.StringType, true), false, Metadata.empty())
});
Dataset<Row> itemsDF = spark.createDataFrame(data, schema);
long lengthdata = itemsDF.count();

FPGrowthModel model = new FPGrowth()
.setItemsCol("items")
.setMinSupport(0.1)
.setMinConfidence(0.6)
.fit(itemsDF);

// Display frequent itemsets.
// | items|freq
Dataset<Row> ItemFreq = model.freqItemsets().withColumn("total", lit(lengthdata));
ItemFreq.show();
ItemFreq.createOrReplaceTempView("test_freq_view_d");

// Display generated association rules.
// antecedent 表示前项 consequent 表示后项 confidence 表示规则的置信度
Dataset<Row> ItemRules = model.associationRules() ;
// 计算支持度
Dataset<Row> res = ItemFreq.join(ItemRules, col("items").equalTo(col("antecedent")), "inner");
Dataset<Row> supportDF = res.withColumn("support",col("freq").divide(lengthdata).multiply(col("confidence")));
//使用视图sql方式 计算支持度 提升度 
ItemRules.createOrReplaceTempView("test_rules_view_d");
String support_sql = "select tt1.antecedent, tt1.antecedent_freq\n" +
", tt1.consequent , tt2.freq as consequent_freq\n" +
" , tt1.total , tt1.two_item_freq , tt1.support , tt1.confidence\n" +
" , tt1.confidence * tt1.total/ tt2.freq as lift\n" +
" from(select t2.freq as antecedent_freq, t2.total, t2.freq/t2.total*t1.confidence as support, \n" +
" t2.freq*t1.confidence as two_item_freq,\n" +
" t1.antecedent, t1.consequent, t1.confidence \n" +
"from test_rules_view_d t1 inner join test_freq_view_d t2 \n" +
"on t2.items = t1.antecedent)tt1 inner join test_freq_view_d tt2 \n" +
"on tt2.items = tt1.consequent";
Dataset<Row> suppoerdf = spark.sql(support_sql);
suppoerdf.show();

// items | prediction|
model.transform(itemsDF).show();

spark.stop();
}
}

以上是实现的代码,也就是根据 model.freqItemsets() 和 model.associationRules()  的计算结果来计算其他相关的数据,在这里保留了两种查询风格 DSL与SQL,一种是使用DSL的方式。一种是createOrReplaceTempView 使用SQL的方式来实现。很多示例都是scala语言写的,而Java的方式有所不同,尝试一下基本就可以确定。

参考:

   频繁项集与关联规则 FP-growth 的原理和实现 https://developer.ibm.com/zh/articles/machine-learning-hands-on2-fp-growth/

Spark应用开发-关联分析的更多相关文章

  1. 关联分析Apriori算法和FP-growth算法初探

    1. 关联分析是什么? Apriori和FP-growth算法是一种关联算法,属于无监督算法的一种,它们可以自动从数据中挖掘出潜在的关联关系.例如经典的啤酒与尿布的故事.下面我们用一个例子来切入本文对 ...

  2. Spark(六)Spark之开发调优以及资源调优

    Spark调优主要分为开发调优.资源调优.数据倾斜调优.shuffle调优几个部分.开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础:数据倾斜调优,主 ...

  3. 基于 Spark 的文本情感分析

    转载自:https://www.ibm.com/developerworks/cn/cognitive/library/cc-1606-spark-seniment-analysis/index.ht ...

  4. 转】[1.0.2] 详解基于maven管理-scala开发的spark项目开发环境的搭建与测试

    场景 好的,假设项目数据调研与需求分析已接近尾声,马上进入Coding阶段了,辣么在Coding之前需要干马呢?是的,“统一开发工具.开发环境的搭建与本地测试.测试环境的搭建与测试” - 本文详细记录 ...

  5. FusionInsight大数据开发---Spark应用开发

    Spark应用开发 要求: 了解Spark基本原理 搭建Spark开发环境 开发Spark应用程序 调试运行Spark应用程序 YARN资源调度,可以和Hadoop集群无缝对接 Spark适用场景大多 ...

  6. spark和strom优劣分析

    对于Storm来说:1.建议在那种需要纯实时,不能忍受1秒以上延迟的场景下使用,比如实时金融系统,要求纯实时进行金融交易和分析2.此外,如果对于实时计算的功能中,要求可靠的事务机制和可靠性机制,即数据 ...

  7. Windows下搭建Spark+Hadoop开发环境

    Windows下搭建Spark+Hadoop开发环境需要一些工具支持. 只需要确保您的电脑已装好Java环境,那么就可以开始了. 一. 准备工作 1. 下载Hadoop2.7.1版本(写Spark和H ...

  8. Ubuntu14.04或16.04下Hadoop及Spark的开发配置

    对于Hadoop和Spark的开发,最常用的还是Eclipse以及Intellij IDEA. 其中,Eclipse是免费开源的,基于Eclipse集成更多框架配置的还有MyEclipse.Intel ...

  9. 【GWAS文献解读】疟原虫青蒿素抗药性的全基因组关联分析

    英文名:Genetic architecture of artemisinin-resistant Plasmodium falciparum 中文名:疟原虫青蒿素抗药性的全基因组关联分析 期刊:Na ...

随机推荐

  1. 大型企业都在用的Python反爬虫手段,破了它!

    SVG 映射反爬虫 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...

  2. 前端面试 vue 部分 (3)——v-show和v-if的区别

    v-if 适用于在运行时很少改变条件,不需要频繁切换条件的场景: v-show 则适用于需要非常频繁切换条件的场景. v-if 是条件渲染,如果在初始渲染时条件为假,则什么也不做--直到条件第一次变为 ...

  3. VMWare虚拟机问题总结

    windows7提示:在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能,虚拟设备:'seria10'将断开连接. 解决:打开虚拟机前选择    编辑-->首选项-->设备--&g ...

  4. ElasticSearch 7.8.1 从入门到精通

    学前导读 ElasticSearch对电脑配置要求较高,内存至少4G以上,空闲2G内存,线程数4018+ 学习的时候,推荐将ElasticSearch安装到Linux或者mac上,极度不推荐装Wind ...

  5. Quartz.Net的基础使用方法,多任务执行继续扩展

    前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...

  6. Vue Vue-loader / VueLoaderPlugin / Webpack

    在不用VueCli创建项目的时候,手写引入vue的时候,配置webpack的时候发现了这个问题 webpack vue-loader was used without the correspondin ...

  7. Java学习书籍与社区

    编码规范:<阿里巴巴Java开发手册> 技术架构:<大型网站技术架构核心原理与案例分析>---李智慧 Spring架构与设计原理解析:<Spring技术内幕深入解析Spr ...

  8. Python | 浅谈并发锁与死锁问题

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第24篇文章,我们一起来聊聊多线程场景当中不可或缺的另外一个部分--锁. 如果你学过操作系统,那么对于锁应该不陌生. ...

  9. unity探索者之socket传输protobuf字节流(二)

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/6977935.html 上一篇主要说的是protobuf字节流的序列化和解析,将pr ...

  10. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...