在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法。由于scikit-learn中没有关联算法的类库,而Spark MLlib有,本文的使用以Spark MLlib作为使用环境。

1. Spark MLlib关联算法概述

    在Spark MLlib中,也只实现了两种关联算法,即我们的FP Tree和PrefixSpan,而像Apriori,GSP之类的关联算法是没有的。而这些算法支持Python,Java,Scala和R的接口。由于前面的实践篇我们都是基于Python,本文的后面的介绍和使用也会使用MLlib的Python接口。

     Spark MLlib关联算法基于Python的接口在pyspark.mllib.fpm包中。FP Tree算法对应的类是pyspark.mllib.fpm.FPGrowth(以下简称FPGrowth类),从Spark1.4开始才有。而PrefixSpan算法对应的类是pyspark.mllib.fpm.PrefixSpan(以下简称PrefixSpan类),从Spark1.6开始才有。因此如果你的学习环境的Spark低于1.6的话,是不能正常的运行下面的例子的。

     Spark MLlib也提供了读取关联算法训练模型的类,分别是 pyspark.mllib.fpm.FPGrowthModel和pyspark.mllib.fpm.PrefixSpanModel。这两个类可以把我们之前保存的FP Tree和PrefixSpan训练模型读出来。

2. Spark MLlib关联算法参数介绍

    对于FPGrowth类,使用它的训练函数train主要需要输入三个参数:数据项集data,支持度阈值minSupport和数据并行运行时的数据分块数numPartitions。对于支持度阈值minSupport,它的取值大小影响最后的频繁项集的集合大小,支持度阈值越大,则最后的频繁项集数目越少,默认值0.3。而数据并行运行时的数据分块数numPartitions主要在分布式环境的时候有用,如果你是单机Spark,则可以忽略这个参数。

    对于PrefixSpan类, 使用它的训练函数train主要需要输入四个参数:序列项集data,支持度阈值minSupport, 最长频繁序列的长度maxPatternLength 和最大单机投影数据库的项数maxLocalProjDBSize。支持度阈值minSupport的定义和FPGrowth类类似,唯一差别是阈值默认值为0.1。maxPatternLength限制了最长的频繁序列的长度,越小则最后的频繁序列数越少。maxLocalProjDBSize参数是为了保护单机内存不被撑爆。如果只是是少量数据的学习,可以忽略这个参数。

    从上面的描述可以看出,使用FP Tree和PrefixSpan算法没有什么门槛。学习的时候可以通过控制支持度阈值minSupport控制频繁序列的结果。而maxPatternLength可以帮忙PrefixSpan算法筛除太长的频繁序列。在分布式的大数据环境下,则需要考虑FPGrowth算法的数据分块数numPartitions,以及PrefixSpan算法的最大单机投影数据库的项数maxLocalProjDBSize。

3. Spark FP Tree和PrefixSpan算法使用示例

    这里我们用一个具体的例子来演示如何使用Spark FP Tree和PrefixSpan算法挖掘频繁项集和频繁序列。

    完整代码参见我的github: https://github.com/ljpzzz/machinelearning/blob/master/classic-machine-learning/fp_tree_prefixspan.ipynb

    要使用 Spark 来学习FP Tree和PrefixSpan算法,首先需要要确保你安装好了Hadoop和Spark(版本不小于1.6),并设置好了环境变量。一般我们都是在ipython notebook(jupyter notebook)中学习,所以最好把基于notebook的Spark环境搭好。当然不搭notebook的Spark环境也没有关系,只是每次需要在运行前设置环境变量。

    如果你没有搭notebook的Spark环境,则需要先跑下面这段代码。当然,如果你已经搭好了,则下面这段代码不用跑了。

import os
import sys#下面这些目录都是你自己机器的Spark安装目录和Java安装目录
os.environ['SPARK_HOME'] = "C:/Tools/spark-1.6.1-bin-hadoop2.6/"sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/bin")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/pyspark")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib/pyspark.zip")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib/py4j-0.9-src.zip")
sys.path.append("C:/Program Files (x86)/Java/jdk1.8.0_102")from pyspark import SparkContext
from pyspark import SparkConfsc = SparkContext("local","testing")

    在跑算法之前,建议输出Spark Context如下,如果可以正常打印内存地址,则说明Spark的运行环境搞定了。

print sc

    比如我的输出是:

<pyspark.context.SparkContext object at 0x07D9E2B0>

    现在我们来用数据来跑下FP Tree算法,为了和FP Tree算法原理总结中的分析比照,我们使用和原理篇一样的数据项集,一样的支持度阈值20%,来训练数据。代码如下:

from  pyspark.mllib.fpm import FPGrowth
data = [["A", "B", "C", "E", "F","O"], ["A", "C", "G"], ["E","I"], ["A", "C","D","E","G"], ["A", "C", "E","G","L"],["E","J"],["A","B","C","E","F","P"],["A","C","D"],["A","C","E","G","M"],["A","C","E","G","N"]]
rdd = sc.parallelize(data, 2)
#支持度阈值为20%
model = FPGrowth.train(rdd, 0.2, 2)

    我们接着来看看频繁项集的结果,代码如下:

sorted(model.freqItemsets().collect())

    输出即为所有 满足要求的频繁项集,大家可以和原理篇里面分析时产生的频繁项集比较。代码输出如下:

[FreqItemset(items=[u'A'], freq=8),FreqItemset(items=[u'B'], freq=2),FreqItemset(items=[u'B', u'A'], freq=2),FreqItemset(items=[u'B', u'C'], freq=2),FreqItemset(items=[u'B', u'C', u'A'], freq=2),FreqItemset(items=[u'B', u'E'], freq=2),FreqItemset(items=[u'B', u'E', u'A'], freq=2),FreqItemset(items=[u'B', u'E', u'C'], freq=2),FreqItemset(items=[u'B', u'E', u'C', u'A'], freq=2),FreqItemset(items=[u'C'], freq=8),FreqItemset(items=[u'C', u'A'], freq=8),FreqItemset(items=[u'D'], freq=2),FreqItemset(items=[u'D', u'A'], freq=2),FreqItemset(items=[u'D', u'C'], freq=2),FreqItemset(items=[u'D', u'C', u'A'], freq=2),FreqItemset(items=[u'E'], freq=8),FreqItemset(items=[u'E', u'A'], freq=6),FreqItemset(items=[u'E', u'C'], freq=6),FreqItemset(items=[u'E', u'C', u'A'], freq=6),FreqItemset(items=[u'F'], freq=2),FreqItemset(items=[u'F', u'A'], freq=2),FreqItemset(items=[u'F', u'B'], freq=2),FreqItemset(items=[u'F', u'B', u'A'], freq=2),FreqItemset(items=[u'F', u'B', u'C'], freq=2),FreqItemset(items=[u'F', u'B', u'C', u'A'], freq=2),FreqItemset(items=[u'F', u'B', u'E'], freq=2),FreqItemset(items=[u'F', u'B', u'E', u'A'], freq=2),FreqItemset(items=[u'F', u'B', u'E', u'C'], freq=2),FreqItemset(items=[u'F', u'B', u'E', u'C', u'A'], freq=2),FreqItemset(items=[u'F', u'C'], freq=2),FreqItemset(items=[u'F', u'C', u'A'], freq=2),FreqItemset(items=[u'F', u'E'], freq=2),FreqItemset(items=[u'F', u'E', u'A'], freq=2),FreqItemset(items=[u'F', u'E', u'C'], freq=2),FreqItemset(items=[u'F', u'E', u'C', u'A'], freq=2),FreqItemset(items=[u'G'], freq=5),FreqItemset(items=[u'G', u'A'], freq=5),FreqItemset(items=[u'G', u'C'], freq=5),FreqItemset(items=[u'G', u'C', u'A'], freq=5),FreqItemset(items=[u'G', u'E'], freq=4),FreqItemset(items=[u'G', u'E', u'A'], freq=4),FreqItemset(items=[u'G', u'E', u'C'], freq=4),FreqItemset(items=[u'G', u'E', u'C', u'A'], freq=4)]

    接着我们来看看使用PrefixSpan类来挖掘频繁序列。为了和PrefixSpan算法原理总结中的分析比照,我们使用和原理篇一样的数据项集,一样的支持度阈值50%,同时将最长频繁序列程度设置为4,来训练数据。代码如下:

from  pyspark.mllib.fpm import PrefixSpan
data = [[['a'],["a", "b", "c"], ["a","c"],["d"],["c", "f"]],[["a","d"], ["c"],["b", "c"], ["a", "e"]],[["e", "f"], ["a", "b"], ["d","f"],["c"],["b"]],[["e"], ["g"],["a", "f"],["c"],["b"],["c"]]]
rdd = sc.parallelize(data, 2)
model = PrefixSpan.train(rdd, 0.5,4)

   我们接着来看看频繁序列的结果,代码如下: 

sorted(model.freqSequences().collect())

   输出即为所有满足要求的频繁序列,大家可以和原理篇里面分析时产生的频繁序列比较。代码输出如下: 

[FreqSequence(sequence=[[u'a']], freq=4),FreqSequence(sequence=[[u'a'], [u'a']], freq=2),FreqSequence(sequence=[[u'a'], [u'b']], freq=4),FreqSequence(sequence=[[u'a'], [u'b'], [u'a']], freq=2),FreqSequence(sequence=[[u'a'], [u'b'], [u'c']], freq=2),FreqSequence(sequence=[[u'a'], [u'b', u'c']], freq=2),FreqSequence(sequence=[[u'a'], [u'b', u'c'], [u'a']], freq=2),FreqSequence(sequence=[[u'a'], [u'c']], freq=4),FreqSequence(sequence=[[u'a'], [u'c'], [u'a']], freq=2),FreqSequence(sequence=[[u'a'], [u'c'], [u'b']], freq=3),FreqSequence(sequence=[[u'a'], [u'c'], [u'c']], freq=3),FreqSequence(sequence=[[u'a'], [u'd']], freq=2),FreqSequence(sequence=[[u'a'], [u'd'], [u'c']], freq=2),FreqSequence(sequence=[[u'a'], [u'f']], freq=2),FreqSequence(sequence=[[u'b']], freq=4),FreqSequence(sequence=[[u'b'], [u'a']], freq=2),FreqSequence(sequence=[[u'b'], [u'c']], freq=3),FreqSequence(sequence=[[u'b'], [u'd']], freq=2),FreqSequence(sequence=[[u'b'], [u'd'], [u'c']], freq=2),FreqSequence(sequence=[[u'b'], [u'f']], freq=2),FreqSequence(sequence=[[u'b', u'a']], freq=2),FreqSequence(sequence=[[u'b', u'a'], [u'c']], freq=2),FreqSequence(sequence=[[u'b', u'a'], [u'd']], freq=2),FreqSequence(sequence=[[u'b', u'a'], [u'd'], [u'c']], freq=2),FreqSequence(sequence=[[u'b', u'a'], [u'f']], freq=2),FreqSequence(sequence=[[u'b', u'c']], freq=2),FreqSequence(sequence=[[u'b', u'c'], [u'a']], freq=2),FreqSequence(sequence=[[u'c']], freq=4),FreqSequence(sequence=[[u'c'], [u'a']], freq=2),FreqSequence(sequence=[[u'c'], [u'b']], freq=3),FreqSequence(sequence=[[u'c'], [u'c']], freq=3),FreqSequence(sequence=[[u'd']], freq=3),FreqSequence(sequence=[[u'd'], [u'b']], freq=2),FreqSequence(sequence=[[u'd'], [u'c']], freq=3),FreqSequence(sequence=[[u'd'], [u'c'], [u'b']], freq=2),FreqSequence(sequence=[[u'e']], freq=3),FreqSequence(sequence=[[u'e'], [u'a']], freq=2),FreqSequence(sequence=[[u'e'], [u'a'], [u'b']], freq=2),FreqSequence(sequence=[[u'e'], [u'a'], [u'c']], freq=2),FreqSequence(sequence=[[u'e'], [u'a'], [u'c'], [u'b']], freq=2),FreqSequence(sequence=[[u'e'], [u'b']], freq=2),FreqSequence(sequence=[[u'e'], [u'b'], [u'c']], freq=2),FreqSequence(sequence=[[u'e'], [u'c']], freq=2),FreqSequence(sequence=[[u'e'], [u'c'], [u'b']], freq=2),FreqSequence(sequence=[[u'e'], [u'f']], freq=2),FreqSequence(sequence=[[u'e'], [u'f'], [u'b']], freq=2),FreqSequence(sequence=[[u'e'], [u'f'], [u'c']], freq=2),FreqSequence(sequence=[[u'e'], [u'f'], [u'c'], [u'b']], freq=2),FreqSequence(sequence=[[u'f']], freq=3),FreqSequence(sequence=[[u'f'], [u'b']], freq=2),FreqSequence(sequence=[[u'f'], [u'b'], [u'c']], freq=2),FreqSequence(sequence=[[u'f'], [u'c']], freq=2),FreqSequence(sequence=[[u'f'], [u'c'], [u'b']], freq=2)]

  在训练出模型后,我们也可以调用save方法将模型存到磁盘,然后在需要的时候通过FPGrowthModel或PrefixSpanModel将模型读出来。

  以上就是用Spark学习FP Tree算法和PrefixSpan算法的所有内容,希望可以帮到大家。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

转载于:https://www.cnblogs.com/pinard/p/6340162.html

用Spark学习FP Tree算法和PrefixSpan算法相关推荐

  1. 使用Apriori算法和FP-growth算法进行关联分析

    目录 1. 关联分析 2. Apriori原理 3. 使用Apriori算法来发现频繁集 4. 使用FP-growth算法来高效发现频繁项集 5. 示例:从新闻网站点击流中挖掘新闻报道 扩展阅读 系列 ...

  2. 浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

    写在前面 最近我在学习一门名叫<智能自主机器人及系统>的课程,虽然跟过去所学的<机器人学>在部分内容上有所重复,但该课程的应用性更强.对于不同的机器人,如差速轮式车.四轮车.四 ...

  3. 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...

  4. Prim算法和Kruskal算法

       Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...

  5. 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法

    第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...

  6. matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现

    Prim算法和Kruskal算法的Matlab实现 <计算机仿真>期末大作业 Prim算法和Kruskal算法的Matlab实现 05605刘禹050697(30) 连线问题应用举例: 欲 ...

  7. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  8. 关联规则挖掘算法: Aprior算法和Fpgrowth算法

      关联规则挖掘的目的是挖掘不同物品(item)之前的相关性,啤酒和尿布的故事就是一个典型的成功例子.关联规则挖掘思想简单高效,在广告推荐领域也有较多的应用,主要用于推荐模型落地前的流量探索以及构建规 ...

  9. 【数据挖掘实验】关联规则——CARMA算法和AprioriAll算法

    一.实验项目名称: 关联规则--CARMA算法和AprioriAll算法 二.实验目的与要求: 在软件方面:会用Clementine软件进行序列关联规则分析. 在理论方面:CARMA算法和Aprior ...

最新文章

  1. 记一次WiFi芯片W600上串口只能回显的问题
  2. django 的ORM
  3. nginx之Geoip读取地域信息模块
  4. 不迈出第一步,不去尝试,你永远不知道能否成功
  5. 高并发与负载均衡-keepalived-概念介绍
  6. 美团暑期实习前端面试
  7. Android利用温度传感器实现带动画效果的电子温度计
  8. 特征选择的基本方法概述
  9. 基于消息的软件架构模型演变
  10. (二):winelib用户手册1
  11. 模糊控制 之 模糊集,隶属函数,模糊关系
  12. 【年终总结系列 2017】求职之路
  13. GAN的评价指标IS和FID
  14. 10 craps赌博游戏
  15. 什么是IDE,ATA,SATA,SCSI和SAS硬盘
  16. 赛效:WPS何把文档里竖排的文字变成横排的
  17. Trunk和Access分析
  18. 通达OA 2015 8.12版本取消注册功能介绍
  19. js 下载Base64格式数据图片(兼容主流浏览器)
  20. 我们实际上是房地产开发商 和 我们政府的奴隶

热门文章

  1. 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
  2. 第八篇Django分页
  3. 转载:python引用DLL文件的方法
  4. Objective-C反射机制
  5. 关于软件工程的那些事儿————《人·绩效·职业道德》和《一个程序员的生命周期》读后感...
  6. Mybatis日常操作遇到的问题
  7. 男生给女生最牛B的告白
  8. layui中table监听单元格_最全总结 | 聊聊 Python 办公自动化之 PPT(中)
  9. linux 培训6,Linux Syscalls有 6个参数(Linux Syscalls with 6 parameters)
  10. 面试官:说一下List排序方法