社区发现算法之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 ΔQ)纳入到社团中,收敛后再对每个社团压缩成单节点再次重复上述过程直至全局稳定,从而实现最大化全图的模块度

  • 模块度计算:一般认为,全图模块度超过0.3就能产生比较好的划分效果

    Q = 1 2 m ∑ i , j [ A i j − k i k j 2 m ] δ ( c i , c j ) Q = \frac 1{2m} \sum\limits _{i,j} [A_{ij} - \frac {k_ik_j}{2m}] δ(c_i,c_j) Q=2m1i,j[Aij2mkikj]δ(ci,cj)

  • 算法流程:

    • 1.初始化,每个节点都是一个社团
    • 2.模块化(Community Merging),每个节点依次将所有相邻节点合并,计算模块度增益,存在则纳入社团
    • 3.重复步骤2,直至所有社团稳定
    • 4.社团压缩(Graph Reconstruction),将每个社团视为一个节点,重新计算社团内与社团间权重
    • 5.再次模块化(Community Merging),直至压缩后的社团稳定,算法结束
  • 算法优势:

    • 1.计算复杂度低,收敛速度快
    • 2.适用大型网络/图,尤其是稀疏网络,可带权
    • 3.稳定性与算法效率平衡较好
    • 4.算法成熟应用广泛,Python等语言均有稳定算法包可供直接调用
  • 算法劣势:

    • 1.不适用于稠密图,算法收敛慢
    • 2.使用贪婪思想,容易产生过拟合,陷入局部最优
    • 3.无权图可能不稳定,如果有多个最大增量为正且相同的社团可加入,如果随机选择加入会导致社团不同
  • 算法演示:每一阶段都由两步组成,一是通过只允许社区的局部变化来优化社团,一是聚合找到的社团以建立一个新的社团;迭代地重复这些遍,直到不能再增加模块度为止
    社区发现算法之Louvain原理与实践_第1张图片

  • 本人算法能力有限,大家可以看看通俗易懂的这篇原理解读

算法应用

  • Python调包侠,可以看看这个
  • 保证算法的有效落地,得到一个还不错的模块度要做的工作不止算法实现与调优这么简单
    • 最重要的是业务抽象,设计业务模型建立社区网络,能理解输出的社团如何解释,这样才能开展模型调优
    • 数据模型也很重要,网络节点成员准入规则、数据结构设计、权重分配、关系选取等直接决定了算法质量,这是一个反复选取衡量调整的过程
    • 数据嗅探、清洗、降噪等数据治理也是必不可少的

实践与反思

  • 个人举例,实践中通过核心成员选举提高社区网络准入门槛以及权重分配,小范围试验了多轮确定了较优的权重配比,上线后在一万节点,1.8万关系中跑出了0.5的模块度,经过人为抽样判断,得到了还算不错的团伙挖掘效果
  • 从结果来看还算不错,实践过程中还是有东西值得进一步思考的
    • 1.业务模型头等重要,社区发现作为较成熟的领域就不要寄过多希望于算法准确性提升,因为那是有限的,在项目工期有限的情况下根据团队能力选取开源、容易上手、稳定性不错的算法更重要,良好的业务模型也会得到解释性强的结果
    • 2.领域知识(Domain Knowledge)是建立业务模型的前提,要深入了解也要反复确认,从数据科学和从传统业务解决问题的角度很有可能是截然不同的,但这部分是沟通的基础,也就是形成统一语言(Unique Language)
    • 3.确定目标找到侧重点,同样是社区发现,更关注社团的规模组织,还是更关注带有某些特性的社团关系,可能就会走上两条不同的模型构建之路,在茫茫然社群关系网中影响的是一整套模型应用的设计开发工作模式

你可能感兴趣的:(算法,算法,人工智能,机器学习)