模块度:
Louvain算法是一种基于图数据的社区发现算法。原始论文为:《Fast unfolding of communities in large networks》。

算法的优化目标为最大化整个数据的模块度,模块度的计算如下:

其中m为图中边的总数量,k_i表示所有指向节点i的连边权重之和,k_j同理。A_{i,j} 表示节点i,j之间的连边权重。

有一点要搞清楚,模块度的概念不是Louvain算法发明的,而Louvain算法只是一种优化关系图模块度目标的一种实现而已。

Louvain算法的两步迭代设计:
最开始,每个原始节点都看成一个独立的社区,社区内的连边权重为0.
算法扫描数据中的所有节点,针对每个节点遍历该节点的所有邻居节点,衡量把该节点加入其邻居节点所在的社区所带来的模块度的收益。并选择对应最大收益的邻居节点,加入其所在的社区。这一过程化重复进行指导每一个节点的社区归属都不在发生变化。
对步骤1中形成的社区进行折叠,把每个社区折叠成一个单点,分别计算这些新生成的“社区点”之间的连边权重,以及社区内的所有点之间的连边权重之和。用于下一轮的步骤1。
该算法的最大优势就是速度很快,步骤1的每次迭代的时间复杂度为O(N),N为输入数据中的边的数量。步骤2 的时间复杂度为O(M + N), M为本轮迭代中点的个数。
算法实现:
数据结构设计:
算法数据结构的设计主要有两方面的考虑:
1.  如何高效地存储图中的节点和节点之间的关系
2. 如何在设计的数据结构上高效地扫描数据、进行算法迭代。
当前一些开源的算法实现主要通过hash表或set的结构来存储节点和节点之间的关系。
主要有两个缺点:
1.  维护hash 或 集合结构本身就需要不少内存开销
2. 遍历过程中需要不断地创建、销毁、清空对应的Hash 或 Set 结构,尤其是在遍历不同的节点的邻居节点以及社区这点时。
而且,在遍历过程中,结构对元素的访问也并不是严格O(1)的。

出于以上考虑,我们设计一种更高效的数据结构来存储图中的节点和边,避开使用复杂的数据结构,且在算法迭代过程中不申请多余的空间和空间的销毁操作,具体如下:

关于节点字段的说明:
count,   社区内的节点个数

clsid,     节点归属社区的代表节点ID

next,      步骤1迭代中下一个属于同一个临时社区的节点

prev,      步骤1迭代中上一个属于同一个临时社区的节点

first,       属于同一个社区的,除代表节点外的第一个节点,该节点有步骤2 社区折叠的时候生成

kin,         稳定社区内部节点之间的互相连接权重之和

kout,       稳定社区外部,指向自己社区的权重之和

clskin,     临时社区内部节点之间的互相连接权重之和

clstot,      稳定社区所有内外部指向自己的连接权重之和

eindex,    节点邻居链表的第一个指针,该链表下的所有left,都是本节点自己

关于边数据结构的字段就顾名思义即可。

基于上述结构设计,在给定了一个M个节点,N调边的图所需的空间为:60 * M + 24 * N.
例如:给定1000万给点,2000万边的数据,则需要空间约为:10000000 * 60 + 20000000 * 24 = 1080M.且整个迭代过程中内存环境维持不变。

迭代过程:

1, 假设我们最开始有5个点,互相之间存在一定的关系(至于什么关系,先不管),如下:

2, 假设在进过了步骤1的充分迭代之后发现节点2,应该加入到节点1所在的社区(最开始每个点都是一个社区,而自己就是这个社区的代表),新的社区由节点1代表,如下:

此时节点3,4,5之间以及与节点1,2之间没有任何归属关系。

3, 此时应该执行步骤2,将节点1,2组合成的新社区进行折叠,折叠之后的社区看成一个单点,用节点1来代表,如下:

此时数据中共有4个节点(或者说4个社区),其中一个社区包含了两个节点,而社区3,4,5都只包含一个节点,即他们自己。

4, 重新执行步骤1,对社区1,3,4,5进行扫描,假设在充分迭代之后节点5,4,3分别先后都加入了节点1所在的社区,如下:

5, 进行步骤2,对新生成的社区进行折叠,新折叠而成的社区看成一个单点,由节点1代表,结构如下:

此时由于整个数据中只剩下1个社区,即由节点1代表的社区。

再进行步骤1时不会有任何一个节点的社区归属发生变化,此时也就不需要再执行步骤2,至此, 迭代结束。

代码实现及测试:

一个基于上述结构设计的代码实现参见:
https://github.com/liuzhiqiangruc/dml/blob/master/cls/louvain.c

在一个实际的图(70万点,200万边)上进行测试,迭代到完全收敛所需时间为:1.77秒。
实际中往往不需要迭代到每一个点都不发生变化,或者整个图中有多少比例的节点不在发生变化就退出。

Louvain 算法的核心思路以及数据结构(最完善版)相关推荐

  1. 【数据结构与算法】之深入解析KMP算法的核心原理和实战演练

    一.简介 ① 概念 KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 提出的,因此称它为克努特-莫里斯-普拉特操作,简称 KMP 算法. K ...

  2. 家族关系查询系统程序设计算法思路_数据结构课程设计--

    数据结构课程设计-- 家族关系查询系统 课 程 设 计 任 务 书 题目题目 家族关系查询系统家族关系查询系统 主要内容.基本要求.主要参考资料等主要内容.基本要求.主要参考资料等 主要内容主要内容 ...

  3. 【算法特训总结】计算机经典算法的核心思想及独特角度的解读

    计算机经典算法的核心思想及独特角度的解读 在1月1日新年之日开始的"算法特训"(一月一日~二月十日)终于结束了,对于这本<<算法竞赛经典>>,除了第十章(在 ...

  4. 【路径规划】A*算法方法改进思路简析

    A*算法方法改进思路简析 0. 前言 1. A*算法的总体流程 2. A*算法的改进 2.1 启发函数的选择与优化 2.1.1 预估函数的选择 2.1.2 为启发函数增加权重系数 2.1.3 节点比较 ...

  5. labuladong的算法小抄_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  6. 性能优化的核心思路,干货分享

    性能优化核心思路(直播录屏) 一.背景 平时技术交流的时候,很多同学都会问一些性能优化方面的问题. 比如: 有一张订单表为了保持订单记录,更新数据时不能删除,需要打算加上版本号,查询时取版本号最新的给 ...

  7. 从电影《蝴蝶效应》中学习回溯算法的核心思想

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 关注我们丨文末赠书 深度优先搜索算法利用的是回溯算法思想.这个算法思 ...

  8. KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组以及next数组求解

    KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组.我觉得理解KMP的最大障碍就是很多人在看了很多关于KMP的文章之后,仍然搞不懂PMT中的值代表了什么意思.这里 ...

  9. AcWing基础算法课Level-2 第二讲 数据结构

    AcWing基础算法课Level-2 第二讲 数据结构 单链表 AcWing 826. 单链表3453人打卡 双链表 AcWing 827. 双链表2865人打卡 栈 AcWing 828. 模拟栈3 ...

  10. PAKDD2020:阿里巴巴算法大赛冠军思路

    PAKDD2020 阿里巴巴智能运维算法大赛 第一名思路 本篇文章我们介绍刚刚结束的PAKDD2020阿里巴巴智能运维算法大赛的思路以及一些核心内容(以PPT的形式展示了),有兴趣的朋友可以去天池上阅 ...

最新文章

  1. Kubernetes基础与架构
  2. A networkIntegration Approach for Drug-Target interaction Prediction and ComputationalDrug Repositio
  3. 皮一皮:这解释...没毛病!
  4. 分享一个超棒的在线jQuery mobile原型设计开发工具 - codiqa
  5. autowired注入为 mapper为null_兰新高铁为区域经济发展注入活力
  6. java logger使用_这才是JAVA中打印日志的正确姿势
  7. 排序算法(3)----归并排序
  8. Linux 安装 Pycharm
  9. Symbol'' has different size in shared object,consider re-linking
  10. js 链接websocket马上断开_SpringBoot+WebSocket实现简单的数据推送
  11. 销售99绝招 成功没商量
  12. 现在有什么好用的切换ip工具吗?
  13. Scala(第五节)actor并发编程、文件操作和网络请求、隐式转换和隐式参数、Akka并发编程、Akka模拟简易Spark通信
  14. JTT808、JTT1078、TJSATL主动安全踩坑记录
  15. html轮播图片在线制作,如何制作图片轮播?轮播图在线制作技巧
  16. 微信停止为苹果服务器,苹果手机终于解决了微信延迟
  17. Gitter---高颜值GitHub小程序客户端诞生记,2021年安卓社招面试题精选
  18. C语言高级教程-C语言数组(六):变长数组
  19. 【基础代码】python 一些常用的基础代码
  20. 微信视频号怎么查看浏览历史记录

热门文章

  1. SVPWM matlab建模
  2. 西门子STEP7-200PLC的顺序控制编程
  3. 关系传递闭包Warshall算法之思想的一种解说
  4. 科比职业生涯数据分析
  5. MPC5744P-时钟模块
  6. Go语言实战+code
  7. Translation 谷歌翻译失效问题
  8. 《流程的永恒之道:工作流及BPM技术的理论、规范、模式及最佳实践》书籍导读
  9. 打算开源一个低代码平台,第三天,包含【工作流,业务流,财务,APQC】。技术站 React,typescript,java,mysql
  10. 韩顺平 java 坦克大战_Tankgame 韩顺平版本的坦克大战,详细包括源代码,素材以及对应文件 Java Develop 263万源代码下载- www.pudn.com...