图论(一):速概览无向图有向图图的可视化路径问题

一、图论速概览

  • 研究图的性质和图之间的关系
  • 节点和边组成,节点表示对象,边表示对象之间的关系
  • 无向图:边没有方向,节点之间的连接是双向的。常用于描述简单的关系,如社交网络中的朋友关系。根据边有无权重分为无权重无向图有权重无向图无权重无向图中,通常使用 0和 1表示边的存在或不存在;有权重无向图的边有关联的数值(欧氏距离、相似度、相关性系数等
  • 有向图:边有方向,从一个节点指向另一个节点。常用于描述有向关系,例如网页之间的链接、任务执行的顺序、陆地生物链的能量流动模式
  • 图就是矩阵,矩阵就是图!例如有向图与邻接矩阵的关系(无向图也有对应的):再例如(成对)欧式距离矩阵也可抽象为一幅无向图如下。类比,(成对)亲近度矩阵、成对余弦距离、协方差矩阵、相关性系数矩阵等都可以表示为图。

更进阶地,关联矩阵、度矩阵、拉普拉斯矩阵等都能反映图论与矩阵之间奇妙的关系!

  • 图可以用来分类/聚类,是图的特殊形态——如k-NN中的kd树、决策树、层次聚类等
  • 图神经网络(GNNs):图论的一种拓展,专门处理图结构数据。GNNs 能够在图上进行节点和边的信息传递,使得模型能够理解节点之间的复杂关系
  • 大语言模型(LLM):自然语言处理的应用主要体现在语言结构的建模上。语言结构可以被视为一个图,其中单词或子词是节点,语法和语义关系则是边
  • NetworkX工具   Python 编写的图论和复杂网络分析的开源软件包。提供了创建、操作和研究复杂网络结构的工具。—— 编程时需要导入的库

二、无向图

1、关键概念

  • 节点集:所有节点的集合(对象的集合)。
  • 边集:所有边的集合。
  • 阶(order):节点的数量。
  • 大小(size):边的数量。
  • 度(degree):无向图中,一个节点的度是与它相连的边的数量——针对一个节点来说
  • 邻居(neighbors):无向图中,一个节点的邻居是通过一条边直接相连的其他节点——针对一个节点来说
  • 端点(end vertex, end node):度数为1的节点。
  • 孤立点(isolated node, isolated vertex):度数为0的节点。

2、特殊结构

  • 自环:一个节点与它自己连接的叫做自环(圈)
  • 同构:节点名称、边名称、外观等都不同,但本质是的连接关系一致,即等价图
  • 多图:连接两个节点的边不止一条。对于某些应用很有用,如网络建模、流量分析等。
  • 子图:原始图的一部分
  • 有权图:一种图论中的数据结构,在无向图每条边上附加了一个权重或值,表示了连接两个节点之间的某种度量,例如距离、成本、时间等

三、有向图

除了节点集、边集、阶、大小、邻居等概念,有向图由于其边的方向性,度分为出度入度

  • 入度:指向该节点的边的数量——针对一个节点来说
  • 出度:从该节点出发的边的数量——针对一个节点来说
  • 其实,对应入度和出度,邻居也可分为入度邻居(上家)、出度邻居(下家)

特殊结构可类比无向图,除此之外,再介绍一个概念三元组

  • 三元组类型是指在社交网络或其他网络中,根据节点之间的连接关系,将节点组合成不同类型的三元组。三元组由 三个节点组成 ,它们之间存在 特定的连接模式。如下是三元组的16种模式:

非三元组的有向图里可能包含三元组,可拆分观察!!


四、图的可视化

可视化关键点

  • 节点:位置、标签、颜色、大小、记号、选择性绘制
  • 边:标签、颜色、线宽、线型、选择性绘制
  • 图的布局

1、节点位置

  • 绘制有向图和无向图用networkx.draw_networkx() 函数,参数pos可指定节点位置布局
  • networkx.spring_layout() 产生节点位置布局——使用弹簧模型算法将图的节点布局在平面上,模拟节点间的弹簧力和斥力关系:
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np# 创建无向图
G = nx.random_geometric_graph(200, 0.2, seed=888)# 使用弹簧模型算法布局节点
pos = nx.spring_layout(G, seed = 888)# 可视化
plt.figure(figsize = (6,6))
nx.draw_networkx(G, pos = pos, node_color = '#3388FF',alpha = 0.5,with_labels = False, node_size = 68)
plt.savefig('节点布局,弹簧算法布局.svg')

  • 直接输入节点位置坐标的字典

例如:字典里的位置坐标由随机数发生器生成:

# 自定义节点位置
data_loc = np.random.rand(200,2)
# 随机数发生器生成节点平面坐标# 创建节点位置坐标字典
pos_loc = {i: (data_loc[i, 0], data_loc[i, 1]) for i in range(len(data_loc))}# 可视化
plt.figure(figsize = (6,6))
nx.draw_networkx(G, pos = pos_loc, node_color = '#3388FF',alpha = 0.5,                 with_labels = False, node_size = 68)
plt.savefig('节点布局,随机数.svg')

也可以调节字典里的“节点-坐标”元素,实现完全二分图、圆周布局、螺旋布局等图。


2、节点装饰:大小、透明度、颜色

3、边装饰

颜色、线宽、选择性绘制边(比如仅仅保留欧式距离小于0.5的边)

4、节点标签

networkx.draw_networkx_labels() #标签即a、b、c、d对象名

5、常见图的绘制

networkx.balanced_tree() 创建平衡树图
networkx.barbell_graph() 创建哑铃型图
networkx.binomial_tree() 创建二叉图
networkx.bipartite.gnmk_random_graph() 创建随机二分图
networkx.bipartite_layout() 二分图布局
networkx.circular_layout() 圆周布局
networkx.complete_bipartite_graph() 创建完全二分图
networkx.complete_graph() 创建完全图
networkx.complete_multipartite_graph() 创建完全多向图
networkx.cycle_graph() 创建循环图
networkx.ladder_graph() 创建梯子图
networkx.lollipop_graph() 创建棒棒糖型图
networkx.multipartite_layout() 多向图布局
networkx.path_graph() 创建路径图
networkx.star_graph() 创建星型图
networkx.wheel_graph() 创建轮型图

五、路径问题

重要概念,注意包含关系:

  • 通道:沿图的边依次经过一系列节点的序列,可包含重复边或经过相同节点。
  • 迹:无重复边的通道,可以包含重复节点。
  • 路径:无重复边、无重复节点的通道。
  • 回路:闭合的迹。
  • 环:闭合的路径。

几种常见路径问题对比:

networkx常用代码:

networkx.algorithms.approximation.christofides() 使用 Christofides 算法为加权图找到一个近似最短
哈密顿回路的
networkx.all_simple_edge_paths() 查找图中两个节点之间所有简单路径,以边的形式返回
networkx.all_simple_paths() 查找图中两个节点之间所有简单路径
networkx.complete_graph() 生成一个完全图,图中每对不同的节点之间都有一条边
networkx.DiGraph() 创建一个有向图
networkx.find_cycle() 在图中查找一个环
networkx.get_node_attributes() 获取图中所有节点的指定属性
networkx.has_path() 检查图中是否存在从一个节点到另一个节点的路径
networkx.shortest_path() 计算图中两个节点之间的最短路径
networkx.shortest_path_length() 计算图中两个节点之间最短路径的长度
networkx.simple_cycles() 查找有向图中所有简单环
networkx.utils.pairwise() 生成一个节点对的迭代器,用于遍历图中相邻的节点对

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248192.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

工业控制:CANOpen(控制器局域网络)协议快速学习

文章目录 背景协议介绍CAN总线协议CANOpen协议介绍CANOpen诞生背景CANOpen的对象字典 CANOpen的服务数据对象(SDO) 参考附录问题CAN总线竞争原理在CAN协议中,帧中的ID是发送者的ID还是接收者的ID? 背景 目前很多CANOpen介绍的文章…

【操作系统】文件管理——文件存储空间管理(个人笔记)

学习日期:2024.7.17 内容摘要:文件存储空间管理、文件的基本操作 在上一章中,我们学习了文件物理结构的管理,重点学习了操作系统是如何实现逻辑结构到物理结构的映射,这显然是针对已经存储了文件的磁盘块的&#xff0…

简单实用的企业舆情安全解决方案

前言:企业舆情安全重要吗?其实很重要,尤其面对负面新闻,主动处理和应对,可以掌握主动权,避免股价下跌等,那么如何做使用简单实用的企业舆情解决方案呢? 背景 好了,提取词…

【React打卡学习第一天】

React入门 一、简介二、基本使用1.引入相关js库2.babel.js的作用 二、创建虚拟DOM三、JSX(JavaScript XML)1.本质2.作用3.基本语法规则定义虚拟DOM时,不要写引号。标签中混入JS表达式时要用{}。样式的类名指定不要用class,要用className.内联…

中国贸易外经统计年鉴(2006-2023年)

数据年限:2006-2023年全 数据格式:pdf、excel、caj 数据内容:《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

Web前端知识视频教程分享

资料下载地址: https://545c.com/f/45573183-1323782723-42d3b2?p7526 (访问密码: 7526)

mysql的索引事务和存储引擎

一、索引 1、索引 索引的概念 :索引是一个排序的列表,在列表当中存储索引的值以及索引值对应数据所在的物理行。 索引的引用: 使用索引之后,就不需要扫描全表来定位某行的数据。 加快数据库的查询速度。 索引可以是表中的一…

智慧园区解决方案PPT(44页)

智慧园区解决方案摘要 一、引言 随着科技的飞速发展,智慧化已成为园区建设与发展的重要趋势。然而,传统园区在智慧化方面仍存在诸多不足,如政企互动便捷化不足、园区治理智能化单一、运营生态化缺失等问题。为此,我们提出了以“…

TI 【ads131m02】DSP TMS320F280049C调试与学习笔记

ads131m02 调试与学习笔记 时序SPI 参考链接: ADS131M02_TI官网资料参考 ADS131M02—英文使用手册 ADS131M0x—参考代码 Example C Code ADS131M02 是一款 two 通道、同步采样、24 位、ΔΣ 模数转换器 (ADC),具有宽动态范围、低功耗和电能测量特定功能…

二叉树的构造

二叉树的构造(前后序用来确定根的位置,中用来划分左右子树 最大二叉树(递归要先写终止条件 终止条件 终止条件 每次找最大的结点为分界点以及根节点,左边构成左子树,右边构成右子树,递归 class Solution {…

【Docker】Docker-harbor私有仓库部署与管理

目录 一.Harbor 概述 1.什么是Harbor 2.Harbor的特性 3.Harbor的构成 二.Harbor 部署 1.部署 Docker-Compose 服务 2.部署 Harbor 服务 3.启动 Harbor 4.创建新项目 5.创建用户 6.本地上传镜像 7.从Harbor下载镜像 三.镜像同步 1.定时拉取 2.主动推送 四.管理 …

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说:“屏幕不够,滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不,从 SwiftUI 5.0(iOS 17)开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

双向链表_代码实现

代码实现的专题:只有手撕代码:),附上重点注释;重要的环节,会配上相应的调试截图与运行截图 。 总之,重点在代码,关于基础理论部分:(还在写) 定义…

Python数据可视化之numpy的11个常用的创建数组的函数

numpy库 在处理成千上万的数据时,Python的1维列表已经不适合来对数据进行处理,效率会很慢,所以numpy就诞生了,他可以将列表变成数组,而数组可以是1维、2维、3维甚至更高纬度,可用于存储和处理大型的矩阵&a…

js | Core

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ Object 是什么? 属性[[prototype]]对象。 例如,下面的,son是对象,foo不是对象。打印出来的son,能看到有一个prototype 对象。 prototype vs _proto_ v…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台,由 LinkedIn 开发并在 2…

【BUG】已解决:WslRegisterDistribution failed with error: 0x800701bc

已解决:WslRegisterDistribution failed with error: 0x800701bc 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武…

Word文档恢复竟然这么简单?3个推荐方案送上!

“我很喜欢用Word进行文字创作,可是我有一次重新打开我的Word文档,却显示文档已丢失,这该怎么办呢?凝聚我多年心血的文章还有可能恢复吗?” 不论是总结学习内容还是汇报工作成果,我们总会用上Word。Word作…

level 6 day2 网络基础2

1.socket(三种套接字:认真看) 套接字就是在这个应用空间和内核空间的一个接口,如下图 原始套接字可以从应用层直接访问到网络层,跳过了传输层,比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

大数据量接口响应慢-传输优化

问题 接口一次性返回大量数据,导致JSON数据大小过大,带宽大小不足,导致接口响应时间过长 解决方案 通过数据传输压缩来降低传输数据的大小,从而提高传输效率 服务器端压缩 springboot项目配置application文件,通过…