GSpan频繁子图挖掘算法,网上有很多相关的介绍,中文的一些资料总是似是而非,讲的不是很清楚(感觉都是互相抄来抄去,,,基本都是一个样,,,),仔细的研读了原论文后,在这里做一个总结。

1. GSpan频繁子图挖掘算法:

总的思想是,先生成频繁树,再在频繁树的基础上,生成频繁子图,满足最小支持度,满足最小DFS编码的所有频繁子图。

GraphGen.

输入:图集 GD,最小支持度阈值 min_sup;

输出:频繁子图集合 FG.

(1)     扫描图集并找到图集 GD 中所有频繁边;

(2)     删除所有非频繁边;

(3)     E→{GD中所有频繁边};

(4)     将 E 中的边按 DFS 编码顺序(后文中有介绍)和频率的降序进行排列;

(5)    T→NULL; /*T为频繁子树集合*/

(6)     t→e1; /*E中的第 1 条边作FTGen的初始值*/

(7)     FTGen(D,t,E,T); /*频繁树生成算法*/(后文中有介绍)

(8)     将集合 T 中的元素按节点数与 DFS 编码顺序进行排序;

(9)     FG→T;

(10)  for T 中的每棵树

(11)         g→t;

(12)         E‘{e频繁边,且 e 内边(后文中有介绍),并能在图集中找到(g<>e)};

(13)         for E' 中的每条边

(14)               E' →E‘ - e;

(15)                       g→g<>e;

(16)                       if g ≠ min(g) then break;

(17)                       if FG中无 g 的同构子图 then FG <— FG‘ ∪ g;

(18)             endfor;

(19)    endfor;

(20)    return FG;

GraphGen 分为 3 个部分,算法 2 给出了这种算法的细节.

算法在第 1 部分(第 1 行~第 6 行)对图集 GD进行预处理.作为图挖掘的基础,必须从图集中提取出必要的 信息,如频繁边集、频繁节点集等.在这一部分中,GraphGen 扫描图集 GD并得到频繁边集,将频繁边集按频率递 减与 DFS 编码值递增的顺序进行排列,供算法进一步计算。

算法在第 2 部分(第 7 行)进行频繁子树的挖掘工作,具体的挖掘过程后面的频繁树生成算法。

算法的第 3 部分(第 8 行~第 19 行)是由树向图的扩展过程.针对每一棵频繁子树,从频繁边集中找出能与之 联接的内边,逐一加入到该树,从而形成频繁子图.算法在第 12 行找到所有能与图 g 联接的频繁内边,并将这些 边在第 13 行~第 17 行的子循环中加入到图 g 中.算法的执行结果为频繁子图集合 FG。

与FTGen相似,算法GraphGen主体的时间复杂性也分为两部分:一部分是子图同构的时间复杂性.由于子图 同构的测试是NP完全问题,算法在第 17 行进行的图同构测试,其时间复杂性为O(2n);另一部分是扩展边的时间 复杂性.由于我们仅向频繁图中加入内边,通过两层循环完成,因此,这部分时间复杂性为O(n2).边的每一次扩展, 都需要检验所生成的图是否与结果集的元素重复,因此,算法总的时间复杂性为O(2n·n2)。

2. 算法 2. FTGen.频繁子树生成算法

输入:图集 GD,频繁子树 t,频繁边集 E;

输出:频繁子树集 T.

(1)      if t ≠ min(t) then return; /*检查 t 是否具有最小 DFS 编码*/(后文中有介绍)

(2)        E‘ <— {e是频繁外边};

(3)     for E‘ 中的每条边

(4)           E‘ <— E‘ e;

(5)           if (t<>e)存在于图集中;

(6)           then t <— t<>e;

(7)           if (T中无 t 的同构子树) then T<—T∪ t;

(8)                FTGen(GD,t,E,T);

endfor;

3. 定义:外边,内边:

在图的扩展过程中,如果一条扩展边引入了一个新的节点,则称该扩展边为外边,由eo表示.若该扩 展边未引入新的节点(扩展边的两个节点已存在于该图中),则称其为内边。

4. 定义:最小DFS编码:

4.1 什么是DFS编码?

对图进行深度优先遍历

  所有节点根据发现时间排序

  最后发现的节点叫做最右节点

  从第一个节点到最右节点的直线路径叫做最右路径

  所有边表示为五元组(i,j,ni,lij,nj)

  前向边i<j

  后向边i>j

  边的排序:e1<e2, if

  同是前向边,且j1<j2

  同是后向边,且i1<i2或者i1=i2&& j1<j2

  e1是前向边,e2是后向边,且j1<=i2

  e1是后向边,e2是前向边,且i1<j2

  根据边的次序得到的边序列是图的DFS编码

eg:

最小DFS编码:

eg:

4.2 DFS编码树:

4.3 DFS树的剪枝:

剪枝后的所有生成树,DFS编码最小的就是最小DFS编码树。

GSpan-频繁子图挖掘算法的更多相关文章

  1. 静态频繁子图挖掘算法用于动态网络——gSpan算法研究

    摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...

  2. 【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

    今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6 ...

  3. 频繁项挖掘算法Apriori和FGrowth

    一:背景介绍 最近在公司用spark的平台做了一个购物车的推荐,用到的算法主要是FGrowth算法,它是Apriori算法的升级版,算法的主要目的是找出频繁进行一起购买的商品.本文主要介绍两个算法的背 ...

  4. 频繁模式挖掘 Apriori算法 FP-tree

    啤酒 尿布 组合营销 X=>Y,其中x属于项集I,Y属于项集I,且X.Y的交集等于空集. 2类算法 Apriori算法 不断地构造候选集.筛选候选集来挖掘出频繁项集,需要多次扫描原始数据.磁盘I ...

  5. 八、频繁模式挖掘Frequent Pattern Mining

    频繁模式挖掘(Frequent Pattern Mining): 频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题.建议用户参考维基百科的association r ...

  6. 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比

    最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...

  7. 关联规则挖掘算法之Apriori算法

    Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集. 关于这个算法有一个非常有名的故事:"尿布和啤酒".故事是 ...

  8. 频繁模式挖掘中Apriori、FP-Growth和Eclat算法的实现和对比(Python实现)

    最近上数据挖掘的课程,其中学习到了频繁模式挖掘这一章,这章介绍了三种算法,Apriori.FP-Growth和Eclat算法:由于对于不同的数据来说,这三种算法的表现不同,所以我们本次就对这三种算法在 ...

  9. 频繁模式挖掘apriori算法介绍及Java实现

    频繁模式是频繁地出如今数据集中的模式(如项集.子序列或者子结构).比如.频繁地同一时候出如今交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B) ...

随机推荐

  1. 【android】activity、fragment传值例子

    1:Activity篇 1.1向Activity传值 关键点在于putExtra.如果传递类的话,记得类实现Serializable接口 Intent intent = new Intent(Firs ...

  2. sqoop命令,mysql导入到hdfs、hbase、hive

    1.测试MySQL连接 bin/sqoop list-databases --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ...

  3. Oracle中用触发器实现自动记录表数据被修改的历史信息

    oracle中用触发器实现自动记录表数据被修改的历史信息. 有一些比较重要的表字段每次修改需要做历史记录,以后可以查询这个表中某些字段如何被修改过.由什么改成了什么等,由谁操作,操作时间等. 实例:1 ...

  4. Eclipse配置多个jdk

    Eclipse配置多个jdk 步骤: 1,打开windows > Preferences: 2,点击“Add”,新增jdk,选择“Standard VM”: 3,下一步,选择对应版本的jer: ...

  5. datanode扩容步骤

    新扩容机器规划: hostname ip 进程 slave3 10.183.225.167 datanode,nodemange 1. 修改/etc/hosts 增加新扩容机器的hostname 10 ...

  6. 20145329 《Java程序设计》实验二总结

    实验指导教师:娄嘉鹏老师 实验日期:2016.4.12 实验时间:15:30~17:30 实验序号:实验二 实验名称:Java面向对象程序设计 实验目的与要求: 1.初步掌握单元测试和TDD 2.理解 ...

  7. 20145240《网络对抗》Web基础

    Web基础 实验后回答问题 什么是表单? 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域 ...

  8. Hue的安装与部署

    Hue的安装与部署 hadoop hue Hue 简介 Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是 ...

  9. RestTemplate请求https忽略证书认证

    RestTemplate是Spring提供的用于访问Rest服务的客户端,提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.RestTemplate 默认使用J2SE提供的方式( ...

  10. 【Python】@staticmethod和@classmethod的作用与区别

    前言 Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法.而使用@static ...