复杂网络系列:第 5 部分 — 社区检测和子图

关键词:Community Detection Algorithms

一、说明

在本教程中,我们将探讨网络分析的两个基本方面:社区检测和使用子图。了解这些概念将使您能够发现复杂网络中隐藏的结构和关系。

二、何为社区,何为社区检测?

2.1 关于社区检测和相关研究

你们很多人都熟悉网络,对吧?你可能正在使用 Facebook、Instagram、Twitter 等社交媒体网站。它们就是社交网络。你可能正在与证券交易所打交道。你可能正在买入新股,也可能卖出现有股票等等。它们就是网络。不仅在技术领域,而且在我们的日常社交生活中,我们都与许多网络打交道。社区是许多网络的属性,特定网络可能包含多个社区,社区内的节点紧密相连。多个社区中的节点可以重叠。想想你的 Facebook 或 Instagram 帐户,想想你每天与谁互动。你可能与朋友、同事、家人以及生活中其他一些重要的人密切互动。他们在你的社交网络中构成了一个非常密集的社区。

M. Girvan 和 MEJ Newman 是社群发现领域的两位著名研究者。在他们的一项研究中,他们利用社交网络和生物网络研究了社群的结构属性。他们认为,网络节点在社群内部以紧密的群体形式紧密连接,而在社群之间则以松散的连接形式存在。

2.2 为什么要进行社区检测?

在分析不同的网络时,发现其中的社群可能至关重要。社群检测技术有助于社交媒体算法发现具有共同兴趣的群体,并让他们保持紧密联系。社群检测技术可用于机器学习,检测具有相似属性的群体,并根据各种原因提取群体。例如,这项技术可用于发现社交网络或股票市场中的操纵性群体。

2.3 社区检测与聚类

有人可能会认为社群检测类似于聚类。聚类是一种机器学习技术,它根据相似的数据点的属性将其归入同一聚类。尽管聚类可以应用于网络,但它是无监督机器学习中一个更广泛的领域,涉及多种属性类型。另一方面,社群检测专门针对网络分析,它依赖于一种称为“边”的属性类型。此外,聚类算法倾向于将单个外围节点与其应属于的社群分离。然而,聚类和社群检测技术都可以应用于许多网络分析问题,并且根据领域的不同,它们可能存在不同的优缺点。

三、关于社区检测技术

社区发现方法大致可分为两类:凝聚法和分裂法。凝聚法是将边逐一添加到仅包含节点的图中,边的添加顺序是从强边到弱边。分裂法与凝聚法相反,是将边从完整的图中逐一移除。

给定网络中的社区数量可能不限,且规模大小不一。这些特性使得社区检测过程非常困难。然而,在社区检测领域已提出了许多不同的技术。以下介绍四种流行的社区检测算法。所有这些列出的算法都可以在Python 的 cdlib 库中找到。

3.1. 鲁汶社区检测

Louvain 社区发现算法最初于 2008 年提出,是一种适用于大型网络的快速社区展开方法。该方法基于模块度,试图最大化社区中实际边数与预期边数之间的差异。然而,优化网络中的模块度是 NP 难题,因此必须使用启发式方法。Louvain 算法分为两个迭代重复的阶段:

1 节点的局部移动
2 网络聚合
该算法从一个由 N 个节点组成的加权网络开始。在第一阶段,该算法为网络中的每个节点分配一个不同的社区。然后,对于每个节点,算法会考虑其邻居,并评估其模块化增益通过从当前社区中移除特定节点并将其放入邻居社区中。如果增益为正且最大化,则该节点将被放入邻居社区。如果没有正增益,则节点将保留在同一个社区中。此过程重复应用于所有节点,直到不再有进一步的改进。当获得模块度的局部最大值时,Louvain 算法的第一阶段停止。在第二阶段中,该算法将构建一个新网络,将在第一阶段找到的社区视为节点。第二阶段完成后,该算法将对生成的网络重新应用第一阶段。重复这些步骤,直到网络不再发生变化且获得最大模块度。

Louvain 社区发现算法能够在过程中发现社区的社区。该算法因其易于实现且速度快而广受欢迎。然而,该算法的一个主要限制在于其对网络在主内存中的存储的使用。

下面给出了使用 python cdlib 库的 Louvain 社区检测算法的使用。

1)从 cdlib 导入算法
2)导入 networkx 作为 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.louvain(G, weight=‘weight’, resolution=1., randomize=False)

3.2. 意外社区检测

由于模块度的局限性,引入了一种基于经典概率的度量方法,称为“意外度”(Surprise),用于评估网络社区划分的质量。该算法与鲁汶社区检测算法几乎相似,只是它使用意外度而非模块度。节点从一个社区移动到另一个社区,从而贪婪地提高意外度。这种方法考虑的是链接位于社区内的概率。在社区规模较小的情况下,使用意外度效果良好 ;而在社区规模较小的情况下,使用模块度效果良好。

下面给出了使用 python cdlib 库的 Surprise 社区检测算法的使用方法。

1)从 cdlib 导入算法
2)导入 networkx 作为 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.surprise_communities(G)

3.3. 莱顿社区检测

在后来的研究中(2019 年),VA Traag 等人表明,Louvain 社区检测倾向于发现内部不连通的社区(连接性较差的社区)。在 Louvain 算法中,将一个充当社区中两个组成部分之间桥梁的节点移至新社区可能会导致旧社区的连接断开。如果旧社区进一步分裂,则不会出现这种情况。但根据 Traag 等人的研究,情况并非如此。由于旧社区中的其他节点与社区之间的连接紧密,旧社区可以保持为一个单一社区。此外,他们还表示,Louvain 倾向于发现连接性非常差的社区。因此,他们提出了速度更快的 Leiden 算法,该算法可以保证社区的连接性良好。
在这里插入图片描述

除了 Louvain 算法中使用的阶段之外,Leiden 算法还使用了另一个阶段,用于尝试优化已发现的分区。Leiden 算法的三个阶段如下:

1)节点的局部移动
2)分区细化
3)基于精细划分的网络聚合
在细化阶段,算法尝试从第一阶段提出的分区中识别出细化的分区。第一阶段提出的社区可能会在第二阶段进一步分裂成多个分区。细化阶段不遵循贪婪方法,可能会将节点与随机选择的社区合并,从而提高质量函数。这种随机性允许更广泛地发现分区空间。同样在第一阶段,莱顿采用了与鲁汶不同的方法。莱顿不是在第一次访问所有节点后访问网络中的所有节点,而是只访问那些邻域发生变化的节点。

下面给出了使用 python cdlib 库的莱顿社区检测算法的使用。

1)从 cdlib 导入算法
2)导入 networkx 作为 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.leiden(G)

3.4. Walktrap 社区检测

Walktrap 是另一种基于随机游动的社区检测方法,其中通过网络中的随机游动来测量顶点之间的距离。Walktrap 是一种高效的算法,在最坏的情况下,时间复杂度为 O(mn²),空间复杂度为 O(n²)。但在大多数实际场景中,walktrap 的时间复杂度为 O((n²) log n),空间复杂度为 O(n²)。该算法的基本原理是,图 / 网络上的随机游动往往会陷入与社区相对应的紧密连接部分。Walktrap 使用随机游动的结果以自下而上的方式合​​并单独的社区。可以使用任何可用的质量标准来评估分区的质量。它可以是像 Louvain 社区检测中的模块化,也可以是任何其他度量。

下面给出了使用 python cdlib 库的 Walktrap 社区检测算法的使用方法。

1)从 cdlib 导入算法
2)导入 networkx 作为 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.walktrap(G)

3.5 小结

社群检测非常适用于理解和评估大型复杂网络的结构。这种方法利用图或网络中边的属性,因此比聚类方法更适合网络分析。聚类算法倾向于将单个外围节点与其应归属的社群分离。目前已提出并实现了多种不同的网络社群检测算法。每种算法都有各自的优缺点,具体取决于网络的性质以及应用问题领域。

四、实验进行识别社区

社区检测算法旨在将网络划分为多个社区。有几种算法可用,但我们将重点介绍 Girvan-Newman 算法和 Louvain 方法。

4.1 社区检测与聚类

有人可能会争辩说,社区检测类似于聚类。聚类是一种机器学习技术,其中相似的数据点根据其属性分组到同一集群中。尽管聚类可以应用于网络,但它是无监督机器学习中一个更广泛的领域,涉及多种属性类型。另一方面,社区检测是专门为网络分析量身定制的,该网络分析依赖于称为 edges 的单个属性类型。此外,聚类算法倾向于将单个外围节点与它应该属于的社区分开。但是,聚类和社区检测技术都可以应用于许多网络分析问题,并且可能会根据域的不同而产生不同的优缺点。

4.2 使用 NetworkX 进行社区检测

NetworkX 提供了应用各种社区检测算法的工具。让我们从 Girvan-Newman 算法开始。

社区检测技术

  1. Girvan-Newman 算法
    Girvan-Newman 算法通过逐步删除具有最高中介中心性的边来识别社区。以下是在 NetworkX 中实现 Girvan-Newman 算法的方法:
import networkx as nx
from networkx.algorithms.community import girvan_newman
import matplotlib.pyplot as pltG = nx.karate_club_graph()# Apply Girvan-Newman algorithm
communities = girvan_newman(G)# Get the first set of communities (you can iterate further for more levels)
node_groups = list(next(communities))# Assign colors to nodes based on their community
node_colors = []
for node in G.nodes():if node in node_groups[0]:node_colors.append('red')else:node_colors.append('blue')# Draw the graph with nodes colored by community
nx.draw(G, with_labels=True, node_color=node_colors)
plt.show()

Output:
在这里插入图片描述

4.3 . 鲁汶法

鲁汶方法是一种通过优化模块化来检测网络中社区的有效算法,模块化是一种评估网络内社区强度的度量。它的工作原理是在社区之间迭代移动节点,以最大限度地提高模块化,从而突出显示紧密连接的组。该方法快速、可扩展,并广泛用于各个领域,以揭示复杂网络中隐藏的结构。

鲁汶法的计算代码:

import networkx as nx
from community import community_louvain
import matplotlib.pyplot as plt# Assuming you have your graph G defined# Apply Louvain algorithm
partition = community_louvain.best_partition(G)# Get the community assignments for each node
node_colors = [partition[node] for node in G.nodes()]# Draw the graph with nodes colored by community
nx.draw(G, with_labels=True, node_color=node_colors)
plt.show()

输出:
在这里插入图片描述

4.4 图论中的子图

子图是由其顶点(节点)的子集和连接这些顶点的边形成的图形的一部分。分析子图有助于识别较大图中的关系、社区或特定特征。在 NetworkX 中,我们可以根据各种标准(例如特定节点、边或属性)轻松提取子图。

提取子图
可以根据特定节点或特定边提取子图。

import networkx as nx  
import matplotlib.pyplot as plt  # Load Zachary's Karate Club graph  
G_karate = nx.karate_club_graph()  plt.figure(figsize=(12, 6))  
plt.subplot(1, 2, 1) # Visualize the original graph  
nx.draw(G_karate, with_labels=True, node_color='lightblue', node_size=500, font_weight='bold')  plt.title("Original Zachary's Karate Club Graph")

输出:
在这里插入图片描述

按节点提取:
您可以通过指定要包含的节点列表来创建子图。当您想要研究较大图形中一组特定节点之间的连接和关系时,这尤其有用。

例: 如何根据特定节点从图中提取子图:

# Specify a list of nodes for the subgraph  
subgraph_nodes = [0, 1, 2, 3, 4, 5]  """Extract the subgraph from Zachary's Karate 
Club graph based on the specified nodes"""
subgraph = G_karate.subgraph(subgraph_nodes)  # Visualize the subgraph  
nx.draw(subgraph, with_labels=True, node_color='lightgreen', node_size=500, font_weight='bold')  plt.title("Subgraph of Zachary's Karate Club based on nodes")
plt.show()

输出:
在这里插入图片描述

我们可以通过以下命令打印子图的节点和边:

# Print nodes and edges of the subgraph  
print("Nodes in subgraph:", subgraph.nodes())  
print("Edges in subgraph:", subgraph.edges())Nodes in subgraph: [0, 1, 2, 3, 4, 5]
Edges in subgraph: [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (2, 3)]

按边提取:
或者,您可以使用一组特定的边提取子图。此方法侧重于节点之间的关系,当边表示重要的交互或连接时,此方法可能很有用。

示例:这是一个示例代码,演示了如何根据特定边缘在 NetworkX 中提取子图:

# Specify a list of edges for the subgraph  
subgraph_edges = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (2, 3)]  """Extract the subgraph from Zachary's Karate   
Club graph based on the specified edges"""  
subgraph_edges_extracted = G_karate.edge_subgraph(subgraph_edges)  # Visualize the subgraph  
plt.subplot(1, 2, 2)   
nx.draw(subgraph_edges_extracted,   with_labels=True,   node_color='orange',   node_size=500,   font_weight='bold')  plt.title("Subgraph of Zachary's Karate Club based on edges")  
plt.tight_layout()   
plt.show()

输出:
在这里插入图片描述

五、结论

在本教程中,我们探索了使用 NetworkX 的社区检测和子图。我们讨论了如何使用 Girvan-Newman 算法和 Louvain 方法识别社区,以及如何提取和可视化具有节点或边的子图。我们将在复杂网络系列:第 6 部分中深入探讨 PageRank 和 HITS 算法等高级主题,该主题衡量了网络中节点的重要性,并研究了与网络健壮性和弹性相关的概念。这些技术共同为分析和理解复杂网络提供了强大的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【办公类-99-04】20250504闵豆统计表excle转PDF,合并PDF、添加中文字体页眉+边框下划线

需求说明 督导检查,各条线都要收集资料。 今天去加班,遇到家教主任,她让我用保教主任的彩色打印机打印这套活跃度表格。(2023学年上学期下学期-2024学年上学期,就是202309-202504) 每个excle都是内容在A4一…

升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测

#工作记录 在 NVIDIA 发布 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后,开发者纷纷选择升级以获取新特性和性能提升。 CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化-CSDN博客 然而,升级完成并不意味着大功告成,确认升级后…

LLM论文笔记 28: Universal length generalization with Turing Programs

Arxiv日期:2024.10.4机构:Harvard University 关键词 图灵机 CoT 长度泛化 核心结论 Turing Programs 的提出 提出 Turing Programs,一种基于图灵机计算步骤的通用 CoT 策略。通过将算法任务分解为逐步的“磁带更新”(类似图灵…

【全队项目】智能学术海报生成系统PosterGenius--图片布局生成模型LayoutPrompt(1)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀大模型实战训练营_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

位图的实现和拓展

一:位图的介绍 ①:需要位图的场景 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中? 要判断一个数是否在某一堆数中,我们可能会想到如下方法: A…

排序功法入门指南【江湖算法笔记】

话说江湖风云变幻,各路英雄好汉行走江湖,总得有个名号排行。若问“东邪西毒南帝北丐”谁强谁弱,总得排个座次不是?这排序之道,恰似武功秘籍,练好了能号令群雄,练岔了怕是要被笑掉大牙&#xff0…

【中间件】brpc_基础_用户态线程中断

bthread之用户态线程中断 源码 1 简介 interrupt_pthread 核心功能是 通过信号机制中断阻塞的 pthread 线程,以实现线程的协作式中断。 2 核心功能与设计 2.1 信号选择与注册 信号选择:使用 SIGURG 作为中断信号。 原因:SIGURG 通常用于…

Linux 的网络卡

#本机操作系统CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 网卡能不能被捉到可以使用【dmesg|grep xx】来判断,有没有驱动则可以使用lsmod看看模块有没有加载核心!最后,以ifconfig xxx测试看看 观察核心所捉到的网卡…

前端双工通信的几种方案详细描述

前端实现双工通信(全双工或半双工)的常见方案及详细实现如下: 一、WebSocket(全双工) 原理:基于 TCP 的持久化协议,客户端与服务端建立双向通信通道,支持实时双向数据传输。 // 客…

KUKA机器人快速启动设置

KUKA机器人在首次开机启动时,有时在示教器上需要进行投入运行等相关的设置。如以下相关的信息需要处理: 1、机器人系统开机后,选择T1运行模式;2、显示提示信息:“RDC 存储器和控制系统不一致什么被更换了”时&#xf…

游戏代码C

以下将结合不同编程语言的特点及游戏开发中的实际应用,展示多种语言的游戏代码示例(以简单游戏为例,展示代码结构和逻辑差异)。由于代码篇幅较长,我将分语言进行说明并引用相关来源: 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略实现与实战指南

引言 在LangChain的Agent框架中,zero-shot-react-description 是一种预定义的Agent类型,它结合了Zero-Shot(零样本学习) 和 ReAct(推理行动) 策略,主要用于根据工具的描述动态选择和执行工具&a…

PyQt 或 PySide6 进行 GUI 开发文档与教程

一、官网文档 Qt 官方文档:Porting to Qt 6 | Qt 6.9Qt 维基:​​​​​​​Qt WikiQt for Python (PySide6) :​​​​​​​Qt for Python - Qt WikiPySide6 快速上手指南:​​​​​​​Getting Started - Qt for Python PyS…

2024年第十五届蓝桥杯省赛B组Python【 简洁易懂题解】

2024年第十五届蓝桥杯省赛B组Python题解 一、整体情况说明 2024年第十五届蓝桥杯省赛B组Python组考试共包含8道题目,分为结果填空题和程序设计题两类。 考试时间:4小时编程环境:Python 3.x,禁止使用第三方库,仅可使…

Go语言--语法基础4--基本数据类型--类型转换

Go 是一种强类型的语言,所以如果在赋值的时候两边类型不一致会报错。一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明。 强制类型转换语法 使用 type (a) 这种形式来进行强制类型转换&am…

nginx 代理时怎么更改 Remote Address 请求头

今天工作中遇到用 localhost 访问网站能访问后台 api,但是用本机IP地址后就拒绝访问,我怀疑是后台获取 Remote Address 然后设置白名单了只能 localhost 访问。 想用 nginx 更改 Remote Address server {listen 8058;server_name localhost;loca…

LeetCode刷题链表

文章目录 链表总结 常用技巧两数相加题解代码 两两交换链表中的节点题解代码 重排链表题解代码 合并k个升序链表题解代码 K个一组翻转链表题解代码 链表总结 常用技巧 画图 直观 形象 便于理解引入虚拟头节点,便于处理边界情况,方便我们对链表进行…

ESP32S3 多固件烧录方法、合并多个固件为单一固件方法

ESP32S3 多固件烧录方法、合并多个固件为单一固件方法 文章目录 ESP32S3 多固件烧录方法、合并多个固件为单一固件方法前言1、前期准备工作2、多固件烧录方法3、单固件烧录方法总结 前言 使用正点原子的ESP32S3 BOX开发板独立烧录编译生成的xxx.bin固件无法正常运行起来&#…

Webug4.0靶场通关笔记10- 第14关链接注入

目录 第14关 链接注入 1.打开靶场 2.源码分析 3.渗透实战 (1)方法1:跳转外部网页 (2)方法2:获取cookie 4.漏洞防御 本文通过《webug靶场第14关 链接注入》来进行渗透实战。 第14关 链接注入 链接注…

SpringBoot的汽车商城后台管理系统源码开发实现

概述 汽车商城后台管理系统专为汽车4S店和经销商设计,提供全面的汽车管理系统解决方案。 主要内容 1. 核心功能模块 系统提供以下主要功能: ​​销售管理​​:记录销售信息,跟踪交易进度​​客户管理​​:维护客户…