fp算法例题_机器学习(九)—FP-growth算法

本来老师是想让我学Hadoop的,也装了Ubuntu,配置了Hadoop,一时间却不知从何学起,加之自己还是想先看点自己喜欢的算法,学习Hadoop也就暂且搁置了,不过还是想问一下园子里的朋友有什么学习Hadoop好点的资料,求推荐~言归正传,继Apriori算法之后,今天来学习FP-growth算法。

和Apriori算法相比,FP-growth算法只需要对数据库进行两次遍历,从而高效发现频繁项集。对于搜索引擎公司而言,他们需要通过查看互联网上的用词来找出经常在一块出现的词对,因此这些公司就需要能够高效的发现频繁项集的方法,今天要学习的FP-growth算法就可以完成此重任。

一 FP-growth算法

1.概述

FP-growth算法是基于Apriori原理的,通过将数据集存储在FP(Frequent Pattern)树上发现频繁项集,但不能发现数据之间的关联规则。FP-growth算法只需要对数据库进行两次扫描,而Apriori算法在求每个潜在的频繁项集时都需要扫描一次数据集,所以说Apriori算法是高效的。其中算法发现频繁项集的过程是:

(1)构建FP树;

(2)从FP树中挖掘频繁项集。

2. 构建FP树

FP表示的是频繁模式,其通过链接来连接相似元素,被连起来的元素可以看成是一个链表。将事务数据表中的各个事务对应的数据项按照支持度排序后,把每个事务中的数据项按降序依次插入到一棵以 NULL为根节点的树中,同时在每个结点处记录该结点出现的支持度。

FP-growth算法的流程为:首先构造FP树,然后利用它来挖掘频繁项集。在构造FP树时,需要对数据集扫描两边,第一遍扫描用来统计频率,第二遍扫描至考虑频繁项集。下面举例对FP树加以说明。

假设存在的一个事务数据样例为,构建FP树的步骤如下:

事务ID

事务中的元素

001

r,z,h,j,p

002

z,y,x,w,v,u,t,s

003

z

004

r,x,n,o,s

005

y,r,x,z,q,t,p

006

y,z,x,e,q,s,t,m

结合Apriori算法中最小支持度的阈值,在此将最小支持度定义为3,结合上表中的数据,那些不满足最小支持度要求的将不会出现在最后的FP树中,据此构建FP树,并采用一个头指针表来指向给定类型的第一个实例,快速访问FP树中的所有元素,构建的带头指针的FP树如下:

结合绘制的带头指针表的FP树,对表中数据进行过滤,排序如下:

事务ID

事务中的元素

过滤和重排序后的事务

001

r,z,h,j,p

z,r

002

z,y,x,w,v,u,t,s

z,x,y,s,t

003

z

z

004

r,x,n,o,s

x,s,r

005

y,r,x,z,q,t,p

z,x,y,r,t

006

y,z,x,e,q,s,t,m

z,x,y,s,t

在对数据项过滤排序了之后,就可以构建FP树了,从NULL开始,向其中不断添加过滤排序后的频繁项集。过程可表示为:

根据该思想就可以实现FP树的构建,下面就采用Python进行实现。我们知道,在第二次扫描数据集时会构建一棵FP树,并采用一个容器来保存树。首先创建一个类来保存树的每一个节点,代码如下:

#coding:utf-8

from numpy import *

classtreeNode:def __init__(self, nameValue, numOccur, parentNode):

self.name=nameValue

self.count=numOccur

self.nodeLink=None

self.parent= parentNode #needs to be updated

self.children ={}definc(self,numOccur):

self.count+=numOccurdef disp(self,ind = 1):print ' '*ind,self.name,' ',self.countfor child inself.children.values():

child.disp(ind+1)'''#test

rootNode = treeNode('pyramid',9,None)

rootNode.children['eye'] = treeNode('eye',13,None)

a = rootNode.disp()

print a'''

这样,FP树对应的数据结构就建好了,现在就可以构建FP树了,FP树的构建函数如下:

#FP构建函数

def createTree(dataSet,minSup = 1):

headerTable={}for trans indataSet:for item intrans:

headerTable[item]= headerTable.get(item,0) + dataSet[trans]#记录每个元素项出现的频度

for k inheaderTable.keys():if headerTable[k] freqItemSet=set(headerTable.keys())if len(freqItemSet) == 0:#不满足最小值支持度要求的除去returnNone,Nonefor k inheaderTable:headerTable[k]=[headerTable[k],None]retTree= treeNode('Null Set',1,None)for tranSet,count indataSet.items():localD={}for item intranSet:if item infreqItemSet:localD[item]=headerTable[item][0]if len(localD) >0:orderedItems= [v[0] for v in sorted(localD.items(),key = lambda p:p[1],reverse =True)]updateTree(orderedItems,retTree,headerTable,count)returnretTree,headerTabledefupdateTree(items, inTree, headerTable, count):if items[0] ininTree.children:inTree.children[items[0]].inc(count)else:inTree.children[items[0]]=treeNode(items[0], count, inTree)if headerTable[items[0]][1] ==None:headerTable[items[0]][1] =inTree.children[items[0]]else:updateHeader(headerTable[items[0]][1], inTree.children[items[0]])if len(items) > 1:updateTree(items[1::], inTree.children[items[0]], headerTable, count)defupdateHeader(nodeToTest, targetNode):while (nodeToTest.nodeLink !=None):nodeToTest=nodeToTest.nodeLinknodeToTest.nodeLink= targetNode在运行上例之前还需要一个真正的数据集,结合之前的数据自定义数据集:defloadSimpDat():simpDat= [['r', 'z', 'h', 'j', 'p'],['z', 'y', 'x', 'w', 'v', 'u', 't', 's'],['z'],['r', 'x', 'n', 'o', 's'],['y', 'r', 'x', 'z', 'q', 't', 'p'],['y', 'z', 'x', 'e', 'q', 's', 't', 'm']]returnsimpDatdefcreateInitSet(dataSet):retDict={}for trans indataSet:retDict[frozenset(trans)]= 1return retDict运行:#testsimpDat =loadSimpDat()initSet=createInitSet(simpDat)myFPtree,myHeaderTab= createTree(initSet,3)a=myFPtree.disp()print a这样就构建了FP树,接下来就是使用它来进行频繁项集的挖掘。3. 从FP树中挖掘频繁项集在构建了FP树之后,就可以抽取频繁项集了,这里的思想和Apriori算法大致类似,首先从氮元素项集合开始,然后在此基础上逐步构建更大的集合。大致分为三个步骤:(1)从FP树中获得条件模式基;(2)利用条件模式基,构建一个条件FP树;(3)迭代重复(1)和(2),直到树包含一个元素项为止。首先,获取条件模式基。条件模式基是以所查找元素项为结尾的路径集合,表示的是所查找的元素项与树根节点之间的所有内容。结合构建FP树绘制的图,r的前缀路径就是{x,s}、{z,x,y}和{z},其中的每条前缀路径都与一个计数值有关,该计数值表示的是每条路径上r的数目。为了得到这些前缀路径,结合之前所得到的头指针表,头指针表中包含相同类型元素链表的起始指针,根据每一个元素项都可以上溯到这棵树直到根节点为止。该过程对应的代码如下:def ascendTree(leafNode, prefixPath): #ascends from leaf node to rootif leafNode.parent !=None:prefixPath.append(leafNode.name)ascendTree(leafNode.parent, prefixPath)def findPrefixPath(basePat, treeNode): #treeNode comes from header tablecondPats ={}while treeNode !=None:prefixPath=[]ascendTree(treeNode, prefixPath)if len(prefixPath) > 1:condPats[frozenset(prefixPath[1:])] =treeNode.counttreeNode=treeNode.nodeLinkreturncondPats#testsimpDat =loadSimpDat()initSet=createInitSet(simpDat)myFPtree,myHeaderTab= createTree(initSet,3)a=myFPtree.disp()b= findPrefixPath('x',myHeaderTab['x'][1])print b运行代码,与所给数据一致。接下来就可以创建条件FP树了。对于每一个频繁项,都需要创建一棵条件FP树,使用刚才创建的条件模式基作为输入,采用相同的建树代码来构建树,相应的递归发现频繁项、发现条件模式基和另外的条件树。对应的递归查找频繁项集的函数如下:defmineTree(inTree, headerTable, minSup, preFix, freqItemList):bigL= [v[0] for v in sorted(headerTable.items(), key=lambda p: p[1])]#(sort header table)for basePat inbigL:newFreqSet=preFix.copy()newFreqSet.add(basePat)freqItemList.append(newFreqSet)condPattBases= findPrefixPath(basePat, headerTable[basePat][1])myCondTree, myHead=createTree(condPattBases, minSup)if myHead !=None:mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)结合之前的数据验证发现无误。二  从新闻网站点击流中挖掘上述在自定义的数据中队算法进行了验证,现在选取实际的数据进行测试。在这个数据集合中,包含了100万条记录,文件中的每一行包含某个用户浏览过的新闻报道,用来寻找那些至少被10万人浏览过的报道。代码如下:#从新闻网站点击流中挖掘parsedData = [line.split() for line in open('kosarak.dat').readlines()]initSet=createInitSet(parsedData)myFPtree,myHeaderTab= createTree(initSet,100000)myFreqList=[]a= mineTree(myFPtree,myHeaderTab,100000,set([]),myFreqList)b=len(myFreqList)printbprint myFreqList这样就实现了此功能。以上是我自己的总结和理解,难免有错,还望各位朋友不吝赐教~

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

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

相关文章

linux 改变文件夹属性,技术|在Linux中用chattr和lsattr命令管理文件和目录属性

为了允许添加数据,防止更改或者删除等,文件和文件夹可以设定了特定的控制属性。例如,你可以在关键的系统文件或者文件夹中启用属性,然后没有任何用户,包括root,可以删除或者修改它,比如不允许使…

封头名义厚度如何圆整_松原封头价格

松原封头价格这种情况下我们常常是选用宽度1500毫米的板材开展下料。同时为了保证其的宽度,借此需要下两块料。此外在下料前需要在原板材上面选择一段试样,需对试样实施物理性能测试和化学元素含量的测试,缘于物理性能决定封头的减薄率&#…

Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...

需要,不过大部分linux都自带,少量的也都有自动安装文件 比如ati的显卡驱动什么的。之前还自己写过驱动,linux的驱动比windows的驱动透明度高很多大部分硬件基本上 都可以识别的 也可以通过网络更新 之前我用ubantu的时候是这样的 别的没试过 …

div和div之间画横线_javascript – jQuery – 使用画布在div之间绘制线条

我会把div定位为绝对的,然后把它们放在你想要的地方.然后用这个功能获得他们的位置://Get the absolute position of a DOM object on a pagefunction findPos(obj) {var curLeft curTop 0;if (obj.offsetParent) {do {curLeft obj.offsetLeft;curTop obj.offse…

linux 系统盘无法ls,系统故障排除

1.系统故障排除1)模拟磁盘/dev/sda的MBR故障,并执行修复01.备份磁盘/dev/sda的MBR扇区选择一个/dev/sda以外的文件系统(比如/dev/sdb1)来存放备份文件:[rootsvr5 ~]# df -hT/home//选择/dev/sdb1存放备份文件系统 类型 容量 已用 可…

docker公共存储库_查找并修复docker镜像安全漏洞

容器的出现使开发团队可以创建沙盒环境,以在其中运行和测试应用程序,容器主要由从 docker hub 或其他公共镜像存储库提取的开源镜像组成。但是这些开源镜像有时可能包含一些漏洞,这些漏洞可能会危害容器的安全,进而危害其主机/服务…

linux修改services命令,Linux中service指令都有哪些参数

这是因为没有配置安装服务器配置安装服务器 如下1、 以root登录安装服务器,用命令 rpm –qa | grep tftp 查看是否安装了tftp软件包,如果没有,安装一下(安装软件的方法将在后面的文章中详细介绍)。2、 修改tftp的配置文件,使tftp服务可以随linux开机启动…

vim关闭下一行也是注释_在Vim中注释/取消注释行的快速方法是什么?

我有一个在vi中打开的Ruby代码文件&#xff0c;其中的行注释为#&#xff1a;class Search < ActiveRecord::Migrationdef self.up# create_table :searches do |t|# t.integer :user_id# t.string :name# t.string :all_of# t.string :any_of# t.string :none_of#…

linux中常用安装程序的方法,Linux下常见的软件安装方式

一、Linux源码安装1、解压源码包文件源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩&#xff0c;后缀格式会分别为.tar.gz与.tar.bz2&#xff0c;分别的解压方式&#xff1a;#tar -zxvf File.tar.gz#tar -jxvf File.tar.bz22、切换到解压后的目录#cd File3、准备编…

git status清空_本地删除文件后,git status会显示红色的那个文件。

知道了&#xff0c;感谢大家&#xff1a;正确答案应该是&#xff1a;$ git rm -r 倒计时rm 倒计时/js/countDown.jsrm 倒计时/倒计时整理.htmlWarning: Your console font probably doesnt support Unicode. If you experience strange characters in the output, consider swi…

Linux导出函数控制,linux 下仅导出指定函数的方法

节整理资料时&#xff0c;发现了这个&#xff0c;是两年前在 LOVEUNIX 上的回帖。自己都忘了&#xff0c;贴在这里做个备份。linux 也有导出文件。不用特定的扩展名&#xff0c;且不是在 gcc 中指定参数&#xff0c;而是在 ld 中。写一个导出符号文件&#xff0c;如 symbol 指定…

idea代码补全声明代码_用了这么多年idea,竟然不知道这些代码补全功能

先上图&#xff0c;不知道大家写代码注意到没&#xff0c;因为也没有人告诉我&#xff0c;网上今天才发现这个技巧&#xff0c;所以推荐给大家&#xff0c;如果你知道&#xff0c;那就路过即可。。。if相关定义一个boolean类型的变量flag和一个String类型的变量name来进行测试。…

网站设计软件linux,ubuntu下的网页设计 网页制作软件工具.pdf

ubuntu下的网页设计 网页制作软件工具.pdfubuntu/linux 下的网页设计网页制作软件工具1. Bluefish 是一个基于Gtk 的 HTML 的编辑器&#xff0c;它支持语法加亮&#xff0c;支持HTML 、CSS 、JAVASCRIPT 、Java server pages (JSP) 、Python 、Perl 、SSI 、PHP 、XML 等语言从…

linux安装python2环境_Python基础手册 2 —— Python 环境搭建(Linux)

一、安装python3.4 (CentOS6.5)这里我们选择python3.4版本&#xff0c;首先是因为python3是python发展的趋势&#xff0c;Python2将在2020年被淘汰。其次Python3拥有更好更简洁的语言设计&#xff0c;同时也是因为后期我们的Django项目1.9.5版本适用于python3.4版本。1、 首先我…

Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制

使用shell脚本实现USB设备的加载与文件复制在Linux操作系统中&#xff0c;如果插入一个USB设备&#xff0c;需要用mount挂载命令才能实现这个设备的加载&#xff0c;下面写一个USB设备挂载与文件复制的Shell程序&#xff0c;程序需求&#xff1a;www.2cto.com1、运行时&#xf…

getbook netty实战_Netty 入门教程

前言Netty是一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Dukes Choice Award&#xff0c;见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户…

linux环型共享内存,Linux system v 共享内存

system v 共享内存#include #include int shmget(key_t key, size_t size, int shmflg);建立&#xff1a;进程与共享内存的关联关系key_t key&#xff1a;16进制的非0数字。一般有两种方式设置它。第一种:调用fotk函数第二种&#xff1a;直接使用IPC_PRIVATE注意&#xff1a;如…

用python画组合图形的面积_实现五边形面积计算

此课程与《清华编程高手.尹成.带你实战python入门》大体相同&#xff0c;只需购买其中的一门课程。本课程由清华大学尹成老师录制&#xff0c;课程的特色在于讲解原理的同时引入了每个程序员都热衷的黑客技术。python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对…

linux代码段映射,bss,data,text,rodata,堆,栈,常量段与其各段在物理存储中关系

本文想从linux出发【目前还想可不可以从51单片机出发】&#xff0c;解答程序代码和各种数据结构是如何存储(映射)到存储区的。目前未完成整理&#xff0c;还是初稿的想法。bss段&#xff1a;BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英…

python求123逆序数_应用Python来计算排列中的逆序数个数

在一个排列中&#xff0c;如果一对数的前后位置与大小顺序相反&#xff0c;即前面的数大于后面的数&#xff0c;那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说&#xff0c;对于n个不同的元素&am…