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. Linux 磁盘

    一台物理服务器通常有好几块磁盘(/dev/sda,/dev/sdb),每个磁盘上都可以进行分区(例如对sda进行分区操作:fdisk /dev/sda,可以将sda分成sda1,sda2,sda5等分 ...

  2. Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错 转

    转自 https://segmentfault.com/a/1190000005988895 前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为 ...

  3. Selenium+Python定位实例

    常见的定位方式参见:http://www.cnblogs.com/ranxf/p/7928732.html 1.ID定位(find_element_by_id) <input class=&qu ...

  4. Wex5各组件介绍

    1.http://doc.wex5.com/comp-base/ 2.select 组件 http://doc.wex5.com/comps-select/ 3.页面交互以及传递参数  http:// ...

  5. CSS Pseudo-classes(伪类)

    CSS Pseudo-classes(伪类) CSS伪类是用来添加一些选择器的特殊效果. 一.语法 伪类的语法: selector:pseudo-class {property:value;} CSS ...

  6. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  7. 20145335《java程序设计》第5次实验报告

    20145335郝昊实验五 java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145307陈 ...

  8. Zookeeper之基于Observer部署架构

    Observers:在不伤害写性能的情况下扩展Zookeeper 虽然通过Client直接连接到Zookeeper集群的性能已经很好了,可是这样的架构假设要承受超大规模的Client,就必须添加Zoo ...

  9. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  10. C# 人民币转成大写

    /// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="num">金额</ ...