马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
各人好!今天我们来深入相识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 中,算法将全部学生分成了四个大组:
- 第一个组(cluster=0):包罗李四、黄十五、吴九、杨十六
- 第二个组(cluster=1):包罗王五、朱十二、孙七、刘十七、范二一、郑十、何十八、程二二
- 第三个组(cluster=2):包罗张三、陈十三、周八、林十四
- 第四个组(cluster=3):包罗钱十一、赵六、高十九、马二十
注意,第一、三、四组在这个级别就已经是终极结果了(is_final_cluster=True)。
level=1:细分小组
在 level=1 中,算法进一步将第二个大组(cluster=1)细分成了四个小组:
- 王五、刘十七(cluster=4)
- 孙七、范二一(cluster=5)
- 朱十二、程二二(cluster=6)
- 郑十、何十八(cluster=7)
这些小组都是终极的分组结果(is_final_cluster=True)。
4. 为什么会这样分组?
Leiden算法在分组时考虑了整个网络的结构,而不仅仅是直接的关系。比方:
- 李四、黄十五、吴九、杨十六被分在一组,大概是因为他们之间有较多的直接或间接接洽。
- 虽然有些同学之间有直接接洽(如张三和李四),但他们没有被分在一组,这大概是因为团体来看,将他们分开可以使得每个小组内部的关系更加紧密。
- 一些组只有两个人(如王五和刘十七),这大概是因为算法以为他们之间的关系特殊紧密,大概他们与其他同学的关系相对较弱。
5. Leiden算法的工作原理
- 开端分组:算法首先根据网络结构将节点分成几个大的社区(在我们的例子中是4个)。
- 优化:然后,算法会实行移动节点到差别的社区,以提高团体的模块度(衡量网络划分质量的指标)。
- 细化:末了,算法会在需要的情况下对大社区举行进一步的划分,形成更小的子社区(如我们例子中的第二个大组)。
整个过程会重复多次(在我们的例子中是3次,由 extra_forced_iterations=3 决定),以找到最优的分组方案。
6. 实际应用
Leiden算法不仅可以用于学生分组,还有很多其他应用:
- 社交网络分析:发现社交网络中的爱好小组或社区。
- 生物信息学:分析蛋白质相互作用网络,发现功能相干的蛋白质群。
- 交通网络优化:辨认都会中的社区结构,优化公共交通路线。
- 保举体系:通过对用户举行分组,提供更精准的保举。
7. 给初学者的发起
- 实行差别的参数:实行改变 max_cluster_size 和 extra_forced_iterations,看看结果会有什么厘革。
- 可视化网络:使用 NetworkX 库的绘图功能,将关系网络可视化,这样可以更直观地理解算法的工作原理。
- 实行差别的数据集:你可以创建差别的关系网络,看看算法在差别情况下的体现。
- 理解随机性:注意,Leiden算法大概会因为随机性而在差别运行中产生略有差别的结果。这是正常的,也反映了实际网络中社区结构的复杂性。
8. 总结
通过这个详细的例子,我们看到了Leiden算法怎样在复杂的网络中找到紧密相连的群体。虽然算法的内部工作原理大概很复杂,但使用Python实现起来并不困难。
这个算法的结果大概会让我们感到惊讶:有些看似应该在一起的同学被分开了,而一些看似关系不那么密切的同学却被分到了一起。这正体现了网络结构的复杂性,以及Leiden算法考虑团体网络结构的特点。
记着,编程和算法学习最紧张的是实践。实行修改代码,创建你本身的网络,看看会得到什么有趣的结果。祝你学习愉快,编程之路越走越远!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |