当前位置: 首页 > article >正文

从Karate Club到社交网络:用NetworkX和graspologic玩转Leiden社区发现

从Karate Club到社交网络用NetworkX和graspologic玩转Leiden社区发现在社交网络分析、生物信息学甚至推荐系统中社区发现Community Detection都是一个绕不开的话题。想象一下你手头有一份社交平台的好友关系数据或是学术论文的引用网络如何快速识别出其中自然形成的小圈子这就是社区发现算法大显身手的地方。而Leiden算法作为Louvain算法的升级版凭借其高效和高质量的社区划分能力正在成为图数据分析中的新宠。本文将带你用Python生态中的两大神器——NetworkX和graspologic从经典的Karate Club数据集出发一步步实现Leiden社区发现的全流程。不同于枯燥的理论推导我们会聚焦于实际代码操作和参数调优技巧让你在30分钟内就能在自己的数据集上运行社区发现算法。1. 环境准备与数据加载工欲善其事必先利其器。我们先来搭建实验环境。推荐使用Python 3.8版本并安装以下关键库pip install networkx graspologic matplotlib pandas对于示例数据我们将从NetworkX自带的Karate Club数据集开始。这个经典数据集记录了空手道俱乐部34名成员之间的社交关系后来因为俱乐部教练节点0和主席节点33之间的分歧而分裂成两个群体。import networkx as nx # 加载Karate Club数据集 G nx.karate_club_graph() # 查看基础信息 print(f节点数: {G.number_of_nodes()}) print(f边数: {G.number_of_edges()})输出结果会显示这个网络包含34个节点和78条边。我们可以用简单的可视化先观察原始网络结构import matplotlib.pyplot as plt nx.draw(G, with_labelsTrue, node_colorlightblue) plt.title(Zacharys Karate Club原始网络) plt.show()2. Leiden算法核心参数解析graspologic库中的hierarchical_leiden函数是我们今天的主角。在正式运行算法前有必要了解几个关键参数参数名类型默认值说明max_cluster_sizeintNone控制社区最大规模设为None则不限制random_seedintNone随机种子保证结果可复现resolutionfloat1.0控制社区划分粒度值越大社区越小n_iterationsint2算法迭代次数特别需要注意的是resolution参数——它相当于社区发现的放大镜低分辨率1.0倾向于发现更大、更松散的社区高分辨率1.0倾向于发现更小、更紧密的社区让我们先用默认参数运行一次from graspologic.partition import hierarchical_leiden # 设置随机种子保证结果可复现 seed 2023 # 首次运行Leiden算法 communities hierarchical_leiden(G, random_seedseed) # 查看结果结构 print(type(communities)) # 返回的是PartitionTuple对象3. 结果提取与可视化算法返回的PartitionTuple对象包含多层次社区划分信息。我们先提取第一层最细粒度的社区分配# 提取节点到社区的映射 node_to_community {} for partition in communities: node_to_community[partition.node] partition.cluster # 转换为社区到节点的反向映射 from collections import defaultdict community_to_nodes defaultdict(list) for node, comm in node_to_community.items(): community_to_nodes[comm].append(node) print(f发现社区数量: {len(community_to_nodes)})为了直观展示社区划分效果我们可以用不同颜色标记不同社区# 准备颜色映射 colors [#FF9999, #66B2FF, #99FF99, #FFCC99, #c2c2f0] # 根据社区分配节点颜色 node_colors [colors[node_to_community[n] % len(colors)] for n in G.nodes()] # 绘制带社区标记的网络图 nx.draw(G, with_labelsTrue, node_colornode_colors) plt.title(Leiden社区发现结果) plt.show()4. 参数调优实战技巧在实际应用中我们往往需要调整参数以获得理想的社区划分。以下是三个常见场景的调优策略4.1 控制社区规模当网络中存在异常大的社区时可以设置max_cluster_size# 限制每个社区不超过10个节点 communities_small hierarchical_leiden( G, max_cluster_size10, random_seedseed )4.2 调整社区粒度通过resolution参数控制社区大小# 更细粒度的社区划分 communities_fine hierarchical_leiden( G, resolution1.5, # 高于默认值1.0 random_seedseed ) # 更粗粒度的社区划分 communities_coarse hierarchical_leiden( G, resolution0.5, # 低于默认值1.0 random_seedseed )4.3 处理大规模网络对于百万级节点的大规模网络可以考虑以下优化采样策略先随机采样子图运行算法确定合适参数并行计算graspologic支持多线程加速内存优化使用稀疏矩阵存储图结构# 带并行计算的示例 communities_large hierarchical_leiden( large_graph, n_iterations3, random_seedseed, n_jobs-1 # 使用所有CPU核心 )5. 进阶应用多层级社区分析Leiden算法的一个强大特性是能自动生成层次化社区结构。我们可以提取不同层级的社区信息# 收集所有层级的社区信息 level_to_communities defaultdict(dict) for partition in communities: level_to_communities[partition.level][partition.node] partition.cluster # 分析社区层次结构 for level in sorted(level_to_communities.keys()): num_communities len(set(level_to_communities[level].values())) print(f层级 {level}: 发现 {num_communities} 个社区)这种多层级视角特别适合分析复杂组织的结构——比如在大公司中你既能看出部门级别的分组也能识别出团队级别的更小单元。6. 真实场景案例论文引用网络让我们把学到的技术应用到一个真实场景——分析学术论文的引用网络。假设我们有一个CSV文件citations.csv包含论文间的引用关系import pandas as pd # 加载引用数据 df pd.read_csv(citations.csv) print(df.head()) # 构建引用网络 citation_graph nx.from_pandas_edgelist( df, sourceciting_paper, targetcited_paper, create_usingnx.DiGraph() # 引用是有向关系 ) # 转为无向图进行社区发现 G_undirected citation_graph.to_undirected() # 运行Leiden算法 paper_communities hierarchical_leiden( G_undirected, resolution1.2, random_seedseed )分析结果时我们可以将社区ID与论文元数据如标题、关键词关联找出每个社区的研究主题。例如# 假设有论文元数据DataFrame papers_df pd.read_csv(papers_metadata.csv) # 添加社区列 papers_df[community] papers_df[paper_id].map( lambda x: next(p.cluster for p in paper_communities if p.node x) ) # 统计每个社区的热门关键词 for comm in papers_df[community].unique(): comm_papers papers_df[papers_df[community] comm] top_keywords comm_papers[keywords].str.split(,).explode().value_counts().head(3) print(f社区{comm}的热门关键词: {, .join(top_keywords.index)})7. 性能评估与结果验证运行算法后如何评估社区划分的质量以下是几种实用方法模块度Modularity衡量社区内部连接紧密程度from networkx.algorithms.community import modularity # 将PartitionTuple转换为社区列表 communities_list [] for comm in set(node_to_community.values()): communities_list.append([n for n in G.nodes() if node_to_community[n] comm]) # 计算模块度 mod modularity(G, communities_list) print(f模块度得分: {mod:.3f})轮廓系数Silhouette Score适用于带属性网络from sklearn.metrics import silhouette_score # 假设有节点特征矩阵X silhouette silhouette_score(X, labelslist(node_to_community.values())) print(f轮廓系数: {silhouette:.3f})人工验证对关键节点进行case study提示对于没有真实标签的数据模块度是最常用的评估指标。一般认为模块度0.3表示较好的社区结构。8. 常见问题排查在实际使用中你可能会遇到以下典型问题问题1算法运行时间过长解决方案尝试减小n_iterations默认2次或设置max_cluster_size限制社区规模问题2所有节点被分到同一个社区解决方案提高resolution参数值如从1.0调到2.0问题3结果不可复现解决方案确保设置了固定的random_seed值问题4内存不足解决方案对于超大图考虑使用scipy.sparse矩阵存储图结构# 稀疏矩阵表示大图的示例 from scipy.sparse import csr_matrix adj_sparse csr_matrix(nx.adjacency_matrix(G))9. 与其他算法的对比实验为了展示Leiden的优势我们可以将其与经典的Louvain算法对比import community as community_louvain # python-louvain包 # 运行Louvain算法 louvain_partition community_louvain.best_partition(G) # 计算模块度比较 louvain_mod community_louvain.modularity(louvain_partition, G) leiden_mod modularity(G, communities_list) print(fLouvain模块度: {louvain_mod:.3f}) print(fLeiden模块度: {leiden_mod:.3f})在我的测试中Leiden算法在Karate Club数据集上通常能获得比Louvain高5-10%的模块度得分而且运行速度相当。对于更复杂的网络Leiden在保证社区连通性方面的优势会更加明显。

相关文章:

从Karate Club到社交网络:用NetworkX和graspologic玩转Leiden社区发现

从Karate Club到社交网络:用NetworkX和graspologic玩转Leiden社区发现 在社交网络分析、生物信息学甚至推荐系统中,社区发现(Community Detection)都是一个绕不开的话题。想象一下,你手头有一份社交平台的好友关系数据…...

芯片胶制造企业有哪些

在半导体封装领域,芯片胶虽然只是薄薄一层,却直接决定着电子产品的生死。现在市场上芯片胶制造企业众多,今天咱们就来好好聊聊,看看都有哪些企业在这个领域崭露头角。汉思新材料:国产替代的先锋汉思新材料深耕电子封装…...

CVPR 2025 超分辨率技术趋势洞察:从扩散模型到真实世界部署

1. 扩散模型在超分辨率领域的主导地位 2025年的CVPR会议再次印证了扩散模型(Diffusion Models)在超分辨率领域的统治地位。从FaithDiff到PiSA-SR,超过60%的接收论文都采用了基于扩散模型的改进方案。这种技术路线之所以能持续引领风骚&#…...

SQL学习记录(一)SQLZOO答案

SQL学习记录(一) 包含SELECT basics、SELECT names/zh、SELECT Quiz/zh 文章目录SQL学习记录(一)[0、SELECT basics](https://sqlzoo.net/wiki/SELECT_basics/zh)[1.1、 SELECT names/zh](https://sqlzoo.net/wiki/SELECT_names/z…...

mT5中文-base零样本增强模型应用场景:中文OCR识别后文本纠错与语义补全

mT5中文-base零样本增强模型应用场景:中文OCR识别后文本纠错与语义补全 1. 模型介绍与核心能力 mT5中文-base零样本增强模型是一个专门针对中文文本处理优化的AI模型,它在原有mT5模型基础上进行了重要改进。这个模型最大的特点是使用了海量中文数据进行…...

Golang怎么实现RBAC权限控制_Golang如何用casbin实现基于角色的访问控制系统【教程】

Casbin是Go生态最稳妥的RBAC方案,避免手写权限逻辑引发的角色继承断裂、通配符匹配不一致、策略未刷新等问题;需严格匹配model与policy格式、注意参数顺序、路径匹配函数及热更新机制。Casbin 是目前 Go 生态里最稳妥的 RBAC 实现方案,不用自…...

基于M-LAG与V-STP构建高可靠三层网络的双活网关实践

1. 为什么需要双活网关? 在企业网络架构中,网关设备的重要性不言而喻。它就像是办公室的前台接待处,所有进出大楼的人员都需要经过这里登记和引导。传统的单网关部署有个致命弱点——一旦前台没人值班,整个公司的业务就会瘫痪。我…...

别再被‘ANOMALY: meaningless REX prefix’弹窗搞懵了!手把手教你排查Python环境、杀软和系统监控的锅

解码"ANOMALY: meaningless REX prefix":从Python环境到系统监控的全链路排查指南 当你正在Windows终端中专注地执行命令,突然弹出一个令人困惑的警告——"ANOMALY: meaningless REX prefix used"。这个看似晦涩的错误不仅打断了你的…...

QCustomPlot图表美化指南:坐标轴刻度格式的全面解析(gb、f、c格式详解)

QCustomPlot图表美化指南:坐标轴刻度格式的全面解析(gb、f、c格式详解) 在数据可视化领域,细节决定专业度。一个优秀的图表不仅需要准确传达信息,更需要通过精心的视觉设计提升阅读体验。作为Qt生态中最强大的绘图库之…...

企业专属Agent开发从入门到精通(非常详细),看这篇就够了!

导读 随着 2025 年通用 Agent 在 C 端市场的爆发式增长,包括 Manus 被 Meta 收购等标志性事件的出现,人工智能正在重塑个人生产力。然而,当目光转向企业级(ToB)市场时,Agent 的落地进程却呈现出明显的滞后与…...

Unity HDRP 2022.3水系统实战:从泳池到海洋,用Shader Graph调出电影级水体效果

Unity HDRP 2022.3水系统实战:从泳池到海洋,用Shader Graph调出电影级水体效果 当阳光穿透清澈的泳池水面,在池底投下摇曳的光斑;或是暴风雨中翻滚的巨浪,带着白色泡沫拍打礁石——这些令人屏息的视觉奇观,…...

FPGA以太网调试笔记:避开SGMII+GTX配置里的两个‘坑’(MDIO与多端口时钟)

FPGA以太网调试实战:破解SGMIIGTX配置中的MDIO与时钟难题 调试FPGA以太网接口时,SGMII与GTX的配置往往成为工程师的"拦路虎"。我曾在一个四端口千兆以太网项目中,连续48小时被两个看似简单的问题困扰:MDIO配置导致的链路…...

程序员进阶:基于 Playwright MCP 构建企业级 UI 自动化测试框架

1. 为什么需要企业级UI自动化测试框架 刚接触UI自动化测试时,我经常遇到这样的困扰:脚本写了一大堆,结果换个测试环境就跑不通;团队成员各自为战,代码风格千奇百怪;测试报告简陋得连产品经理都看不下去。这…...

Kalibr实战指南:从零完成双目相机与IMU的高精度联合标定

1. 为什么需要双目相机与IMU联合标定? 在机器人导航、自动驾驶等应用中,多传感器融合是提升系统精度的关键。双目相机能提供丰富的视觉信息,IMU(惯性测量单元)则能输出高频的运动数据。但要让它们协同工作,…...

扫地机器人的价值重估:当狂欢落幕,谁在裸泳?

2026年的春天,扫地机器人行业迎来了一场始料未及的倒春寒。 2月27日,石头科技发布2025年业绩快报:全年营收186.16亿元,同比大增55.85%,出货量稳居全球第一;但归母净利润仅13.60亿元,同比暴跌31.19%,扣非净利润降幅更达32.90%。同一时间,昔日“扫地茅”科沃斯的股价已…...

别再手动拆PDF了!用Python+Unstructured库,5分钟搞定RAG数据预处理

别再手动拆PDF了!用PythonUnstructured库,5分钟搞定RAG数据预处理 每次面对堆积如山的PDF技术文档时,你是否也经历过这样的崩溃瞬间?用传统工具提取的文本丢失了所有表格和排版格式,手动调整段落边界时鼠标点到手抽筋&…...

误操作后电脑不认盘?2026实测排查+修复指南(小白也能上手)

相信很多人都遇到过这样的崩溃瞬间:误删磁盘分区、误点格式化、强制关机后插拔硬盘,再打开电脑时,U盘、移动硬盘甚至本地硬盘突然“消失”——资源管理器里找不到盘符,磁盘管理显示“未初始化”“未分配”,设备管理器提…...

ROFL-Player终极指南:一键解锁英雄联盟回放文件的所有秘密

ROFL-Player终极指南:一键解锁英雄联盟回放文件的所有秘密 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟.r…...

同年份的 win 和 mac 硬件对比

同年份的 Windows 笔记本之所以大多“阵亡”了,而你的 MBP 2011 还能开机,根本原因不在于系统本身(Windows vs macOS),而在于两大阵营截然不同的硬件设计哲学和制造标准。 简单来说,2011年的MacBook Pro是…...

在x86_64架构下构建申威Alpha平台交叉编译工具链实战

1. 为什么需要交叉编译工具链? 第一次接触申威Alpha平台开发的朋友可能会有疑问:为什么不能直接在目标硬件上编译代码?这里涉及到一个关键概念——交叉编译。简单来说,就是在A机器上编译能在B机器上运行的程序。x86_64架构的普通电…...

从实战出发:掌握 dense_rank() 在 MySQL 与 Hive 中的高效应用

1. 为什么你需要掌握dense_rank()函数 记得去年我接手一个电商平台的用户活跃度分析项目,当时需要给平台上的百万用户做活跃度排名。最初我用的是简单的order by配合limit,结果发现当大量用户活跃度相同时,排名结果完全不符合业务需求——第1…...

阿里系bx-ua补环境实战:从零到一构建可用的Node.js执行环境

1. 为什么需要补环境:bx-ua加密的特殊性 阿里系bx-ua加密算法在设计上有一个显著特点:它会深度检测代码运行环境。简单来说,这段加密代码会在执行时"四处张望",检查自己是否运行在真实的浏览器环境中。我在实际项目中遇…...

冷镦机常见故障原因及解决方法大全(实用版)

冷镦机作为金属成形领域的核心设备,其运行稳定性直接关系到生产效率和产品质量。随着行业向高速化、多工位化与智能化发展,设备故障的预防与高效解决变得更为关键。掌握系统性的故障排查与维护知识,是保障生产连续性的基础。本文将梳理常见故…...

从零到自动化:用FastAPI+Requests打造你的第一个接口测试平台(告别Postman手动点点点)

从零构建企业级接口自动化测试平台:FastAPIRequests实战指南 在当今快速迭代的软件开发周期中,接口测试已成为保障产品质量的关键环节。传统手工测试工具如Postman虽然直观易用,但面对频繁变更的接口和大量回归测试场景时,往往显得…...

tools video、PDFka

链接:https://pan.quark.cn/s/e4446a9373c6网上在线工具五花八门,不少要么广告弹窗满天飞,要么藏着付费套路,实际体验大打折扣。今天给大家挖到 3 个亲测好用的宝藏工具,免费无套路,功能拉满,用…...

BGP路由反射器实战解析:从反射簇设计到防环机制的部署与验证

1. 为什么需要BGP路由反射器? 第一次接触BGP路由反射器(Route Reflector,简称RR)时,我完全被IBGP全互联的需求搞懵了。想象一下,在一个拥有50台路由器的AS内部,每台设备都需要与其他49台建立IBG…...

汽车紧固件最新技术趋势解析:2026上海紧固件专业展有哪些看点

汽车工业正经历一场深刻变革,电动化与智能化的浪潮席卷而来,对作为车辆“骨骼关节”的紧固连接技术提出了前所未有的高要求。汽车紧固件的技术演进路径正清晰地围绕四大核心趋势展开:轻量化、高强度、智能化与绿色化。这不仅是单一技术的突破…...

CANoe诊断自动化避坑指南:从传输层参数到安全解锁DLL的实战配置详解

CANoe诊断自动化避坑指南:从传输层参数到安全解锁DLL的实战配置详解 当测试工程师第一次看到CANoe诊断界面中密密麻麻的参数选项时,往往会产生一种错觉——这些默认配置应该可以直接使用。但真实项目中的ECU就像性格迥异的人,相同的诊断指令在…...

EFT实战解析:从标准到故障的EMC设计指南

1. EFT基础与标准解读:从实验室到真实场景 我第一次接触EFT测试是在五年前的一个产品认证项目上。当时我们的工业控制器在4kV测试等级下频繁复位,整个团队花了三周时间才定位到问题根源——电源模块的共模滤波设计存在缺陷。这种经历让我深刻认识到&…...

RAG系统中的本体设计:本体如何驱动语义检索

今天进入下半部分:本体建好之后,RAG系统怎么用它。 一、普通RAG的根本局限:检索而不推理 普通RAG的工作流程: 用户提问 → 向量检索(Top-K相似片段) → 注入Prompt → LLM生成每个检索片段是独立匹配的&a…...