本文主要是介绍附源码|复杂网络社区发现--GN算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文在实现GN算法的过程中实现了社区划分结果,同时实现了不同社区的可视化结果。emmmm代码写得不是很好,希望各位不要介意,如果对你们有帮助的话,希望可以点个赞呀。
GN算法简介
由Girvan和Newman提出的GN算法在近几年已成为社团结构分析的一种标准算法,他的基本思想是从网络的整体出发,不断地从网络中移除介数最大的边,从而获得最佳的社团结构。边介数定义为网络中经过每条边的最短路径的数目。GN算法的基本流程如下:
(1)对复杂网络中的每一条边,计算其对应的边介数;
(2)比较网络中所有的边介数,并将边介数最大的边从网络中移除;
(3)重复以上两个步骤,直至每个节点都是一个退化的社团。
算法实现
import networkx as nx
from networkx.algorithms import community #
import itertools
import matplotlib.pyplot as pltG = nx.karate_club_graph() # 空手道俱乐部comp = community.girvan_newman(G) # GN算法k = 4 # 想要4个社区
limited = itertools.takewhile(lambda c: len(c) <= k, comp) # 层次感迭代器
for communities in limited:b = list(sorted(c) for c in communities)print(b)pos = nx.spring_layout(G) # 节点的布局为spring型NodeId = list(G.nodes())
node_size = [G.degree(i)**1.2*90 for i in NodeId] # 节点大小plt.figure(figsize = (8,6)) # 图片大小
nx.draw(G,pos, with_labels=True, node_size =node_size, node_color='w', node_shape = '.')
'''
node_size表示节点大小
node_color表示节点颜色
node_shape表示节点形状
with_labels=True表示节点是否带标签
'''
color_list = ['brown','orange','r','g','b','y','m','gray','black','c','pink']
# node_shape = ['s','o','H','D'] for i in range(len(b)):# nx.draw_networkx_nodes(G, pos, nodelist=b[i], node_color=color_list[i], node_shape=node_shape[i], with_labels=True)nx.draw_networkx_nodes(G, pos, nodelist=b[i], node_color=color_list[i], with_labels=True)plt.show()
社区划分结果
社区划分可视化结果,不同颜色代表不同的社区。
有帮助的话,可以点个赞呀
有问题的话,可以留个言呀~o(〃‘▽’〃)o
这篇关于附源码|复杂网络社区发现--GN算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!