社区划分问题大多基于这样一个假设:同一社区内部的节点链接较为紧密,社区之间的节点链接较为稀疏。所以,社区发现本质上就是网络中结构紧密的节点的聚类。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的算法步骤:
五、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 (介绍了各类社区聚类的算法)