Louvain 算法原理 及设计实现
模块度:
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 算法原理 及设计实现相关推荐
- 社区发现算法原理与louvain源码解析
前言 社区发现(community detection),或者社区切分,是一类图聚类算法,它主要作用是将图数据划分为不同的社区,社区内的节点都是连接紧密或者相似的,而社区与社区之间的节点连接则是稀疏的 ...
- 三维目标检测算法原理
三维目标检测算法原理 输入输出接口 Input: (1)图像视频分辨率(整型int) (2)图像视频格式(RGB,YUV,MP4等) (3)左右两边的车道线位置信息摄像头标定参数(中心位置(x,y) ...
- 视频光流估计综述:从算法原理到具体应用
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:肖泽东 | 来源:知乎 https://zhuanlan.zhihu.com/p/7446034 ...
- 【聚能聊有奖话题】今日头条公布算法原理,你认可他们的理念吗?
本话题地址,参与即可获得礼品: https://yq.aliyun.com/roundtable/63978 11 日,今日头条召开了一场旨在推动整个行业来问诊算法.建言算法的分享交流会.资深算法架构 ...
- matlab 投票法_SVM算法原理及其Matlab应用
<SVM算法原理及其Matlab应用>由会员分享,可在线阅读,更多相关<SVM算法原理及其Matlab应用(18页珍藏版)>请在人人文库网上搜索. 1.SVM 算法及其 Mat ...
- 今日头条算法原理(全文)【转】
原文地址:https://www.toutiao.com/i6511211182064402951/?tt_from=weixin_moments&utm_campaign=client_sh ...
- 【阿里云课程】模型设计之动态网络,原理与设计
大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 动态网络原理与设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习模型 ...
- 深度强化学习落地指南:弥合DRL算法原理和落地实践之间的断层 | 文末送书
魏宁 著 电子工业出版社-博文视点 2021-08-01 ISBN: 9787121416446 定价: 109.00 元 新书推荐 ????今日福利 |关于本书| 本书从工业界一线算法工作者的视角, ...
- Adaboost算法原理分析和实例+代码(简明易懂)
Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333 ...
- 一致性 Hash 算法原理总结
一致性 Hash 算法是解决分布式缓存等问题的一种算法,本文介绍了一致性 Hash 算法的原理,并给出了一种实现和实际运用的案例: 一致性 Hash 算法背景 考虑这么一种场景: 我们有三台缓存服务器 ...
最新文章
- 批量更新日期字段中的年
- Http接口开发(自测服务端客户端)
- linux运维脚本编写,Linux运维常用shell脚本实例 (转)
- Python安装模块出错(ImportError: No module named setuptools)解决方法
- WdatePicker控件的使用
- smart700iev3 程序下载设置_西门子PLC基础:S7-200 SMART PLC程序下载
- 类变量与实例变量辨析
- 双口RAM和多模块存储器
- lua52 C API测试代码
- 基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理
- python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例
- [转载]程序员如何写出杀手级简历
- 序列化和反序列化(json和pickle)day18
- 自己编写的Java获取CRC16校验码
- latex longtable caption长度提前换行解决方案
- seay源代码审计系统的使用方式
- 一次性奖励300万?成都市武侯区促进文化产业发展系列政策影视产业专项政策出来了
- 浅谈对社会工程学的认识
- 安卓圆形头像制作两种方法。
- Python爬虫系列之全国邮编区号爬取