图的结构很简单,就是由顶点V集和边E集构成,因此图可以表示成:G=(V,E)。
子图是一个图中的一部分,其可以表示为:
如何判断某子图是频繁子图?
支持度:给定图的集族ς, 子图g的支持度定义为包含它的所有图所占的百分比。
有了支持度的定义就可以计算某子图在图集中的占比,如此便可来规定频繁子图。
对频繁子图的搜索与查找也就称之为频繁子图挖掘。频繁子图挖掘(frequent subgraph mining) :
给定集合 ς 和支持度阈值 minsup,频繁子图挖掘的目标是找出使得所有 s(G) ≥ minsup 的子图G。
目前常用的两种频繁子图挖掘的算法为 Apriori 与 gSpan。接下来将分别介绍无向有权图的 Apriori 与 gSpan算法。
Apriori algorithm是关联规则里一项基本算法。由Rakesh Agrawal 在 1994年提出的,详细的介绍来自于《Fast Algorithms for Mining Association Rules》。
关联规则形如“如果…那么…(If…Then…)”,前者为条件,后者为结果。
关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物篮分析 (market basketanalysis)。
例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。这其中最有名的例子就是"尿布和啤酒"的故事了。
假设有如下表的购买记录
按照关联规则进行整理得到下表:
置信度:置信度表示了这条关联规则有多大程度上值得可信。
设条件的项的集合为A,结果的集合为B。
置信度计算在A中,同时也含有B的概率,即Confidence(A==>B)=P(B|A)。
例如计算“如果Orange-juice则Coke”的置信度。由于在含有Orange-juice的4条交易中,仅有2条交易含有Coke,其置信度为0.5。
支持度:支持度计算在所有的交易集中,既有A又有B的概率。 Support(A and B)=P(AB)
例如在5条记录中,既有Orange-juice又有Coke的记录有2条。则此条规则的支持度为2/5=0.4。
现在这条规则可表述为,如果一个顾客购买了Orange-juice,则有50%的可能购买Coke 。而这样的情况(即买了Orange-juice会再买Coke )会有40%的可能发生。
在候选产生阶段,合并 (k-1) 子图为 k 子图,首要问题是如何定义子图的大小 k。
通过添加一个顶点,迭代地扩展子图的方法称作顶点增长(vertex growing)。
k 也可以是图中边的个数,添加一条边到已有的子图中来扩展子图的方法称作边增长(edge growing)。
为了避免产生重复的候选,我们可以对合并施加条件:两个 (k-1) 子图必须共享一个共同的 (k-2) 子图,共同的子图称为核(core)。
由此,产生了两种子图候选产生的方法:
通过添加一个新的结点到已经存在的一个频繁子图上来产生候选。可以使用邻接矩阵来表示图,每一项M(i, j)为链接vi和vj的的边或者0。
边增长将一个新的边插入到一个已经存在的频繁子图中。
与顶点增长不同,结果子图的顶点个数不一定增长。
边增长合并过程:一个频繁子图 g1 和另一个频繁子图 g2 合并,仅当从 g1 删除一条边后得到的子图与从 g2 中删除一条边后得到的子图的拓扑等价,合并后的结果是 g1 添加 g2 那条之外的边。
候选剪枝需要剪去(k-1)子图非频繁的候选。可以通过以下方式实现:相继从 k 子图中删除一条边,并检查得到的(k-1) 子图是否连通且频繁。如果不是,则该候选 k 子图可以丢弃。意思是一次删除一条,总共有 k 个子图要检测。
为了检查(k-1)子图是否频繁,需要将其与其他的(k-1)子图匹配,此时需判定两个图是否拓扑等价,即处理图同构的问题。
当我们剪枝完成之后,将剪枝后剩余的候选图进行支持度计算,将其中大于支持度阈值的候选图记为满足条件的频繁子图。
对于所有频繁的候选子图,还需要进行图的同构测试,以减除重复的频繁候选子图。
类Apriori方法在每一层频繁子图的挖掘过程中,算法都会产生大量的非频繁的候选子图。
然后对候选的频繁子图执行支持度计数。
对于所有频繁的候选子图,还需要进行图的同构测试,以减除重复的频繁候选子图。
因为图的同构测试是一种NP完全问题,所以对于大规模的频繁子图进行图的同构测试是一个开销很大的过程,甚至是不可能完成的任务。
因此,大量生成的候选子图和图的同构测试的巨大开销是Apriori类方法的性能瓶颈。
gSpan 算法通过执行最右扩展的策略减少了候选子图重复的产生,同时也保证了搜索结果的完备性。
gSpan 算法设计出一种新式的图的规范标号,将图的同构测试与重复图的检测结合到一块,避免了在已经获得的频繁子图集合中搜索重复图。
一个图可能有多个DFS编码。选择其中最小的DFS编码作为唯一编码。例:
比较 g1(X,a,Y)、g2(Y,a,X)与g3(X,a,X)
按照字典序比较字符串(A 则可以得出g3(X,a,X)> g1(X,a,Y)> g2(Y,a,X)
图集中共有14个A顶点,8个B顶点,7个C顶点。15条a边,13条b边,8条c边。
此次得到的结构仅存在于其中的一个图表中,因此将进入下一个增长优先级。
由于v3与v1已经存在连接,故第二优先级不再适用,因此尝试再次从v3增长/延伸,由此可以添加(C,a,B)或(C,c,A)。
这在(G1-G5)的任何图表中都找不到,所以添加(A,c,C)作为最后的尝试
添加(A,c,C)后得到的子图,在(G1-G5)的找不到表明该结构增长终止。
图集中具有相同结构的为:
扩展过程如边(0,1,A,b,B)相同,扩展之后得到的频繁子图为
gSpan算法总的思想大致为,先生成频繁树,再在频繁树的基础上,生成频繁子图,满足最小支持度,满足最小DFS编码的所有频繁子图。
gSpan 算法通过执行最右扩展的策略减少了候选子图重复的产生,同时也保证了搜索结果的完备性。
gSpan 算法设计出一种新式的图的规范标号,将图的同构测试与重复图的检测结合到一块,避免了在已经获得的频繁子图集合中搜索重复图。