点击蓝字 关注我们

1

networkx介绍

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

2

复杂网络介绍

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

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()

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

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

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()

#访问节点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()

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

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

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

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

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

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

#实例:在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()

6

北京地铁线路实例

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

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

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

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

#有向图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)

#无向图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)

因为没有加入站点的位置信息,所以绘制的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

点此亲启

致各位粉丝

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

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

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

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

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

感谢支持,比心。

此致

编辑:庄桢

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

如果觉得还不错

点这里

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

  1. Python 计算两个连通子图距离_【CV学习笔记】图像的计算

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间 来源:知乎 链接:https://zhuanlan.zhihu.com/p/1038790 ...

  2. python输入两个坐标求距离_计算python中*多组*地理坐标之间的距离

    编辑: here's a simple notebook example 一般方法,假设您有一个包含点的DataFrame列,并且您想要计算所有这些列之间的距离(例如,如果您有单独的列,则首先将它们组 ...

  3. python 计算两个经纬度的距离_python实现两个经纬度点之间的距离和方位角的方法...

    最近做有关GPS轨迹上有关的东西,花费心思较多,对两个常用的函数总结一下,求距离和求方位角,比较精确,欢迎交流! 1. 求两个经纬点的方位角,P0(latA, lonA), P1(latB, lonB ...

  4. python 计算两个经纬度的距离_python 通过两个点的经纬度计算距离

    谷歌map计算公式: python代码: def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数) ""&q ...

  5. python计算两字符串中的位置_从Python中的字符串中获取两个字符

    how to get in python from string not one character, but two? I have: long_str = 'abcd' for c in long ...

  6. python计算两组数据的协方差_(python3)数据分析之Pandas:汇总、统计、相关系数和协方差...

    pandas对象中拥有一组常用的数学和统计方法,跟NumPy数组相比,它们是基于没有缺失数据的加上构建的. In [71]: df = DataFrame([[1.4,np.nan],[7.1,-4. ...

  7. python提供两种基本循环结构_零基础学python 12 程序不枯燥:for循环结构(课后习题)...

    上节课我们一起学习了咱们的for循环结构,这节课咱们来就之前学过的知识做一下习题吧: 1. 主题: Duck, Duck, Goose! 假设你在一个家禽农场工作,需要计算从传送带传下来的动物数量(不 ...

  8. python计算两个向量之间的欧氏距离

    python计算两个向量之间的欧氏距离 代码: import numpy as np # 向量的值 feature_1 = np.array([1,2,3]) feature_2 = np.array ...

  9. python计算两个矩形的重叠_python计算两个矩形框重合百分比的实例

    python计算两个矩形框重合百分比的实例 如下所示: def mat_inter(box1,box2): # 判断两个矩形是否相交 # box=(xA,yA,xB,yB) x01, y01, x02 ...

最新文章

  1. 为什么多线程可以利用到多核?
  2. 命令行选项解析函数:getopt()
  3. sql注入——day01
  4. Leaflet中对鼠标按下、移动事件监听实现移动单个图形
  5. boost::pfr::tuple_element_t相关的测试程序
  6. GDCM:gdcm::VM的测试程序
  7. DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)
  8. STM32之CAN总线原理
  9. mybatis逆向工程generatorConfiguration详细配置
  10. python编程快速上手第四章_《Python编程快速上手——让繁琐的工作自动化》读书笔记 第四章 列表...
  11. 华人、华侨、华裔之间究竟有什么区别?
  12. WebService的相关概念
  13. 【渝粤教育】国家开放大学2018年春季 0579-21T电路及磁路(2)(一) 参考试题
  14. 载入java VM 时Windows 出现错误:2
  15. 苹果电脑桌面计算机图标不见了怎么办,苹果电脑桌面文件都不见了怎么显示
  16. STM32 CAN 库函数
  17. 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案
  18. 小程序源码:和平精英吃鸡捏脸数据助手-多玩法安装简单
  19. java协程_在Java中使用协程(Coroutine)
  20. 车道线识别(一) 简单识别

热门文章

  1. 视频教程-网络安全与渗透测试工程师-渗透测试
  2. error2203matlab,小编详解Win10安装MATLAB软件提示Internal error 2203的解决方法
  3. ios项目编译错误:error: Multiple commands produce 'Faun.app/Assets.car'
  4. intellij no executable code found at line
  5. CentOS6.5挂载大于2TB的磁盘使用parted和GPT类型
  6. java中osend_Java中OIO与NIO的简单区别
  7. Acrobat 删除pdf页面
  8. 《SysML精粹》学习记录--第九章
  9. 《可以量化的管理学》目录
  10. 【BackEnd】SpringBoot整合MybatisPlus实现登录注册功能(适合初学者)