图计算:社区发现算法

  社区划分问题大多基于这样一个假设:同一社区内部的节点链接较为紧密,社区之间的节点链接较为稀疏。所以,社区发现本质上就是网络中结构紧密的节点的聚类。html

  从这个角度来讲,这跟聚类算法同样,社区划分问题主要有两种思路:算法

           (1)凝聚方法(agglomerative method):添加边网络

    (2)分裂方法(divisive method):移除边函数

  另外一方面,咱们也能够认为同一个社区内的节点,之因此可以汇集在一块儿,是由于它们有类似性。所以只要咱们可以将一个节点很好地表示,成为一个向量,那么一样能够用类似性大法来寻找社区汇集,不过这点上须要向量对节点的描述足够好和足够完备。google

  GN算法听说是社区发现领域的第一个算法,或者说它开启了这个领域的研究。下面咱们来分别介绍这个领域及其算法是如何演化的。spa

一、GN算法.net

  基本思想:vagrant

    在一个网络之中,经过社区内部的边的最短路径相对较少,而经过社区之间的边的最短路径的数目则相对较多。htm

  边介数(betweenness):blog

    网络中任意两个节点经过此边的最短路径的数目。

  算法过程:

    (1)计算每一条边的边介数; 
    (2)删除边界数最大的边; 
    (3)从新计算网络中剩下的边的边阶数;
    (4)重复(3)和(4)步骤,直到网络中的任一顶点做为一个社区为止。

  GN算法是一个基于删除边的算法。这种算法相似于分裂同样,把一个大的网络,以边介数为衡量,去不断删除边,以实现网络分裂。这种方法的缺点:(1)计算复杂度高,在每次删除边了以后都会重复计算剩余节点的边介数;(2)算法的终止条件缺少一个衡量的目标,不能控制最后能够分裂成多少个社区;

                                                    

  如上图所示,GN算法至关因而一棵自顶向下的层次树,划分社区就是层次分裂的过程。

  解决的办法:

    引入模块度Q,模块度是用来衡量社区划分好坏的程度的概念。除此以外,我以为基本上整个算法的思想都反过来了,再也不是从顶层分裂,而是从底层合并聚类,直到最终造成一个大的网络。每次是根据计算合并后使得模块度Q的增量最大的社区进行合并,直到收敛。也就是说,是基于增长边而不是删除边了。这种引入模块度Q来度量社区划分质量的思想,有点像梯度降低算法,是经过迭代计算来得到定义的目标函数的最优解的。

 

二、Label Propagation

  标签传播算法也是一种自底向上的迭代算法。

  初始的时候对每个节点给一个类别,之后每次迭代,对于每一个节点,将与它相连的邻居里面数量最多的类别做为这个节点的新类别。直到整个网络的节点类别都再也不变化为止。

  标签传播算法(label propagation)的思想基于:类似的数据应该具备相同的label。其具体实现包括两大步骤:1)构造类似矩阵;2)勇敢的传播吧。

 

  有向图的Label Propagation算法:

    将有向图转换成无向图,使得节点之间的关系带权重。

   具体是构造一个转移几率矩阵P,以及一个节点的分类标签矩阵F。而后计算 F=PF。

 三、随机游走算法

  随机游走算法的“随机”是指:以相同的几率来从一个顶点移动到另外一个顶点。或者说,以某一个定义好的几率做为转移几率,以“移动”的概念,比喻节点的状态的改变。网络图中的每个节点表明一种状态,不一样状态之间转移的几率为:,其中A是邻接/类似度矩阵,D是度矩阵,di是节点i的度。t 步随机游走从 i 到 j 的几率是 Pij 的t次幂,表示为Ptij

  随机游走中的一个经典算法,叫作WalkTrap算法。

  定义一些距离:

  (1)定点i和j的距离:   (由转移几率的定义获得)

  (2)社团C到点j的距离:

  (3)社团C1到C2的距离:  (由(1)(2)式获得)

 

   算法步骤:
  Step1 每个点当作一个社区,计算相邻的点(社团)之间的距离
  Step2 选取使得下式最小的两个社团C1和C2 合并为一个社团,

  

  重复这一步骤直到全部点合并为一个社团。

  随机游走算法尽管速度快,可是效果并不太理想(为何?)。

 

四、FastUnfolding

  不论是GN算法、LPA仍是随机游走,它们都有一个缺点,就是没有一个明确的量化指标用来衡量算法对社区划分的好坏。也就是说,不知道运算到什么程度了就是最好的结果。好比GN算法,是自顶向下的分裂,那么分裂到什么程度了就能够中止了呢?再好比LPA,迭代多少次中止才最好呢,当图中有一些异常的节点或者特殊的节点时,会不会致使标签一直震荡,以致最后难以获得最优解?为了使得社区划分算法有一个可衡量的标准,提出了“模块度”的概念。

  FastUnfolding就是一种基于模块度的,自底向上汇集的社区划分算法。

  FastUnfolding的算法步骤:

  1. 初始化,将每一个点划分在不一样的社区中;
  2. 对每一个节点,将每一个点尝试划分到与其邻接的点所在的社区中,计算此时的模块度,判断划分先后的模块度的差值ΔQ是否为正数,若为正数,则接受本次的划分,若不为正数,则放弃本次的划分;
  3. 重复以上的过程,直到不能再增大模块度为止;
  4. 构造新图,新图中的每一个点表明的是步骤3中划出来的每一个社区,继续执行步骤2和步骤3,直到社区的结构再也不改变为止。

 

五、BGLL算法

  是基于模块度Q的两次启发式迭代算法。外层是凝聚法,内层是凝聚+节点置换,克服了简单凝聚法中两个节点一旦合并就没法分开的问题。 

 

六、谱聚类

 

七、其余的各类聚类算法

 

参考:http://blog.csdn.net/aspirinvagrant/article/details/45599071 (GN算法)

   http://blog.csdn.net/google19890102/article/details/48660239  (FastUnfolding算法)

     http://blog.csdn.net/google19890102/article/details/51558148   (Label Propagation 算法)

   http://www.cnblogs.com/tychyg/p/5277137.html  (介绍了各类社区聚类的算法)

相关文章
相关标签/搜索