Louvain算法介绍

article/2025/9/27 22:10:40

Louvain算法
一种基于模块度的图算法模型,与普通的基于模块度和模块度增益不同的是,该算法速度很快,而且对一些点多边少的图,进行聚类效果特别明显。
算法流程:
1、初始时将每个顶点当作一个社区,社区个数与顶点个数相同。
2、依次将每个顶点与之相邻顶点合并在一起,计算它们的模块度增益是否大于0,如果大于0,就将该结点放入该相邻结点所在社区。
3、迭代第二步,直至算法稳定,即所有顶点所属社区不再变化。
4、将各个社区所有节点压缩成为一个结点,社区内点的权重转化为新结点环的权重,社区间权重转化为新结点边的权重。
5、重复步骤1-3,直至算法稳定。

# coding=utf-8
import collections
import randomdef load_graph(path):G = collections.defaultdict(dict)with open(path) as text:for line in text:vertices = line.strip().split()v_i = int(vertices[0])v_j = int(vertices[1])w = float(vertices[2])G[v_i][v_j] = wG[v_j][v_i] = wreturn Gclass Vertex():def __init__(self, vid, cid, nodes, k_in=0):self._vid = vidself._cid = cidself._nodes = nodesself._kin = k_in  # 结点内部的边的权重class Louvain():def __init__(self, G):self._G = Gself._m = 0  # 边数量self._cid_vertices = {}  # 需维护的关于社区的信息(社区编号,其中包含的结点编号的集合)self._vid_vertex = {}  # 需维护的关于结点的信息(结点编号,相应的Vertex实例)for vid in self._G.keys():self._cid_vertices[vid] = set([vid])self._vid_vertex[vid] = Vertex(vid, vid, set([vid]))self._m += sum([1 for neighbor in self._G[vid].keys() if neighbor > vid])def first_stage(self):mod_inc = False  # 用于判断算法是否可终止visit_sequence = self._G.keys()random.shuffle(list(visit_sequence))while True:can_stop = True  # 第一阶段是否可终止for v_vid in visit_sequence:v_cid = self._vid_vertex[v_vid]._cidk_v = sum(self._G[v_vid].values()) + self._vid_vertex[v_vid]._kincid_Q = {}for w_vid in self._G[v_vid].keys():w_cid = self._vid_vertex[w_vid]._cidif w_cid in cid_Q:continueelse:tot = sum([sum(self._G[k].values()) + self._vid_vertex[k]._kin for k in self._cid_vertices[w_cid]])if w_cid == v_cid:tot -= k_vk_v_in = sum([v for k, v in self._G[v_vid].items() if k in self._cid_vertices[w_cid]])delta_Q = k_v_in - k_v * tot / self._m  # 由于只需要知道delta_Q的正负,所以少乘了1/(2*self._m)cid_Q[w_cid] = delta_Qcid, max_delta_Q = sorted(cid_Q.items(), key=lambda item: item[1], reverse=True)[0]if max_delta_Q > 0.0 and cid != v_cid:self._vid_vertex[v_vid]._cid = cidself._cid_vertices[cid].add(v_vid)self._cid_vertices[v_cid].remove(v_vid)can_stop = Falsemod_inc = Trueif can_stop:breakreturn mod_incdef second_stage(self):cid_vertices = {}vid_vertex = {}for cid, vertices in self._cid_vertices.items():if len(vertices) == 0:continuenew_vertex = Vertex(cid, cid, set())for vid in vertices:new_vertex._nodes.update(self._vid_vertex[vid]._nodes)new_vertex._kin += self._vid_vertex[vid]._kinfor k, v in self._G[vid].items():if k in vertices:new_vertex._kin += v / 2.0cid_vertices[cid] = set([cid])vid_vertex[cid] = new_vertexG = collections.defaultdict(dict)for cid1, vertices1 in self._cid_vertices.items():if len(vertices1) == 0:continuefor cid2, vertices2 in self._cid_vertices.items():if cid2 <= cid1 or len(vertices2) == 0:continueedge_weight = 0.0for vid in vertices1:for k, v in self._G[vid].items():if k in vertices2:edge_weight += vif edge_weight != 0:G[cid1][cid2] = edge_weightG[cid2][cid1] = edge_weightself._cid_vertices = cid_verticesself._vid_vertex = vid_vertexself._G = Gdef get_communities(self):communities = []for vertices in self._cid_vertices.values():if len(vertices) != 0:c = set()for vid in vertices:c.update(self._vid_vertex[vid]._nodes)communities.append(c)return communitiesdef execute(self):iter_time = 1while True:iter_time += 1mod_inc = self.first_stage()if mod_inc:self.second_stage()else:breakreturn self.get_communities()if __name__ == '__main__':G = load_graph(r'C:\\Users\\程勇\\Desktop\\similarity.txt')algorithm = Louvain(G)communities = algorithm.execute()# 按照社区大小从大到小排序输出communities = sorted(communities, key=lambda b: -len(b)) # 按社区大小排序count = 0for communitie in communities:count += 1print("社区", count, " ", communitie)


测试用例文件如图:

在这里插入图片描述

这是部分测试用例的截图,一行的前两个数是顶点编号,第三个数是权重。按照每个社区大小顺序从大到小打印:

在这里插入图片描述

 


http://chatgpt.dhexx.cn/article/hlP43ZBK.shtml

相关文章

Python社区发现—Louvain—networkx和community

社区 如果一张图是对一片区域的描述的话&#xff0c;将这张图划分为很多个子图。当子图之内满足关联性尽可能大&#xff0c;而子图之间关联性尽可能低时&#xff0c;这样的子图可以称之为一个社区。 社区发现算法 社区发现算法有很多&#xff0c;例如LPA&#xff0c;HANP&am…

关于在networkx中使用louvain算法报错的问题

module ‘networkx.algorithms.community’ has no attribute ‘louvain_communities’ Networkx是复杂网络科学中常用的python包&#xff0c;louvain也是常用的社团发现算法之一。在networkx的文档中也有描述。louvain_communities — NetworkX 2.8.5 documentationhttps://n…

【知识图谱】Louvain、LPA等5类经典社区发现算法 Python 实战

一、社区发现概述 根据图论&#xff0c;加权网络表示为&#x1d43a;(&#x1d449;,&#x1d438;,&#x1d44a;)&#xff0c;未加权网络表示为&#x1d43a;(&#x1d449;,&#x1d438;)&#xff0c;其中&#x1d449;和&#x1d438;表示节点和边的集合&#xff0c;&…

社区发现算法之——Louvain

1、什么是社区 如果一张图是对一片区域的描述的话&#xff0c;我们将这张图划分为很多个子图。当子图之内满足关联性尽可能大&#xff0c;而子图之间关联性尽可能低时&#xff0c;这样的子图我们可以称之为一个社区。 2、社区发现算法及评价标准 社区发现算法有很多&#xf…

python-louvain

安装 louvain当前最新版本&#xff1a;0.14 pip install python-louvain由于是处理社区的数据&#xff0c;这里还是安装networkx pip install networkx使用 不妨来运行下一个案例&#xff1a; import community as community_louvain import matplotlib.cm as cm import m…

louvain算法

简介 louvain算法由比利时鲁汶大学的 Vincent D.Blondel 等人于 2008 年提出&#xff0c;因其能以较高的效率计算出令人满意的社区识别结果&#xff0c;是近年来最多被提及和使用的社区识别算法。 Louvain算法是一种基于模块度(模块度越大则表明社区划分效果越好。Q值的…

社区发现算法——Louvain 算法

Louvain 算法 原始论文为&#xff1a;《Fast unfolding of communities in large networks》。 所以又被称为Fast unfolding算法。 Louvain算法是一种基于模块度的社区发现算法。其基本思想是网络中节点尝试遍历所有邻居的社区标签&#xff0c;并选择最大化模块度增量的社区…

Win10系统导入证书私钥

一、Win10系统导入证书私钥 二、直接点击“下一步”即可 三、输入私钥密码&#xff0c;“导入选项”按下图所示选择&#xff0c;点击“下一步” 四、默认选择“自动选择证书存储”&#xff0c;点击“下一步” 五、点击“完成”&#xff0c;弹出“导入成功”窗户&#xff0c;则私…

解决Win10无法安装没有数字签名驱动的问题

建议按如下步骤操作后&#xff0c;手动安装没有数字签名的驱动&#xff0c;亲测可以使用&#xff0c;之前也为没办法安装没有数字签名的驱动烦躁的不行&#xff0c;修改完启动项后&#xff0c;就安装成功了。 1.第一步打开开始菜单&#xff0c;选择设置 2.第二步打开更新和安全…

Win10下安装 Redis

Win 10下安装 Redis 一、安装环境二、下载windows版本的Redis三、安装Redis四、安装服务五、启动服务六、测试Redis 写在前面 Redis 是一个开源使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。 Redis 通常被称作数据结构数据库&…

win10 安装配置Git

1、下载Git&#xff1a; 官网下载地址&#xff1a;Git - Downloading Package 选择相应的版本下载git 百度地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Y_P_ek1Pb9Zt04n3wsAlzA 提取码&#xff1a;3p60 2、 安装&#xff1a; 环境&#xff1a;Windows 10 6…

win10系统激活遇到的问题

1. 0xC004F069 提示“0xC004F069 在运行 Microsoft Windows 非核心版本的计算机上&#xff0c;运行“slui.exe 0x2a 0xC004F069”&#xff0c;多半是因为当前的windows系统不是最新的&#xff0c;需要更新&#xff08;更新win10&#xff09; 2. 0xFFFFFFFF 我这里在解决1后&…

Win10添加ssh公钥

1&#xff0c;创建ssh-key ssh-keygen.exe 2&#xff0c;运行ssh-agent Start-Service ssh-agent PS C:\Users\Administrator\.ssh> Start-Service ssh-agent Start-Service : 由于以下错误无法启动服务“OpenSSH Authentication Agent (ssh-agent)”: 无法启动计算机“…

Win10 PowerToys官方免费效率小工具集

文章目录 颜色选择器​FancyZones 窗口增强管理器PowerToys Run 应用启动器Keyboard Manager 键盘映射管理器 / 键位修改工具PowerRename 强力批量文件重命名工具File Explorer (Preview Pane) 文件管理器“预览窗格”Image Resizer 批量图片处理器 (尺寸修改/缩放/转换格式)Wi…

关于如何获取Win10 蓝牙Link Key的方法

本文记录如何获取Win10 蓝牙Link Key信息&#xff1a; 使用Win10 Notebook打开蓝牙&#xff0c; 配对连接上设备后&#xff0c;蓝牙Link Key的显示位置在&#xff1a; 计算机 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys 但执行”rege…

win环境下SSH key 配置

从Gitlab上拉取代码报错&#xff1a; Warning: Permanently added gitlab.wang.cn,47.94.8.13 (ECDSA) to the list of known hosts. Connection closed by 47.94.148.123 port 22 Could not read from remote repository. Please make sure you have the correct access rig…

Win10系统Git安装,及ssh key配置

文章目录 前言一、安装Git1. 下载并安装2. 报错及解决方法 二、生成SSH key1. 鼠标右键点击 Git Bash here2. 依次执行以下命令&#xff1a; 三、Gitlab中配置SSH key1. 用笔记本打开 C:\Users\Administrator\\.ssh\id_rsa.pub&#xff0c;复制全部内容2. 打开Gitlab中 user se…

在Win10下使用AutoHotKey为软件指定默认输入法

引子 最近使用MathType较为频繁&#xff0c;然MathType每次打开都是系统默认的中文输入法&#xff0c;导致打公式时必须先切换成英文输入法才好使用&#xff0c;由此萌生了为其指定默认输入法的想法。 经验借鉴 通过在搜索引擎上检索后&#xff0c;我找到&#xff1a;根据不…

win10本地安装部署ClickHouse

ClickHouse可以在任何具有x86_64&#xff0c;AArch64或PowerPC64LE CPU架构的Linux&#xff0c;FreeBSD或Mac OS X上运行。 目前在win10系统上面运行&#xff0c;需要安装win10的ubuntu子系统。需要开通&#xff0c;勾选&#xff0c;如图。 勾选以后&#xff0c;直接在microso…

安装win10虚拟机

&#xff08;1&#xff09;依次点击【文件】、【新建虚拟机】 &#xff08;2&#xff09;选择【典型】&#xff0c;点击【下一步】 &#xff08;3&#xff09;选择【稍后安装操作系统】&#xff0c;点击【下一步】 &#xff08;4&#xff09;选择客户机操作系统为【Mi…