热门标签 | 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/



推荐阅读
  • JComponentJLabel的setBorder前言用例2205262241前言setBorder(Border边框)实现自JComponentjava.awt.Insets ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文汇集了我在网络上搜集以及在实际面试中遇到的前端开发面试题目,并附有详细解答。无论是初学者还是有一定经验的开发者,都应深入理解这些问题背后的原理,通过系统学习和透彻研究,逐步形成自己的知识体系和技术框架。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 搜索引擎技术概论(上篇):核心原理与应用分析
    搜索引擎技术概论(上篇)探讨了搜索的基本概念及其核心原理。搜索的本质在于信息检索,即用户通过输入关键词,利用特定的算法从海量数据中快速定位并提供所需信息。本文详细分析了搜索引擎的工作机制及其在实际应用中的表现。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
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社区 版权所有