Python 计算两个连通子图距离_复杂网络分析之python利器NetworkX

点击蓝字 关注我们

1

networkx介绍

networkx在2002年5月产生,是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。networkx支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。

2

复杂网络介绍

复杂网络(Complex Network),是指具有自组织、自相似、吸引子、小世界、无标度中部分或全部性质的网络。钱学森给出了复杂网络的一个较严格的定义:具有自组织、自相似、吸引子、小世界、无标度中部分或全部性质的网络称为复杂网络。

b82bb92fc424fa288748574de6d6bc01.png

3

图的介绍

(1)Graph的定义

图是复杂网络研究中的一个重要概念。Graph是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型。网络作为图的一个重要领域,包含的概念与定义更多,如有向图网络(Directed Graphs and Networks)、无向图网络(Undirected)等概念。

Graph在现实世界中随处可见,如交通运输图、旅游图、流程图等。利用图可以描述现实生活中的许多事物,如用点可以表示交叉口,点之间的连线表示路径,这样就可以轻而易举的描绘出一个交通运输网络。

(2)Graph的结构

根据Graph的定义,一个Graph包含一个节点集合和一个边集。将图表示为可以在计算机中处理的形式常见表示方式:①邻接矩阵②邻接表③三元组

(3)Graph分类

Graph:指无向图(undirected Graph),即忽略了两节点间边的方向。

DiGraph:指有向图(directed Graph),即考虑了边的有向性。

MultiGraph:指多重无向图,即两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联。

MultiDiGraph:多重图的有向版本。

G = nx.Graph() # 创建无向图G = nx.DiGraph() # 创建有向图G = nx.MultiGraph() # 创建多重无向图G = nx.MultiDigraph() # 创建多重有向图G.clear() #清空图

4

网络的统计指标

度:节点度是指和该节点相关联的边的条数,又称关联度。特别地,对于有向图,节点的入度 是指进入该节点的边的条数;节点的出度是指从该节点出发的边的条数。

平均路径长度:平均路径长度是拓扑网络中的一个概念,定义为所有可能的网络节点对的最短路径上的平均步数。它是网络上信息或大众运输效率的一种度量。

集聚系数:在图论中,聚类系数是图中节点聚类的程度的度量。有证据表明,在大多数真实世界的网络中,特别是在社交网络中,节点往往以相对高密度的联系为特征,形成紧密的群体;这种可能性往往大于两个节点之间随机建立平局的平均概率。

节点中心性:在图论和网络分析中,中心性指标确定图中最重要的顶点。应用程序包括识别社交网络中最有影响力的人、互联网或城市网络中的关键基础设施节点和疾病的超级传播者。中心性概念最早出现在社会网络分析中,许多衡量中心性的术语反映了它们的社会学渊源。它们不应该与节点影响度量相混淆,节点影响度量试图量化网络中每个节点的影响。

5

基础教程

#添加节点import networkx as nximport matplotlib.pyplot as pltG = nx.Graph()            #建立一个空的无向图GG.add_node('1')           #添加一个节点1nx.draw(G, with_labels=True)plt.show()

f28fa52bb08289c35d40ef0bcf2c9be3.png

G.add_nodes_from(['2','3','4','5'])    #加点集合nx.draw(G, with_labels=True)plt.show()

098a92f4cfd5173b466c86e4ac7f4cc4.png

G.add_cycle(['6','7','8','9']) #加环nx.draw(G, with_labels=True)plt.show()

b693022687c6299f1ef2fc338303fe7a.png

H = nx.path_graph(10)          #返回由10个节点挨个连接的无向图,所以有9条边G.add_nodes_from(H)            #创建一个子图H加入GG.add_node(H)                  #直接将图作为节点nx.draw(G, with_labels=True)plt.show()

fec2c09bf6d8a545887c23c252ccb52d.png

#访问节点print('图中所有的节点', G.nodes())print('图中节点的个数', G.number_of_nodes())图中所有的节点 ['1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0x00000240082AE390>] 图中节点的个数 G.remove_node(1)    #删除指定节点G.remove_nodes_from(['2','3','4','5'])    #删除集合中的节点nx.draw(G, with_labels=True)plt.show()

ef98e562dd81cc980c7aca0e0f2bcd07.png

#添加边F = nx.Graph() # 创建无向图F.add_edge(11,12)   #一次添加一条边nx.draw(F, with_labels=True)plt.show()

6a7b82b352828b9c326ba2d7a8aeca82.png

e=(13,14)        #e是一个元组F.add_edge(*e) #这是python中解包裹的过程nx.draw(F, with_labels=True)plt.show()

31d445797a043913eade3c21c5abf706.png

F.add_edges_from([(1,2),(1,3)])#通过添加list来添加多条边nx.draw(F, with_labels=True)plt.show()

6d5985640d061f71b49ea7c12e9b672e.png

#通过添加任何ebunch来添加边F.add_edges_from(H.edges()) #不能写作F.add_edges_from(H)nx.draw(F, with_labels=True)plt.show()

337818f5efbb9807ef3c79137d32a874.png

#访问边print('图中所有的边', F.edges())print('图中边的个数', F.number_of_edges())

f0aa6447db32f9f3d7be4150f4ab33b7.png

#删除边F.remove_edge(1,2)F.remove_edges_from([(11,12), (13,14)])nx.draw(F, with_labels=True)plt.show()

7c210a20bed6117658200df202269909.png

#实例:在networkx中列出节点和边import networkx as nximport matplotlib.pyplot as pltG = nx.DiGraph()G.add_edges_from([('0', '1'), ('0', '2'), ('0', '3')])G.add_edges_from([('4', '41'), ('1', '11'), ('1', '12'), ('1', '13')])G.add_edges_from([('2', '21'), ('2', '22')])G.add_edges_from([('13', '131'), ('22', '221')])G.add_edges_from([('131', '221'), ('221', '131')])G.add_nodes_from(['5','6','7','8'])nx.draw(G, with_labels=True)plt.show()

e8ecc9b39941461ef9710a159b62452c.png

6

北京地铁线路实例

北京市地铁线路数据如下所示

data = pd.read_csv("D:\\Metro_Beijing.csv")

77755766a54caaa5fad0d07536619517.png

LINE代表线路,STATION代表该站点在这条线路的顺序,STATION-NAME是站点名称。为了画出地铁线路网络图,需要对数据进一步处理,可以把它处理成(边起点,边终点,边的权重)的形式,边的起点和终点就是地铁站点,边的权重可以根据站点间的实际行程时间和距离来确定,本文为了简便,把边的权重定为1。且为了表达简便。每个站点的NAME用数字代替,数据中共有376个地铁站,所以站点的编号是从1-376。

经过处理后,得到一个三列的数据,NO是边的起点,NO2是边的终点,count是权重,因为地铁线路大部分是双向的,所以这是一个没有方向的无向图。该文件为“SD”

c2b9990684fb127a35b8bc48f0535180.png

#有向图G = nx.from_pandas_edgelist(SD, 'NO', 'NO2', 'count', create_using=nx.DiGraph())pos = nx.spring_layout(G)pylab.figure(1)nx.draw(G, pos, with_labels=False, node_size=100, node_color="skyblue", node_shape="o", alpha=0.5,width=0.5)

4c7134d5e7b232617c111712fea89ca6.png

#无向图G = nx.from_pandas_edgelist(SD, 'NO', 'NO2', 'count', create_using=nx.Graph())pos = nx.spring_layout(G)pylab.figure(figsize=(12, 8))nx.draw(G, pos, with_labels=True, node_size=300, node_color="skyblue", node_shape="o",alpha=0.8,width=2)

4973ba5bd52d82a6a647c94ef7584350.png

因为没有加入站点的位置信息,所以绘制的Graph的站点只表示连通关系,不表示真实的位置关系。

绘制好图后,可以对图进行指标的计算:

print(nx.number_of_nodes(G)) #输出图的顶点数print(nx.number_of_edges(G)) #输出图的边数print(nx.number_connected_components(G)) #输出图的连通子图数量lst = list(G.subgraph(c) for c in nx.connected_components(G)) #提取图中所有连通子图,返回一个列表,默认按照结点数量由大到小排序H = lst[0] #取顶点数最多连通子图来分析print(nx.number_of_nodes(H))#顶点数最多连通子图的顶点数print(nx.number_of_edges(H))#顶点数最多连通子图的边数print(nx.average_shortest_path_length(H)) #计算平均最短路径长度print(nx.average_clustering(H))#计算print(G.degree)#度print(nx.degree_histogram(G))

参考文献:

https://www.cnblogs.com/minglex/p/9205160.html

https://www.jianshu.com/p/4dd7cc2d95d5

http://wiki.swarma.net/index.php/复杂网络#.E5.BA.A6

https://networkx.github.io/documentation/networkx-1.9/_modules/networkx.html

https://www.jianshu.com/p/85a2cf85bf3f

https://github.com/networkx/networkx

https://blog.csdn.net/qq_35722520/article/details/106190232?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

点此亲启

致各位粉丝

dd22ad1c-522b-eb11-8da9-e4434bdf6706.svg

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】和【赞】,以及分享我们的文章。具体步骤为:

(1)点击页面最上方“交通科研Lab”,进入公众号主页

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦

(3)在每一次阅读完文章后,文末右下角顺手【在看】

(4)增加两项新功能,即文章底部除“在看”以外,新增“分享”和“赞”。欢迎大家多多点击“分享”可“分享到朋友圈”或“发送给朋友”。

感谢支持,比心。

此致

a3616dbe3bc7d7eecb57e0c4390d2a8f.png 066a312f3dd2be10227ec890622813dc.png cb96aafc0ebe5984ab597cbdf104ae9c.png

编辑:庄桢

15fd7bc30557b23fb3ff986e8886bd2f.gif

“交通科研Lab”:分享学习点滴,期待科研交流!

9c5381300bba6ed540bec8e4bc386937.png

如果觉得还不错

点这里👇👇👇

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值