热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

networkx学习与使用——(6)图划分与介数计算

networkx学习与使用——(5)图划分与介数计算摘要图划分例子生成介数定义及计算定义networkx计算边介数通过networkx的最短路算法实现使用networkx的内置函数




networkx学习与使用——(5)图划分与介数计算


  • 摘要
  • 图划分
    • 例子生成

  • 介数定义及计算
    • 定义
    • networkx计算边介数
      • 通过networkx的最短路算法实现
      • 使用networkx的内置函数计算

    • 结果分析

  • 参考


摘要

图划分按照一定规则将一个连通图划分成几个连通分量,看上去有点像聚类的感觉。从网络的角度,会根据一些重要的节点或边来进行划分,这里介绍划分图的指标——边介数。


图划分

图划分一般有两种方法,“删边法"和"聚集法”。删边法通过删除某条"重要"的边进行划分。聚集法通过将最"接近"的节点聚集起来构成不同的区域。这里介绍依据边介数进行删边的图划分方法。


例子生成

import networkx as nx #载入networkx包
import matplotlib.pyplot as plt #用于画图
#生成图
G = nx.Graph() #无向图
G_edges = [(1,2),(1,3),(2,3),(3,7),(4,5),
(4,6),(5,6),(6,7),(7,8),(8,9),
(8,12),(9,10),(9,11),(10,11),(12,13),
(12,14),(13,14)]
G.add_edges_from(G_edges)
labels={}
for node in G.nodes():
labels[node]=str(node)
#画图
pos = nx.kamada_kawai_layout(G)
plt.rcParams['figure.figsize']= (6, 4) # 设置画布大小
nx.draw_networkx_nodes(G,pos) # 画节点
nx.draw_networkx_edges(G,pos) # 画边
nx.draw_networkx_labels(G,pos,labels) # 画标签
plt.axis('off') # 去掉坐标刻度
plt.show()

图划分实例
如果要将上图中的图用删边法将图一分为二,我们会删除哪条边呢?我们一从图中一眼就会选择删除7-8这条边,这是为什么呢?当然我们可以说是因为这条边是割边,但6-7,3-7,8-9和8-12这些边也是割边,为什么我们会更倾向于7-8这条边呢?介数通过某条边传递信息的数量来描述边的重要性给出了一种解释。


介数定义及计算

定义

百度百科:介数通常分为边介数和节点介数两种,其中节点介数定义为网络中所有最短路径中经过该节点的路径的数目占最短路径总数的比例,而边介数定义为网络中所有最短路径中经过该边的路径的数目最短路径总数比例

以上图为例,上图共有14个节点,因此存在1413/2=91条最短路径(上图不存在两个节点间存在多条最短路径的情况)。然后我们计算经过7-8边的最短路径的数量:可以这样考虑,只有上面的节点到达下面的节点需要经过7-8,因此经过7-8的最短路径为77=49条最短路径。所以7-8的边介数为




49


/


91





0.5385



49/91\approx0.5385


49/91≈0.5385。


networkx计算边介数


通过networkx的最短路算法实现

通过定义我们发现可以通过最短路路径的算法来实现介数的计算,在networkx学习与使用——(3)路与圈中我们介绍了如何使用networkx对图的最短路进行计算。接下来我们根据最短路的一些函数来设计介数的函数:

def betweeness(G):
all_shortest_path = []
result_dict = {}
node_list = list(G.nodes)
for i in range(len(node_list)):
for j in range(i+1,len(node_list)):
u = node_list[i]
v = node_list[j]
all_shortest_path += list(nx.all_shortest_paths(G, u, v))
all_shortest_path_num = len(all_shortest_path)
for edge in G.edges:
u, v = edge
result_dict[(u,v)] = 0
for path in all_shortest_path:
if u in path and v in path:
result_dict[(u,v)] += 1
result_dict[(u,v)] /= all_shortest_path_num
return result_dict

out:
{(1, 2): 0.01098901098901099,
(1, 3): 0.13186813186813187,
(2, 3): 0.13186813186813187,
(3, 7): 0.3626373626373626,
(4, 5): 0.01098901098901099,
(4, 6): 0.13186813186813187,
(5, 6): 0.13186813186813187,
(7, 6): 0.3626373626373626,
(7, 8): 0.5384615384615384,
(8, 9): 0.3626373626373626,
(8, 12): 0.3626373626373626,
(9, 10): 0.13186813186813187,
(9, 11): 0.13186813186813187,
(10, 11): 0.01098901098901099,
(12, 13): 0.13186813186813187,
(12, 14): 0.13186813186813187,
(13, 14): 0.01098901098901099}

使用networkx的内置函数计算

nx.edge_betweenness()

{(1, 2): 0.01098901098901099,
(1, 3): 0.13186813186813187,
(2, 3): 0.13186813186813187,
(3, 7): 0.3626373626373627,
(4, 5): 0.01098901098901099,
(4, 6): 0.13186813186813187,
(5, 6): 0.13186813186813187,
(7, 6): 0.3626373626373627,
(7, 8): 0.5384615384615385,
(8, 9): 0.3626373626373627,
(8, 12): 0.3626373626373627,
(9, 10): 0.13186813186813187,
(9, 11): 0.13186813186813187,
(10, 11): 0.01098901098901099,
(12, 13): 0.13186813186813187,
(12, 14): 0.13186813186813187,
(13, 14): 0.01098901098901099}

结果分析

恩,结果一样,没啥大bug,小bug出现了再说。所以我们可以看到7-8的介数最大,即通过7-8的信息是最多的;其次是6-7,3-7,8-9和8-12这些割边,即使都不是割边,我们也能发现1-3和2-3是比1-2重要的边。


参考

networkx官网地址:https://networkx.org/



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
wwjieabc_584
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有