用Spark学习FP Tree算法和PrefixSpan算法

    在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android os n9005,SM-N9005

hkSM-N9005ZKETELSM-N9005{"softwares":[{"description":"SAMSUNG Kies,PC Sync","fileName":"Kies3Setup.exe","fileModifiedDate":"2013年9月11日","fileVersion":"Kies 3.0(13091_39…

性能调优-硬盘方面,操作系统方面,文件系统方面

硬盘对数据库性能的影响 传统机械硬盘 当前大多数数据库使用的都是传统的机械硬盘。机械硬盘的技术目前已非常成熟&#xff0c;在服务器领域一般使用SAS或SATA接口的硬盘。服务器机械硬盘开始向小型化转型&#xff0c;目前已经有大量2.5寸的SAS机械硬盘。 机械硬盘有两个重要的…

chrome Android 80,Chrome OS 80将为Chromebook带来侧载Android应用的支持

如需体验这项功能&#xff0c;需在启动 Crostini 容器时加上一行特殊的命令 —— 从 Chromebook 命令行启动时&#xff0c;请加上 –enable-features ArcAdbSideloading 。最终&#xff0c;我们希望这回成为一项明示的标记(flags)功能。如变更日志所述&#xff0c;用户可通过托…

BZOJ4122 : [Baltic2015]File paths

对于在$o$点的某个询问&#xff0c;有两种情况&#xff1a; 情况1&#xff1a;走到任意一个点$x$然后超链接跳到$o$的某个祖先$y$再走到$o$。 枚举所有$y$看看是否存在$x$即可。 时间复杂度$O(nm)$。 情况2&#xff1a;走到$o$的某个祖先$x$&#xff0c;然后走到$x$子树内某个点…

android 日历仿IOS,基于Android week view仿小米和iphone日历效果

前言最近由于项目需求&#xff0c;要做一个仿小米日历的功能&#xff0c;下面显示一天的日程&#xff0c;header以周为单位进行滑动&#xff0c;github上找了很久也没有找到合适的&#xff0c;但找到一相近的开源项目Android-week-view&#xff0c;它不是我们项目所需要的效果&…

Deque - leetcode 【双端队列】

239. Sliding Window Maximum //大概思路是用双向队列保存数字的下标&#xff0c;遍历整个数组&#xff0c;如果此时队列的首元素是i - k的话&#xff0c;表示此时窗口向右移了一步&#xff0c;则移除队首元素。然后比较队尾元素和将要进来的值&#xff0c;如果小的话就都移除&…

android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)

之前发过一个databinding版的通用adapter&#xff0c;能实现一般需求&#xff0c;不过功能比较简陋&#xff0c;实际开发中大家更倾向于使用BRVAH等功能丰富的第三方框架。现在给出一个基于BRVAH的databinding版通用Adapter。BaseAdapterabstract class BaseAdapter(private va…

1、管理员登录中间件和注销

1、根据session去判断用户是否登录&#xff0c;登录后才可以进index首页&#xff0c;否则返回login页面&#xff0c;借助中间件 (1)修改路由 Route::group([middleware > [web,admin.login],prefix>admin,namespace>Admin], function () { //注册一个中间件admin.logi…

HTML阅读打开点击不了,如何让网页文章中的代码可以点击运行

在网页中运行代码HTML5学堂&#xff1a;很多代码网站当中&#xff0c;都会提供运行代码段功能&#xff0c;便于查看代码效果&#xff0c;那么这个是如何实现的呢&#xff1f;一起来看一下——如何在网页中运行代码。HTML5学堂-刘国利said&#xff1a;应该是在2013年的时候&…

angular-cli构建

angular-cli全称Command Line Interface 命令行界面 1使用命令 npm install -g angular-cli 安装angular-cli, 2安装完成后使用cli快速常见一个angular模板, 3ng serve启动项目 4在模板(seed/种子)的基础上进行修改 ############################## 在typescript中引用leanclou…

模仿块级作用域

模仿块级作用域 JavaScript中没有块级作用域&#xff0c;这意为着在块语句中定义的变量&#xff0c;实际上是包含在函数中而非语句中创建的。 下面的这个实例可以看出: function outputNumbers(count){for (var i0; i < count; i){alert(i);}alert(i); //count }outputNum…

html留言回复评论页面模板,HTML5实现留言和回复的页面样式

这篇文章主要介绍了用HTML5如何实现留言和回复样式,需要的朋友可以参考下具体就不做详细讲解了&#xff0c;直接上代码&#xff1a;web开发-webkfa.com*{margin:0;padding:0;-webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */-webkit-t…

UVA-714 二分

把可能的进行二分判断&#xff0c;判断的时候尽量向右取&#xff0c;一直取到不能去为止&#xff0c;这样才有可能成功分割。 判断是否可以把up作为最大值的代码&#xff1a; bool judge(LL up){if(up < Big) return false; //Big是数组中最大值&#xff0c;如果up小于最大值…

html5不支持的属性,HTML5 常用语法一览(列举不支持的属性)

HTML头部标记标记描述HTML5标准定义页面中所有链接的基准URL设定显示在浏览器左上方的标题内容表明该文档是一个可用于检索的网关脚本不支持文档本身的元信息,例如查询关键词,有效期等设定CSS层叠样式表内容设定外部资源的链接页面脚本内容元信息标记属性标记描述值HTML5标准ht…

守护线程

/*守护线程&#xff08;后台线程&#xff09;:在一个进程中如果只剩下了守护线程&#xff0c;那么守护线程也会死亡。需求&#xff1a; 模拟QQ下载更新包。一个线程默认都不是守护线程。*/ public class Demo7 extends Thread {public Demo7(String name){super(name);}Overrid…

c 的word转为html5,word与html互转(1) -- word转html

使用忠告使用该方式进行xhtml到word的转换, 简单转换是可以, 但是可能并没有想象中那么满意, 转换出来的word格式并不完美, 比如目录和标题都会丢失, 标题显示看起来一样, 但是是用正文加粗和加大字号来显示的. 毕竟word是一种文档格式, 而html是一种标记性语言, 要想实现完美兼…

html5列表菜单特效,HTML5 SVG汉堡包菜单按钮分段动画特效

这是一款效果非常炫酷的HTML5 SVG汉堡包菜单按钮分段动画特效。该菜单按钮特效在用户点击汉堡包按钮时&#xff0c;按钮会分割为多段&#xff0c;并旋转变形为关闭按钮的状态。当再次点击该按钮时&#xff0c;它会逆向变形为汉堡包图标。该特效是基于Segment.js插件(一款可以只…

计算机选修课学什么,计算机专业都学什么 主要课程有什么

计算机专业的主要学习内容有什么呢&#xff0c;都开设哪些课程呢&#xff0c;下面小编为大家提供计算机专业主要学习内容&#xff0c;仅供大家参考。计算机专业主要学习内容一、数学类主要课程&#xff1a;高等数学、线性代数、离散数学、概率论、数理统计二、语言类主要课程&a…

Python学习札记(十七) 高级特性3 列表生成式

参考&#xff1a;列表生成式 Note 1.List Comprehensions&#xff0c;即列表生成式&#xff0c;是Python中内置的非常强大的list生成式。 eg.生成一个列表&#xff1a;[1*1, 2*2, ..., 10*10] 使用for...in的方法&#xff1a; #!/usr/bin/env python3L1 []for i in range(1, 1…

excel取html文本长度,excel字符长度 怎么计算excel里的字符串的长度

请教&#xff1a;在EXCEL中如何统计字符长度&#xff1f;打开excel文件&#xff0c;确定需要编辑的内容选择功能区的“公式”功能在公式中选择“LEN”功能在text中选择需要编辑的单元格 7、点击“确定” 8、系统自动计算出了单元excel中怎么判断字符串的长度在Excel中可以使用两…