模块度:
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. 社区发现算法原理与louvain源码解析

    前言 社区发现(community detection),或者社区切分,是一类图聚类算法,它主要作用是将图数据划分为不同的社区,社区内的节点都是连接紧密或者相似的,而社区与社区之间的节点连接则是稀疏的 ...

  2. 三维目标检测算法原理

    三维目标检测算法原理 输入输出接口 Input: (1)图像视频分辨率(整型int) (2)图像视频格式(RGB,YUV,MP4等) (3)左右两边的车道线位置信息摄像头标定参数(中心位置(x,y) ...

  3. 视频光流估计综述:从算法原理到具体应用

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:肖泽东 | 来源:知乎 https://zhuanlan.zhihu.com/p/7446034 ...

  4. 【聚能聊有奖话题】今日头条公布算法原理,你认可他们的理念吗?

    本话题地址,参与即可获得礼品: https://yq.aliyun.com/roundtable/63978 11 日,今日头条召开了一场旨在推动整个行业来问诊算法.建言算法的分享交流会.资深算法架构 ...

  5. matlab 投票法_SVM算法原理及其Matlab应用

    <SVM算法原理及其Matlab应用>由会员分享,可在线阅读,更多相关<SVM算法原理及其Matlab应用(18页珍藏版)>请在人人文库网上搜索. 1.SVM 算法及其 Mat ...

  6. 今日头条算法原理(全文)【转】

    原文地址:https://www.toutiao.com/i6511211182064402951/?tt_from=weixin_moments&utm_campaign=client_sh ...

  7. 【阿里云课程】模型设计之动态网络,原理与设计

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 动态网络原理与设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习模型 ...

  8. 深度强化学习落地指南:弥合DRL算法原理和落地实践之间的断层 | 文末送书

    魏宁 著 电子工业出版社-博文视点 2021-08-01 ISBN: 9787121416446 定价: 109.00 元 新书推荐 ????今日福利 |关于本书| 本书从工业界一线算法工作者的视角, ...

  9. Adaboost算法原理分析和实例+代码(简明易懂)

    Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333   ...

  10. 一致性 Hash 算法原理总结

    一致性 Hash 算法是解决分布式缓存等问题的一种算法,本文介绍了一致性 Hash 算法的原理,并给出了一种实现和实际运用的案例: 一致性 Hash 算法背景 考虑这么一种场景: 我们有三台缓存服务器 ...

最新文章

  1. 批量更新日期字段中的年
  2. Http接口开发(自测服务端客户端)
  3. linux运维脚本编写,Linux运维常用shell脚本实例 (转)
  4. Python安装模块出错(ImportError: No module named setuptools)解决方法
  5. WdatePicker控件的使用
  6. smart700iev3 程序下载设置_西门子PLC基础:S7-200 SMART PLC程序下载
  7. 类变量与实例变量辨析
  8. 双口RAM和多模块存储器
  9. lua52 C API测试代码
  10. 基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理
  11. python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例
  12. [转载]程序员如何写出杀手级简历
  13. 序列化和反序列化(json和pickle)day18
  14. 自己编写的Java获取CRC16校验码
  15. latex longtable caption长度提前换行解决方案
  16. seay源代码审计系统的使用方式
  17. 一次性奖励300万?成都市武侯区促进文化产业发展系列政策影视产业专项政策出来了
  18. 浅谈对社会工程学的认识
  19. 安卓圆形头像制作两种方法。
  20. Python爬虫系列之全国邮编区号爬取

热门文章

  1. 人力资源管理系统需求分析说明书
  2. 网页编写练习 小米闪购
  3. html原生js请求
  4. 模拟电路中晶体管阵列的性能感知公共质心布局和布线 ALIGN
  5. linux如何抓包是什么,linux抓包命令是什么
  6. 制作uefi的kali安装盘_制作 UD + EFI + PE + KALI 启动U盘
  7. python封装DM达梦数据库-增删改查
  8. 计算机实验excel总结,EXCEL实验报告
  9. 傲腾会是NAND的接班人么?
  10. android studio 重启adb