社区发现算法之Louvain原理与实践

社区发现

  • 这有一篇有趣的例子解释什么是风控,还有一篇讲风控的使用——如何通过校园卡消费记录识别情侣、基友、渣男和狗

  • 什么是社区发现(Community Detection),简单说就是在一个关系网络(带权无向图)中找到潜在的特定组织结构,那些联系紧密的组织往往具有明显的社群关系,挖掘社群关系是社区发现的价值所在

  • 作为风控的重要研究对象,社区发现在社交、金融、心理、公安等各个领域开花结果,之前有幸主导过一个借助社区发现构建评价指标体系来预测某行业团伙挖掘模型应用的设计开发,本文给社区发现做个导航

模块度

  • 社区发现的最终目标就是对社区网络进行社团(community)或块(cluster)划分,社区/块内部关系越紧密、外部关系越稀疏(内紧外松)说明算法效果越好
  • 模块度(modularity)是最常用的度量方法
    • 物理含义是社区内节点的连边数与随机情况下边数之差,取值范围[-0.5, 1)
    • 模块度越接近1,社团/块的划分效果越明显
  • 社区发现算法流派很多,模块度是当下普遍认可的一种衡量标准,而Louvain就是基于模块度优化的启发式社区发现算法

Louvain

算法来源

  • Louvain算法出自比利时鲁汶大学Vincent D. Blondel教授等人2008年发表的论文Fast unfolding of communities in large networks,也称为Fast Unfolding算法,业界则直接取校名称呼该算法

  • 引用论文摘要先简单介绍下该算法:

    We propose a simple method to extract the community structure of large networks. Our method is a heuristic method that is based on modularity optimization. It is shown to outperform all other known community detection method in terms of computation time. Moreover, the quality of the communities detected is very good, as measured by the so-called modularity. This is shown first by identifying language communities in a Belgian mobile phone network of 2.6 million customers and by analyzing a web graph of 118 million nodes and more than one billion links. The accuracy of our algorithm is also verified on ad-hoc modular networks.

  • 大致意思是说:Louvain是一种可以快速提取大型网络中社区结构的算法。这是一种基于模块化优化的启发式方法,当时来说是被证明在所有社区发现算法中平均时间复杂度最低的,用模块度衡量社区发现的质量也很好。不论是在比利时用260万用户通话数据上亿节点十几亿连接来做验证,还是在ad-hoc网络上验证都是没问题的

算法原理

  • 核心思想:遍历网络中所有相邻节点,将可以使模块度增量最大的节点(计算 Δ Q \Delta Q

Louvain算法是一种用于社区发现算法,它的核心思想是将网络划分为不同的社区,使得社区内的节点之间的连接更加紧密,而社区之间的连接更加稀疏。Louvain算法的优点是速度快、可扩展性强,并且能够处理大规模网络。 下面以一个10个节点以内的示例来详细展示Louvain算法的计算步骤。 假设我们有以下这个图: ``` 1 -- 2 -- 3 | | 4 -- 5 6 | | 7 -- 8 -- 9 -- 10 ``` 第一步,将每个节点看做一个社区,并计算每个社区的模块度。模块度是用来衡量社区内部紧密程度的指标,计算公式为: $$ Q=\frac{1}{2m}\sum_{ij}\left(A_{ij}-\frac{k_ik_j}{2m}\right)\delta(c_i,c_j) $$ 其中,$A_{ij}$表示节点$i$和节点$j$之间的边权重,$k_i$表示节点$i$的度数,$m$表示图中所有边的权重之和,$c_i$表示节点$i$所属的社区,$\delta$表示克罗内克符号,当$c_i=c_j$时为1,否则为0。 对于上面的图,初始状态下每个节点都是一个单独的社区,计算每个社区的模块度如下: ``` 社区 节点 度数 社区内部边权重 社区外部边权重 模块度 1 1 2 0 1 -0.25 2 2 3 1 1 0 3 3 2 0 1 -0.25 4 4 2 1 1 0 5 5 3 2 1 0.25 6 6 1 0 1 -0.25 7 7 2 1 1 0 8 8 3 2 1 0.25 9 9 3 2 0 0.333 10 10 1 0 1 -0.25 ``` 第二步,将每个节点按照其邻居节点所在的社区进行重分配,计算每个新的社区的模块度。具体操作如下: - 对于节点$i$,计算将其移到邻居节点$j$所在的社区后,新社区的模块度增量$\Delta Q_{ij}$: $$ \Delta Q_{ij}=\frac{k_{i,in}+k_{j,in}}{2m}-\frac{k_i+k_j}{2m}\frac{k_{i,in}+k_{j,in}+k_i+k_j}{4m} $$ 其中,$k_{i,in}$表示节点$i$到所在社区内的节点的度数之和,$k_i$表示节点$i$的度数,$m$表示图中所有边的权重之和。 - 将节点$i$移到能够使$\Delta Q_{ij}$最大的邻居节点$j$所在的社区。 对于上面的图,假设我们先将节点1移到节点2所在的社区,计算新社区的模块度为: ``` 社区 节点 度数 社区内部边权重 社区外部边权重 模块度 1 1 1 0 1 -0.125 2 2 5 2 2 0 3 3 2 0 1 -0.25 4 4 2 1 1 0 5 5 2 1 2 -0.125 6 6 1 0 1 -0.25 7 7 2 1 1 0 8 8 3 2 1 0.25 9 9 3 2 0 0.333 10 10 1 0 1 -0.25 ``` 接着我们将节点2移到节点5所在的社区,计算新社区的模块度为: ``` 社区 节点 度数 社区内部边权重 社区外部边权重 模块度 1 1 1 0 1 -0.125 2 2 3 1 1 0 3 3 2 0 1 -0.25 4 4 2 1 1 0 5 5 4 3 0 0.5 6 6 1 0 1 -0.25 7 7 2 1 1 0 8 8 3 2 1 0.25 9 9 3 2 0 0.333 10 10 1 0 1 -0.25 ``` 以此类推,直到无法继续增加模块度为止。 第三步,将第二步中得到的新社区看做节点,重复进行第二步的操作,直到模块度不再增加为止。最终得到的社区划分如下: ``` {1, 4, 7, 10}, {2, 5}, {3, 6}, {8, 9} ``` 至此,Louvain算法的计算步骤就介绍完了。值得注意的是,Louvain算法并不是一定能够得到最优的社区划分,但是它在速度和可扩展性方面有很大的优势。 具体数学推演过程比较复杂,此处不再展开,可参考相关文献进行深入了解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值