Leiden算法简介:Python实现网络分区

news2024/9/22 6:50:43

Leiden算法详解:Python实现网络分区

    • 1. Leiden算法简介
    • 2. Python代码实战
    • 3. 分组结果解读
      • level=0:初步分组
      • level=1:细分小组
    • 4. 为什么会这样分组?
    • 5. Leiden算法的工作原理
    • 6. 实际应用
    • 7. 给初学者的建议
    • 8. 总结

大家好!今天我们来深入了解Leiden算法,这是一个用于网络分区的强大工具。我们将使用Python来实现这个算法,并通过一个实际的例子来展示它的工作原理。

1. Leiden算法简介

Leiden算法是一种用于社区检测的算法,它可以帮助我们在复杂的网络中找到紧密相连的群体。想象你要给一个大班级的学生分组,希望每个小组内的同学关系都很好,Leiden算法就是来解决这类问题的。

2. Python代码实战

让我们用Python来实际操作一下!我们将创建一个同学关系网络,然后使用Leiden算法来进行分组。

import networkx as nx
from graspologic.partition import hierarchical_leiden

# 创建同学关系图
G = nx.Graph()
students = [
    "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十", 
    "钱十一", "朱十二", "陈十三", "林十四", "黄十五", "杨十六", "刘十七", 
    "何十八", "高十九", "马二十", "范二一", "程二二"
]
G.add_nodes_from(students)

# 添加同学关系
relationships = [
    ("张三", "李四"), ("张三", "王五"), ("李四", "赵六"), ("王五", "孙七"),
    ("赵六", "周八"), ("孙七", "吴九"), ("周八", "郑十"), ("吴九", "钱十一"),
    ("郑十", "朱十二"), ("钱十一", "张三"), ("朱十二", "李四"), ("陈十三", "林十四"),
    ("黄十五", "杨十六"), ("刘十七", "何十八"), ("高十九", "马二十"), ("范二一", "程二二"),
    ("张三", "陈十三"), ("李四", "黄十五"), ("王五", "刘十七"), ("赵六", "高十九"),
    ("孙七", "范二一"), ("周八", "林十四"), ("吴九", "杨十六"), ("郑十", "何十八"),
    ("钱十一", "马二十"), ("朱十二", "程二二")
]
G.add_edges_from(relationships)

# 使用Leiden算法进行分组
result = hierarchical_leiden(
    graph=G,
    max_cluster_size=5,  # 每组最多5人
    extra_forced_iterations=3  # 多尝试三次,看看有没有更好的分法
)

# 打印完整的分组结果
print("完整的分组结果:")
for cluster in result:
    print(cluster)

# 整理并打印最终分组
final_groups = {}
for cluster in result:
    if cluster.is_final_cluster:
        if cluster.cluster not in final_groups:
            final_groups[cluster.cluster] = []
        final_groups[cluster.cluster].append(cluster.node)

print("\n最终分组结果:")
for group_num, members in final_groups.items():
    print(f"第{group_num + 1}组:{', '.join(members)}")

3. 分组结果解读

运行上面的代码,我们得到了以下结果:

完整的分组结果:
HierarchicalCluster(node='李四', cluster=0, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='黄十五', cluster=0, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='吴九', cluster=0, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='杨十六', cluster=0, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='王五', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='朱十二', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='孙七', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='刘十七', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='范二一', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='郑十', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='何十八', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='程二二', cluster=1, parent_cluster=None, level=0, is_final_cluster=False)
HierarchicalCluster(node='张三', cluster=2, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='陈十三', cluster=2, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='周八', cluster=2, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='林十四', cluster=2, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='钱十一', cluster=3, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='赵六', cluster=3, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='高十九', cluster=3, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='马二十', cluster=3, parent_cluster=None, level=0, is_final_cluster=True)
HierarchicalCluster(node='王五', cluster=4, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='刘十七', cluster=4, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='孙七', cluster=5, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='范二一', cluster=5, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='朱十二', cluster=6, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='程二二', cluster=6, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='郑十', cluster=7, parent_cluster=1, level=1, is_final_cluster=True)
HierarchicalCluster(node='何十八', cluster=7, parent_cluster=1, level=1, is_final_cluster=True)

最终分组结果:
第1组:李四, 黄十五, 吴九, 杨十六
第3组:张三, 陈十三, 周八, 林十四
第4组:钱十一, 赵六, 高十九, 马二十
第5组:王五, 刘十七
第6组:孙七, 范二一
第7组:朱十二, 程二二
第8组:郑十, 何十八

让我们来解读这个结果:

level=0:初步分组

level=0 中,算法将所有学生分成了四个大组:

  1. 第一个组(cluster=0):包含李四、黄十五、吴九、杨十六
  2. 第二个组(cluster=1):包含王五、朱十二、孙七、刘十七、范二一、郑十、何十八、程二二
  3. 第三个组(cluster=2):包含张三、陈十三、周八、林十四
  4. 第四个组(cluster=3):包含钱十一、赵六、高十九、马二十

注意,第一、三、四组在这个级别就已经是最终结果了(is_final_cluster=True)。

level=1:细分小组

level=1 中,算法进一步将第二个大组(cluster=1)细分成了四个小组:

  1. 王五、刘十七(cluster=4)
  2. 孙七、范二一(cluster=5)
  3. 朱十二、程二二(cluster=6)
  4. 郑十、何十八(cluster=7)

这些小组都是最终的分组结果(is_final_cluster=True)。

4. 为什么会这样分组?

Leiden算法在分组时考虑了整个网络的结构,而不仅仅是直接的关系。例如:

  1. 李四、黄十五、吴九、杨十六被分在一组,可能是因为他们之间有较多的直接或间接联系。
  2. 虽然有些同学之间有直接联系(如张三和李四),但他们没有被分在一组,这可能是因为整体来看,将他们分开可以使得每个小组内部的关系更加紧密。
  3. 一些组只有两个人(如王五和刘十七),这可能是因为算法认为他们之间的关系特别紧密,或者他们与其他同学的关系相对较弱。

5. Leiden算法的工作原理

  1. 初步分组:算法首先根据网络结构将节点分成几个大的社区(在我们的例子中是4个)。
  2. 优化:然后,算法会尝试移动节点到不同的社区,以提高整体的模块度(衡量网络划分质量的指标)。
  3. 细化:最后,算法会在需要的情况下对大社区进行进一步的划分,形成更小的子社区(如我们例子中的第二个大组)。

整个过程会重复多次(在我们的例子中是3次,由 extra_forced_iterations=3 决定),以找到最优的分组方案。

6. 实际应用

Leiden算法不仅可以用于学生分组,还有很多其他应用:

  1. 社交网络分析:发现社交网络中的兴趣小组或社区。
  2. 生物信息学:分析蛋白质相互作用网络,发现功能相关的蛋白质群。
  3. 交通网络优化:识别城市中的社区结构,优化公共交通路线。
  4. 推荐系统:通过对用户进行分组,提供更精准的推荐。

7. 给初学者的建议

  1. 实验不同的参数:尝试改变 max_cluster_sizeextra_forced_iterations,看看结果会有什么变化。
  2. 可视化网络:使用 NetworkX 库的绘图功能,将关系网络可视化,这样可以更直观地理解算法的工作原理。
  3. 尝试不同的数据集:你可以创建不同的关系网络,看看算法在不同情况下的表现。
  4. 理解随机性:注意,Leiden算法可能会因为随机性而在不同运行中产生略有不同的结果。这是正常的,也反映了实际网络中社区结构的复杂性。

8. 总结

通过这个详细的例子,我们看到了Leiden算法如何在复杂的网络中找到紧密相连的群体。虽然算法的内部工作原理可能很复杂,但使用Python实现起来并不困难。

这个算法的结果可能会让我们感到惊讶:有些看似应该在一起的同学被分开了,而一些看似关系不那么密切的同学却被分到了一起。这正体现了网络结构的复杂性,以及Leiden算法考虑整体网络结构的特点。

记住,编程和算法学习最重要的是实践。尝试修改代码,创建你自己的网络,看看会得到什么有趣的结果。祝你学习愉快,编程之路越走越远!

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

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

相关文章

网络安全详解

目录 引言 一、网络安全概述 1.1 什么是网络安全 1.2 网络安全的重要性 二、网络安全面临的威胁 2.1 恶意软件(Malware) 2.2 网络钓鱼(Phishing) 2.3 中间人攻击(Man-in-the-Middle Attack) 2.4 拒…

让C#程序在linux环境运行

今晚花一些时间,总结net程序如何在linux环境运行的一些技术路线。 1、采用.Net Core框架 NET Core 使用了 .NET Core Runtime,它可以在 Windows、Linux 和 macOS 等多个操作系统上运行。可以采用Visual Studio生成Linux版本的dll。 在Linux系统中&…

救生圈检测系统源码分享

救生圈检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Python基础学习(3)

目录 一,函数 1,函数的定义 2,函数的参数 1,默认值 2,传参 3,返回值 4,变量的作用域 5,函数的调用 二,常用数据结构 1,列表 列表的定义 列表的特性…

机器学习的应用领域

机器学习在许多领域有广泛的应用,下面列出了一些主要的应用领域及其典型应用: 1. 图像识别 人脸识别:用于解锁手机、自动标记照片、监控安全系统。物体识别:应用于自动驾驶汽车、机器人、医疗影像分析中,帮助机器理解…

vue3 TagInput 实现

效果 要实现类似于下面这种效果 大致原理 其实是很简单的,我们可以利用 element-plus 组件库里的 el-tag 组件来实现 这里我们可以将其抽离成一个公共的组件,那么现在有一个问题就是通讯问题 这里我们可以利用父子组件之间的通讯,利用 v-model 来实现,父组件传值,子组…

蓝桥杯15届C/C++B组省赛题目

问题描述 小蓝组织了一场算法交流会议,总共有 5050 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人,这 77 人彼此之间没有进行握手 (但这 77 人与…

Unity数据持久化4——2进制

概述 基础知识 各类型数据转字节数据 文件操作相关 文件相关 文件流相关 文件夹相关 练习题 using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine;public class Exercises1 : MonoBehaviour {/…

金融科技与银行业的数字化转型

随着科技的迅猛发展,金融科技已经成为推动银行业数字化转型的重要力量。从移动支付到区块链,再到人工智能,这些新兴技术正逐渐改变银行的运作方式,不断提高银行的服务效率、提升客户体验,并推动整个金融生态系统的变革…

大数据-143 - ClickHouse 集群 SQL 超详细实践记录!

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

代码编辑器 —— Notepad++ 实用技巧

目 录 NotePad常用技巧一、查找二、标记三、插件四、自动补全 NotePad常用技巧 Notepad 的吉祥物是一只变色龙。它广泛应用于编程、网页开发、文本处理、脚本编写、文档编辑等领域。 一起看看它有哪些功能和特点: 1、对众多编程语言提供语法高亮显示 2、可折叠函数…

redis简单使用与安装

redis redis 是什么 Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。 一、存储系统特性 内存存储与持久化 Redis 主要将数据存储在内存中,这…

某省公共资源交易中心爬虫逆向分析

目标网站 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L3NjenQteHEvP3VzZXJJZD02NzM4OTg2MzkyNjA3NzAzMDQmcm93SWQ9NTI1MDYyMDI2ODg0NzE2NTQ0JnRpbWU9MjAwOC0xMS0yNiZjZXJ0aWZpY2F0ZU5vPTkxNDQwOTA0NjgyNDI2MzU4QyZjZXJ0aWZpY2F0ZVR5cGU9Mjg 一、抓包分析 请求头参数加密 二、…

【C语言-数据结构】单链表的定义

单链表的定义(实现) 比较顺序表和单链表的物理存储结构就能够清楚地发现二者的区别 用代码定义一个单链表 typedef struct LNode{ElemType data; //每个结点存放一个数据元素struct LNode* next; //指针指向下一个结点 }LNode, *LinkList;//要表示一个…

微信CRM系统适合什么企业?

CRM(客户关系管理)系统适合多种行业和企业,包括但不限于:传统制造业、互联网行业、电商行业、医疗行业、教育行业、交通运输行业、汽车行业、房地产行业、金融行业、银行 CRM的功能覆盖了与客户接触的各个阶段,包括售…

python --PyAibote自动化

官文: https://www.pyaibote.com/ 下载安卓集成环境: 可以看到开发的一些信息

【AI视频】AI虚拟主播制作网站推荐

一、什么是AI虚拟主播? AI虚拟主播是一种利用人工智能技术打造的虚拟主持人,也被称为数字虚拟主持人。它们通常是由人工智能技术和三维建模技术结合而成,可以在各种平台上进行主持工作,如新闻报道、电商直播、综艺娱乐等。 AI虚…

华润电力最新校招社招润择认知能力测评:逻辑推理数字计算语言理解高分攻略

​ 尊敬的求职者们, 在您准备加入华润电力这个大家庭之前,了解其招聘测评的详细流程和要求是至关重要的。以下是我们为您整理的测评系统核心内容,希望对您的求职之旅有所帮助。 测评系统概览 华润电力的招聘测评系统旨在全面评估求职者的认…

【全网最全】2024年华为杯研赛B题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/hMgWngXvcQhttps://qm.qq.com/q/hMgWngXvcQ你是否在寻找数学建模比赛的突破点&a…

二叉树(二)深度遍历和广度遍历

一、层序遍历 广度优先搜索:使用队列,先进先出 模板: 1、定义返回的result和用于辅助的队列 2、队列初始化: root非空时进队 3、遍历整个队列:大循环while(!que.empty()) 记录每层的size以及装每层结果的变量&a…