Part 01、社区发现简介
复杂网络是由大量的网络节点以及节点之间错综复杂的链接关系所形成的一种网络结构。生活中所接触到的许多自然、科学、社会关系和基础设施系统可以用复杂网络建模表示,如电力系统、社交网络、通信网络、交通网络等。用数学的语言来表述,复杂网络就是一个有着足够复杂的拓扑结构特征的图。
图1 各类复杂网络将现代社会中的人与人、人与物相联结
复杂网络中总是能够被进一步划分为各种各样的社区。所谓社区,就是一种网络中特殊的子图结构,在拓扑结构上表现为:社区成员内部紧密连接,但与网络其余部分的连接较为稀疏。社区发现算法能够用于在复杂网络中揭示社区结构,是一种能够在微观视角对网络进行分析的新颖工具。因此,目前各种互联网企业中都广泛使用社区发现算法辅助研究人员理解复杂网络中的信息,在社交网络分析、推荐系统、风控等领域都能够见到它的身影。无论是基于社交网络数据的抖音用户风控、QQ/微博的好友推荐,还是基于真实世界数据的城市交通流量预测、电网负荷分析,这些应用的背后都离不开社区发现算法的驱动。
Part 02、常用社区发现技术
社区检测是一个丰富且极具挑战性的问题,部分原因是社区的定义仍然没有明确的描述。在图论中,社区被定义为不重叠的节点组,且组内的边连接远多于组间的边。但是这个定义仍然留下了许多可能性,相应地也有许多基于不同领域学说的计算方法被提出。
- 基于优化的方法
最常见的是基于优化的方法,贪婪算法、模拟退火算法、Louvain算法、PSO算法、进化多目标优化算法等均属于此类。一种典型的优化方法首先需要建立一种社区质量评分标准,能够通过判断子图结构和社区定义的接近程度来分配对应的分数;再利用贪婪/分布迭代等算法搜索网络中每个可能的社区划分,记录并输出得分最高的划分结果。目前有众多的社区质量函数被提出,其中应用最为广泛的是模块度(Modularity)质量函数,模块度将社区评分定义为组内边的连接数量与随机网络中期望数量的差值。
- 基于统计推断的方法
另一种在近年来引起了广泛关注的方法是基于统计推断的社区发现方法。这类方法将社区视为网络结构的主要驱动因素,而非一种孤立的特征,认为节点之间的连接概率与它们所属的社团是否相关有着密切联系,类似于社交网络中有相似兴趣的人之间更容易产生链接。
通过利用随机块模型(SBM)等概率模型,基于统计推断的方法能够利用现有的社区划分计算各节点间边分布的概率,进而重新生成图的链接结构。该方法认为,若由这种方式重新生成的图结构和原始图结构的相似程度越高,则社区划分的质量越高。
- 基于随机游走的方法
随机游走可以通过在节点之间随机跳转,获得图中节点与节点之间的共现关系,以检测图中的社区结构。由于网络社区之间通常只有稀疏的连接,跳转到的节点往往处于同一社区的内部,因此可以利用该方法自底向上地合并不同的节点组以生成社区。游走的关键在于下一跳节点的选择,根据所应用的场景和数据特征的不同,需要不同的策略进行处理,常见的游走策略包括uniform、frequency、markov等。
这种方法的一个很好的特性是,我们不需要实际执行任何随机游走来计算信息:无限长的随机游走会收敛到一个固定的概率值的熵的封闭表达式,我们可以直接使用它作为社区检测的质量函数。
上述方法所涉及的学科、领域各不相同。由于篇幅原因,这里节选出Louvain算法—— 一种基于优化的社区发现方法来进行相对详细的学习。
Part 03、Louvain——基于模块度最优化的方法
上一节中提到,基于优化的方法需要通过社区质量函数来评估子图结构和社区定义的接近程度,而目前应用最为广泛的质量函数是模块度(Modularity),Louvain算法正是基于模块度来进行社区发现的。因此我们先对模块度的定义进行简要介绍。
Newman等人提出了模块度(modularity)的概念,用来衡量社区划分的好坏,公式如下:
其中表示图节点和节点之间边的数目,表示图中边的个数,表示节点的度,表示边随机放置的情况下,节点和之间边数量的期望值。
因此可以将模块度简单理解为:在社区内部的边的比例,减去边随机放置时社区内部期望边数的比例,除以某个常数后所得到的值。如果一个社区划分算法能够尽可能多的将连接比较稠密的点划分在相同社区中,而尽量减少社区之间的连接,这样就能得到较高的模块度评分。
可以通过下面的Python Demo简单的计算网络划分的模块度:
import networkx as nx
# G1为原始图,G2为划分后的图,均用networkx.graph来表示
def Modularity(G1,G2):
m=len(G1.edges())
Aab=0
Q=0.0
for a in G1.nodes():
for b in G1.nodes():
if nx.has_path(G2,a,b):
Aab=0
if b in G1.neighbors(a):
Aab=1
Q=Q (Aab*m*2-nx.degree(G1,a)*nx.degree(G1,b))/(4*m*m)
return Q
Louvain算法则是由Blondel等人提出的基于模块度的社区发现算法。可以将整个算法分为两个阶段:
模块度优化阶段——每个节点自身作为自己的社区标签,此时网络中的社区数和结点数一致。计算此时图划分的模块度作为基准,然后逐个尝试改变图中某一个节点的社区标签,将其更新成邻居节点的社区标签,计算此时的模块度与基准值的差距,记为当前划分下的模块度增量。选出能够使得模块度增量最大的网络划分。
网络凝聚阶段——将上个阶段划分出来的每个社区合并为一个新的超级节点,节点的边权重为原始社区中所有节点的边权重之和,构建一个新的网络。
Louvain算法不断在1,2两个阶段之间迭代,直到模块度增量为负时停止;此时的社区划分即为算法的输出。
Part 04、展望
总的来说,CAT作为综合性的平台,提供的监控功能较为全面;Zipkin是由Twitter开源的调用链分析工具,非常轻量,使用部署简单;Pinpoint和SkyWalking都专注于链路和性能监控,追踪数据粒度较细、用户界面功能强大。随着信息技术的发展和工业互联网的广泛应用,生活中能够接触到的复杂网络结构越来越多,比如交通网络、金融网络、通信网络、输电网络等等。通过在后端对这些网络中蕴含的信息进行分析预处理,为用户提供更贴心、智能的服务成为了信息时代的新兴增长点。作为国内领先的电信运营商,中国移动必将能够依靠广泛且先进的网络基础设施,为城市服务数字化和智能化贡献力量。
参考文献
[1] Fortunato S, Newman M E J. 20 years of network community detection[J]. Nature Physics, 2022: 1-3.
[2] Newman M E J, Girvan M. Finding and evaluating community structure in networks[J]. Physical review E, 2004, 69(2): 026113.
[3] Blondel V D, Guillaume J L, Lambiotte R, et al. Fast unfolding of communities in large networks[J]. Journal of statistical mechanics: theory and experiment, 2008, 2008(10): P10008.