Python复杂网络社区检测:并行谱聚类算法设计与多种算法应用实战研究

news2024/12/30 1:51:58

原文链接:https://tecdat.cn/?p=37574

分析师:Leiyun Liao

在当今的网络科学领域,复杂网络中的社区检测成为了一个至关重要的研究课题。随着信息技术的飞速发展,各种大规模网络不断涌现,如社交网络、生物网络等。准确地识别这些网络中的社区结构,对于理解网络的功能、行为以及潜在的规律具有重大意义点击文末“阅读原文”获取完整代码数据)。

网络社团划分算法作为复杂网络研究的关键内容,一直备受关注。近年来,基于代数图论发展起来的谱聚类算法凭借其利用特征值对应的谱结构来保证划分质量的优势,成为了新的研究热点。然而,在面对大规模网络时,传统的谱聚类算法往往受到时间、内存和 CPU 等资源的限制。为了克服这些限制,将谱聚类算法并行化成为了一种必然的选择。

本文由分析师 Leiyun Liao 深入探讨用于社团探测的并行谱聚类算法设计。同时,通过社区检测算法研究与应用谱聚类、Louvain、irvan-Newman算法和层次迭代谱聚类算法的社交圈社区检测及可视化的数据代码,展示了这些算法在不同网络数据集上的应用和实现过程。通过对这些内容的研究,期望为复杂网络社区检测领域提供有价值的理论和实践参考。

用于社团探测的并行谱聚类算法设计

网络社团划分算法是复杂网络中的一个热门话题。近年来,基于代数图论发展的谱聚类算法,利用特征值对应的谱结构,保证了划分质量,是新的研究热点。由于在大规模网络情况下,受到时间、内存、CPU 等限制,需要将谱聚类算法并行化。

任务/目标

采用Python中Multiprocessing模块进行并行设计的方法

并行谱聚类算法的实现

谱聚类算法有3 个重要的步骤:构建Laplacian 矩阵,计算Laplacian 矩阵的前k 个特征向量,实行k-means聚类。谱聚类算法的并行设计就是从上述的3 个方面中有较高时间消耗的步骤进行处理。

6d68cb7dde651fe76cd3b9f518f93916.png 

并行化构建拉普拉斯矩阵

b5257691cc53b9ba784d363a67651624.png

ecf5e88da1fcf9a10294bc76c4af0ff6.png

c63138d17125af892c7dc103d32fd232.png

并行化计算特征向量

Lanczos 算法是一种迭代算法,用于计算n 阶埃尔米特矩阵的m(m ⩽ n)个“最有用的”的特征值与特征向量,符合求解Laplacian矩阵前k个特征值和特征向量的需求。并行计算特征向量主要是针对Lanczos算法中主要的消耗时间的操作——矩阵L与向量v_j的乘积运算。设计想法为:将矩阵L进行行分块,分配到不同CPU 上计算与向量v_j的乘积,最后将计算结果合并为向量。

943d1238482d4daa5ab72c922f3fea49.png

并行化k-means聚类

k-means聚类是一个迭代过程。每次迭代分为两步:首先,找到每个点离它最近的中心点并归入该类;其次,重新计算中心点。重复上述两部,直到收敛。本文采用的收敛准则是前后两次聚类结果一致。由于新的中心点会被用于下一步迭代,且在每次迭代中必须更新,因此迭代过程无法并行。但是,计算不同点和各个中心的距离和其所属类是可以并行的。

533ecbe166c25f23ef039f70c3ca7b72.png

为了对上述设计的并行谱聚类算法进行测试,我们采用三组数据进行测试分析。本文中用来测试的数据为社团结构探测算法常用的经典数据,使用实际网络Zachary空手道俱乐部成员关系网,2000年美国大学生美式足球赛网络和Polblog网络来测试算法的划分质量,使用LFG基准网络调节网络大小来测试算法运行时间。本文测试所用的环境全部为Intel(R) Core(TM) i7 10510U CPU @ 1.80GHz,8.00GB 内存,Windows10 操作系统。社团划分质量通过Newman 等人提出的模块度来衡量,

Zachary空手道俱乐部

选定高斯函数中的参数σ = 5,k 近邻算法中参数k = 5,利用3.2 节所介绍的算法对该网络进行处理,并利用模块度对社团划分的质量进行评价。模块度Q 与社团个数k 的变化情况如图9所示。由图可以得出:模块度Q 最大对应的社团个数为2,恰为实际的社团个数。

12dba2a03341425fca123d53e5261116.png

当社团个数为2 时,得到的具体划分结果见图10。经多次实验发现,节点8 会被错分,其余节点都被正确划分到相应的社团中。因此,该算法用于空手道俱乐部网络社团划分的效果较好。

aba4afc283652b817aea08912caa501e.png

2000年美式足球赛网络

选定高斯函数中的参数σ = 5,k 近邻算法中参数k = 5,利用3.2 节所介绍的算法对该网络进行处理。模块度Q 与社团个数k 的变化情况如图11所示。模块度Q 最大值为0.602,对应的社团个数为11。与实际的12 个联盟有误差,但两者模块度相差不大。

7d1a4f68ed71e987e5e78e230bbba826.png

PolBlogs 网络

选定高斯函数中的参数σ = 5,k 近邻算法中参数k = 5。模块度Q 与社团个数k 的变化情况如图12所示。模块度Q 最大值为0.229,对应的社团个数为3,与实际的2 个政治派别有误差。

e66f6bd074bb46ab877e067926993bee.png


点击标题查阅往期内容

263ecfd4b01e671b1b2a4d57eeacceb6.png

R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化

outside_default.png

左右滑动查看更多

outside_default.png

01

db997d62d0acfd9f51633e5c82f60a12.png

02

2342a8e794304b9793bb7b779c95e29c.png

03

8e25c759b946aec9c1e66f6f0110ba18.png

04

c31a30e1c899eb147b46909271b2e9f0.png

算法运行时间

LFR 基准网络是测试社团划分算法的经典人工网络,网络中的度分布和社团大小均服从幂律分布。我们通过调节LFR 网络的规模_n _来测试并行算法的运行时间,其余参数为_γ _= 3_, ζ _= 1_._8_, μ _= 0_._1,结果见表3。

e3cfe322acc2eed97b4a97e79a97c482.png

结果讨论与分析

在计算相同数据规模的情况下,发现本文用Python 中Multiprocessing 模块设计的并行算法运行时间比使用Hadoop并行框架的慢很多。考虑原因可能是:

1) 开设进程和多进程间的来回切换也是需要开销的。算法实现中涉及到了Lanczos算法和kmeans算法等都是迭代算法,每次迭代过程中频繁的进程切换会消耗时间。这一点也应证了计算特征向量时的高时间消耗;

2) 由于进程间的数据并不能共享,每次创建一个进程都需要拷贝主进程中的数据和传入数据,数据量增大的同时,拷贝、传入也需要消耗额外时间;

3) 能同时进行计算的CPU 数量会受到电脑配置的影响,且时间复杂度从理论上说是单进程的1/_p_(_p _为CPU 个数)。就拿笔记本电脑来说,理论上最多只能缩短1/4 或1/8,何况还要考虑其他开销带来的损失。

针对以上问题,后续需对程序进行优化,优化的主要方向有:

  1. 优化数据存储方式,减少进程间数据共享带来的消耗;

  2. 替换高时间消耗的算法,如可以利用用kd 树技术进行矩阵稀疏化;

3) 借鉴Hadoop 中的MapReduce 并行计算模型,用Python 语言实现,提高效率。

社区检测算法研究与应用谱聚类、Louvain、irvan-Newman算法|附数据代码

社区检测,又称为社区搜索,其本质是在图结构中寻找那些彼此紧密连接且在结构上相互趋近的节点集合。在本研究中所涉及的社区检测库,采用了三种重要的算法来实现这一目标。

(一)谱聚类
谱聚类算法通过对图的拉普拉斯矩阵进行特征分解,将图中的节点划分到不同的社区中。该算法在处理复杂的图结构时具有较高的准确性和稳定性。

(二)Louvain 方法
Louvain 方法是一种基于模块度优化的社区检测算法。它通过不断地合并节点,使得整个图的模块度不断提高,从而得到最终的社区划分。

(三)Girvan-Newman 算法
Girvan-Newman 算法通过逐步移除图中的边,来识别图中的社区结构。该算法基于边介数的概念,能够有效地发现图中的层次社区结构。

应用

我们在植入 L 分区模型(代码内有详细规范说明)以及扎卡里空手道俱乐部网络上对本库进行了测试,以实现结果的可视化呈现。

a25dda2bb57f1dbac4409e24d1dd55e3.png

空手道俱乐部网络

194e7bc2ebd7b21fcd217829fa99f4c1.jpeg

算法及用法

(一)谱聚类

在植入 L 分区模型上进行测试:

``````
labels\_dict = spectral\_clustering(G\_pl,K,pos\_pl,COLORS,laplacian\_type="symmetric",edge\_alpha=0.1,node_size=10,labels=False)

俱乐部网络上进行测试:

G\_kk = nx.karate\_club\_graph()pos\_kk = nx.spring\_layout(G\_kk)visualize\_graph(G\_kk, pos_kk)

Louvain 方法

在植入 L 分区模型上进行测试:

result = plantedl()G = result\[0\]pos = nx.spring\_layout(G)final\_partition = result\[1\]\[0\]

Girvan-Newman

你同样可以使用原始的 Networkx 可视化选项来呈现这些算法所产生的结果。

在植入 L 分区模型上进行测试:

G = nx.planted\_partition\_graph(5, 30, 0.8, 0.1)pos = nx.spring_layout(G, k=0.1, iterations=30, scale=1.3)

层次迭代谱聚类算法的社交圈社区检测及可视化|附数据代码

本研究旨在对 Facebook 的 “Social Circles Dataset” 进行社区检测,并通过绘制图形实现可视化。该数据集对应的图是无向、无权的,包含 4039 个节点和 88234 条边。我们采用了层次迭代谱聚类算法,利用菲德勒向量进行社区检测。本文详细介绍了该算法的实现过程及相关的绘图函数。

一、研究目标

对社交圈进行社区检测,并通过绘制图形实现可视化。

二、算法描述

层次迭代谱聚类算法

  1. 谱分解:单次迭代

    函数spectralDecomp_OneIter(nodes_connectivity_list)用于实现谱分解的单次迭代。该函数首先获取节点列表,计算节点数量,创建节点到索引的映射以及索引到节点的映射。接着创建邻接矩阵和度矩阵。

node\_to\_idx, idx\_to\_node = get\_nodes\_mapping(nodes)adj\_matrix = get\_adj\_matrix(nodes\_connectivity\_list,node\_to\_idx,num\_nodes)degree\_matrix = np.zeros((num\_nodes,num\_nodes),dtype=int)for node,row in enumerate(adj\_matrix):degree_matrix\[node\]\[node\] = np.sum(row)
  1. 谱分解:多次迭代

    函数spectralDecomposition(nodes_connectivity_list)实现了多次迭代的谱分解。在每次迭代中,从队列中取出子图进行单次迭代的谱分解,得到菲德勒向量、邻接矩阵和图分区。通过分析图分区中的社区,确定是否需要进一步迭代。

num\_nodes = len(nodes)node\_to\_idx, idx\_to\_node = get\_nodes\_mapping(nodes)queue = \[\]final\_clusters = np.empty((num\_nodes,2),dtype=int)iter = 0unique\_clusters = 0min\_cluster\_size = 20queue.append(nodes\_connectivity\_list)while queue:subgraph = queue.pop(0)fielder\_vec\_fb,adj\_matrix\_fb, graph\_partition\_fb = spectralDecomp\_OneIter(subgraph)communities = \[label for \_,label in graph\_partition\_fb\]community_ids = np.unique(communities)

创建排序邻接矩阵

函数createSortedAdjMat(partition, edge_list)根据图分区和边列表创建排序后的邻接矩阵。该函数首先从边列表中获取唯一的节点名称,建立节点名称与索引的映射关系。然后计算节点数量,创建空的邻接矩阵,并根据边列表填充矩阵元素。

nodes = np.unique(edge\_list)name\_to\_index = {}index\_to\_name = {}for index, name in enumerate(nodes):name\_to\_index\[name\] = indexindex\_to_name\[index\] = name

绘图函数

用于绘制排序后的邻接矩阵图像,并保存为文件。

算法实现步骤

  1. 首先,对数据集进行谱分解的多次迭代,得到图分区。

  2. 然后,根据图分区和边列表创建排序后的邻接矩阵。

  3. 接着,使用绘图函数分别绘制排序后的邻接矩阵、菲德勒向量和社区可视化图像。

print('Plotting Sorted Adjacency Matrix:')plt.imshow(sorted\_adj\_matrix,cmap='inferno\_r')plt.title(plot\_title)plt.show()plt.savefig('../plots/spectral\_adj\_matrix.png')print('Plotting Fiedler Vector')fielder\_vec\_fb = np.sort(fielder\_vec\_fb)plt.plot(fielder\_vec\_fb)plt.grid(True)plt.xlabel('Dimension')plt.ylabel('Eigen Vector Values per dimensiovefig('../plots/fiedler_vector.png')print('Visualizing Communities')nodes = \[\]

6becb7ace0f9472fb76abc8e61048767.png 

d705c29de1db35ea15f03ed7804f06e8.png

sorted\_adj\_matrix = createSortedAdjMat(graph\_partition\_fb,nodes\_connectivity\_list\_fb)plot\_sorted\_adjMatrix(sorted\_adj_matrix,p

36f45d4722683401e8026df0e694975d.png 

fb56fa2f392f014943ec67100ad3a609.png

plot\_graph(graph\_partition\_fb,nodes\_connectivity_list

1eb1ce1a005aca67282ad90bc38271e6.png

关于分析师 

3c40dfa2fe7811dad0bba4ffa0e43489.png 

在此对Leiyun Liao对本文所作的贡献表示诚挚感谢,他在上海大学完成了数学与应用数学专业的学位,专注统计学习模型领域。擅长 Python。

51edd85cb8eef64482583a9c0d1fc738.jpeg

本文中分析的数据、代码分享到会员群,扫描下面二维码即可加群! 

15b2948af0b3ec5a8788c981f7e51f33.png


资料获取

在公众号后台回复“领资料”,可免费获取数据分析、机器学习、深度学习等学习资料。

91dd3effe631f05d39964f013f9a5b44.jpeg

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《Python复杂网络社区检测:并行谱聚类算法设计与多种算法应用实战研究》。

点击标题查阅往期内容

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法

用SPSS Modeler的Web复杂网络对所有腧穴进行关联规则分析

复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”

疫情期间航空网络演变复杂网络可视化

R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化

疫情期间航空网络演变复杂网络可视化

R语言用igraph对上海公交巴士路线数据进行复杂网络、网络图可视化

063411218465701a59c919f2c9e24d68.jpeg

9f47161ff2e10421ae92bb66c41e35f4.png

96e5c4cbb4610eb29b25eb1bc742d72a.png

abccb62efd6c5c934b4c34168d509541.jpeg

b0b94b9285e419c447fb2d51c3277ff8.png

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

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

相关文章

chapter12-异常(Exception)——(作业)——day15

目录 457-异常课后作业 458-异常课后作业2 457-异常课后作业 package chapter12.exception.homework;/*** author LuHan* version 1.0*/ public class Homework01 {public static void main(String[] args) {try {if(args.length!2){throw new ArrayIndexOutOfBoundsException…

立创商城9.9免邮活动开始啦!

从9月2日起,立创商城推出免邮活动,每月在领券中心>精选专区领取免邮券,即可享受满9.9元使用免邮券服务。 未注册的用户,可扫描下方二维码注册哦~

2024高教社杯数学建模国赛ABCDE题选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;A<C<B 。 D、E题推荐选E题&#xff0c;后续会直接更新E论文和思路&#xff0c;不在这里进行选题分析&#xff0c;以下为A、B、C题选题建议及初步分析 A题&#xff1a;“板凳龙”…

AI技术的新篇章:GPT Next、Gemini 2、GPT-6 和千代理人探索虚拟世界

在AI技术飞速发展的今天&#xff0c;许多令人兴奋的突破正逐渐进入公众视野。最近的新闻显示&#xff0c;诸如OpenAI的GPT Next、Google的Gemini 2.0、GPT-6以及模拟虚拟世界中的1000个AI代理人等前沿项目&#xff0c;标志着人工智能领域即将进入一个全新阶段。本文将深入探讨这…

多线程的简单了解——多客户端链接

在前面的学习中发现我们的聊天室功能只能有一个客户端接入服务端中&#xff0c;第二个客户端想要接入服务端中必须要等待第一个客户端输入结束才能接入。 这很明显不符合实际应用的开发&#xff0c;现在我们就来学习Java中一个重要的知识&#xff0c;多线程来解决这个问题。我们…

内存管理篇-22 高端内存和低端内存的分界线

这节课讲的主是为了区分低端内存和高端内存的是如何区分的&#xff1f;内核空间的划分是可以配置的。为了查看现象&#xff0c;通过qemu设置物理内存为不同情况。 结论&#xff1a;线性映射区的大小&#xff0c;和page_offset(内核起始地址0x80000000还是0xc0000000)和物理内存…

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是&#xff1a;文件名字不正确&#xff0c;文件权限不对&#xff0c;文件不存在&#x…

铁打的程序员轻易“不哭”-我的大模型创业近2年来的感悟

楔子 2022年11月&#xff0c;GPT-3发布那一刻&#xff0c;我被AI的强大能力所震撼&#xff0c;意识到“超级个体”时代的来临。自那时起&#xff0c;我开始全心投入创业&#xff0c;经历了许多苦乐交织的时光。 2023年6月&#xff0c;我尝试将AI应用于智能营销导购&#xff0…

143.布隆过滤器原理以及Go使用示例

文章目录 1. 是什么&#xff1f;2. 干什么&#xff1f;3. 为什么&#xff1f;4. 有什么问题&#xff1f;5. Go使用布隆过滤器单机版(Golang)分布式版(Java) 1. 是什么&#xff1f; 它是一个二进制bit数组&#xff0c;初始为 0 采用位存储数据结构&#xff0c;节省存储空间 1…

学学vue-1

vue 0 安装 装node.js&#xff0c;以及cnpm&#xff08;npm超时或者被屏蔽&#xff0c;安装cnpm国内镜像&#xff09; 查看安装版本&#xff08;是否安装成功&#xff09; node -v 安装成功之后也会安装npm npm -v cnpm镜像 npm install -g cnpm --registryhttp://registry.np…

spring如何解决bean的循环依赖

通过三级缓存解决循环依赖问题。 其中一级缓存用于存储完整的bean&#xff1b;二级缓存用于存储已经完成aop动态代理的bean&#xff0c;防止重复创建动态代理&#xff1b;三级缓存存储未实现aop动态代理和为实现依赖注入的bean。getBean()时先从一级缓存取&#xff0c;没有取二…

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器 蜂鸣器是一种简单的声响发生器&#xff0c;常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音&#xff0c;一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1&…

2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用等距螺线&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

嵌入式S3C2440:控制LED灯

发光二极管接口&#xff08;左端&#xff09;应为低电平 以LED1为例 LED1的接口为GPB5 void led_init(void) {//配置GPB5功能为输出GPBCON & ~(0x3 << 10);GPBCON | (0x1 << 10); //使GPB5输出高电平(关灯)GPBDAT | (1 << 5); }void led_on(void) {GPB…

【重学 MySQL】十一、SQL 概述

【重学 MySQL】十一、SQL 概述 SQL 背景知识产生与发展主要特点主要应用SQL语言的发展趋势 SQL 语言排行榜SQL 分类数据查询语言&#xff08;DQL, Data Query Language&#xff09;数据操纵语言&#xff08;DML, Data Manipulation Language&#xff09;数据定义语言&#xff0…

产品图片小程序开发:全方位指导,让产品展示更出色

想要快速开发并上线一个展示产品图片的小程序吗&#xff1f;乔拓云平台是您的理想选择。只需简单几步&#xff0c;即可打造专属的小程序平台。 首先&#xff0c;访问乔拓云官方网站&#xff0c;注册并登录您的账号。在小程序后端&#xff0c;您可以自由探索丰富的模板库&#x…

Leetcode每日刷题之155.最小栈

1.题目解析 本题是实现一个栈并且要实现其中的插入、删除、返回栈顶元素、返回最小元素的函数&#xff0c;这里主要的难点就是返回最小元素的函数&#xff0c;如果我们直接遍历&#xff0c;那么时间复杂度就是O(N)&#xff0c;但是题目要求我们需要在常数时间也就是O(1)的时间复…

shell 控制台显示彩色文字的方法

在shell脚本中,如果我们希望在控制台能显示带颜色的文字, 那就需要使用shell中的色彩专用变量代码来进行. shell中的各种颜色代码定义 # 颜色定义 BLACK"\033[0;30m" DARK_GRAY"\033[1;30m" BLUE"\033[0;34m" LIGHT_BLUE"\033[1;3…

vscode中全局代码片段怎么改名字

在使用vscode定义自己的代码片段的时候&#xff0c;有几个选项&#xff0c;如果我们选择了 vue.json 的文件定义代码片段&#xff0c;那么只能在 vue 文件中使用该片段&#xff0c;并且是 vue 文件中没有写其他代码的时候&#xff0c;如果 vue 文件中写了其他代码&#xff0c;那…

2024 小米芯片笔试

题型&#xff1a;单选题 时间&#xff1a;40分钟 知识点设计&#xff1a;数电&#xff08;很多&#xff09;、模电&#xff08;很多&#xff09;、电路(很多)、V&#xff08;4-5道&#xff09;、SV&#xff08;1道&#xff09; 感觉&#xff1a;&#xff1f;&#xff1f;&am…