图的概念(1)

news2024/11/23 12:01:23

图是什么?

首先,我们导入需要的包?

import numpy as np
import random
import networkx as nx
from IPython.display import Image
import matplotlib.pyplot as plt

图的定义?

图表示物件与物件之间关系的数学对象,是图论的基本研究对象。
举个例子,一个简单的图可能是这样哒。
在这里插入图片描述
节点(node)用红色标出,通过黑色的边(edge)组成。

图可以用于表示:

  • 社交网络
  • 网页
  • 生物网络

我们可以在图上执行怎样的分析?

  • 研究拓扑结构和连接性
  • 群体检测
  • 识别中心节点
  • 预测缺失节点
  • 预测缺失的边。

  • 首先,我们在第一个笔记本中导入一个预构建的图:
# Load the graph
G_karate = nx.karate_club_graph()
# Find key-values for the graph
pos = nx.spring_layout(G_karate)
# Plot the graph
nx.draw(G_karate, cmap = plt.get_cmap('rainbow'), with_labels=True, pos=pos)

在这里插入图片描述

空手道俱乐部图

这个「空手道」图表示什么?Wayne W. Zachary 在 1970 到 1972 年这三年中研究的一个空手道俱乐部的社交网络。该网络包含了这个空手道俱乐部的 34 个成员****,成员对之间的连接表示他们在俱乐部之外也有联系。在研究期间,管理员 JohnA 与教练 Mr.Hi(化名)之间出现了冲突导致俱乐部一分为二。一半成员围绕 Mr.Hi 形成了一个新的俱乐部,另一半则找了一个新教练或放弃了空手道。基于收集到的数据,除了其中一个成员,Zachary 正确分配了所有成员在分裂之后所进入的分组

图的基本表示方法

  • G = ( V , E ) G = (V,E) G=VE由下列要素构成:
  • 一组节点,(也称为verticle) V = 1 , 2 , . . . , n V = 1,2,...,n V=1,2,...,n
  • 一组边:E ⊆ \subseteq V × \times ×V
  • ( i , j ) ∈ E 连 接 了 节 点 i 和 j (i,j) \in E连接了节点i和j (i,j)Eij
  • i i i j j j被称为相邻节点。
  • 节点的度(degree)是指相邻节点的数量。
    在这里插入图片描述
    节点、边和度的示意图
  • 如果一个图的所有节点都有 n − 1 n - 1 n1个相邻节点,则该图是完备的(complete). 也就是说所有节点都具备所有可能的连接方式。
  • i i i j j j的路径,是指从 i i i到达 j j j的边的序列,该路径的长度等于所经过边的数量。
  • 图的直径, 是指连接任意两个节点的所有最短路径中的最长路径长度
    举个例子,在这个案例中,我们可以计算出一些连接任意两个节点的最多路径,该图直径为3,因为,没有任意两个节点之间最多路径长度超过3.
    在这里插入图片描述
    一个直径为3的图。
  • 测地路径,指两个节点之间的最短路径。
  • 如果所有节点都可通过某个路径连接到彼此,则它们构成一个连通分支。
  • 如果一个图仅有一个连通分支,则该图是连通的。
    举个例子:下面是一个有两个不同连通分支的图:
    在这里插入图片描述
    一个有两个连通分支的图。
  • 如果一个图的边是有顺序的配对,则该图是有向的, i i i的入度是指向 i i i的边的数量,出度(out-degree)是远离 i i i的边的数量。
    在这里插入图片描述
    有向图
  • 如果可以回到一个给定的节点,则改图是有环的。相对地,如果至少有一个节点无法回到,则该图是无环的。
  • 图可以被加权,即在节点或关系上施加权重。
  • 如果一个图边的数量相比节点的数量较小,则该图是稀疏的。相对地,如果节点之间的边非常多,则该图是密集的。
    Neo4J关于图算法给出的清晰明了的总结:
    在这里插入图片描述

可以用代码实现上面的东西都行啦

.degree() 属性会返回该图的每个节点的度(相邻节点的数量)的列表:

n=34
print(G_karate.degree())
degree_sequence = list(G_karate.degree())

计算边的数量,但也计算度序列的度量:

nb_nodes = n
nb_arr = len(G_karate.edges())
avg_degree = np.mean(np.array(degree_sequence)[:,1])
med_degree = np.median(np.array(degree_sequence)[:,1])
max_degree = max(np.array(degree_sequence)[:,1])
min_degree = np.min(np.array(degree_sequence)[:,1])
》# 最后,打印所有信息:
print("Number of nodes : " + str(nb_nodes))
print("Number of edges : " + str(nb_arr))
print("Maximum degree : " + str(max_degree))
print("Minimum degree : " + str(min_degree))
print("Average degree : " + str(avg_degree))
print("Median degree : " + str(med_degree))

绘制度的直方图

平均而言,该图中的每个人都连接了 4.6 个人。

我们可以绘出这些度的直方图:

degree_freq = np.array(nx.degree_histogram(G_karate)).astype(‘float’)
plt.figure(figsize=(12, 8))
plt.stem(degree_freq)
plt.ylabel(“Frequence”)
plt.xlabel(“Degre”)
plt.show()

在这里插入图片描述
通过上图可以看出,度的直方图相当重要,上图可以用于确定我们图的种类。

如何存储图

存储图有三种方式,取决于你想用其做什么?

  • 存储为边的列表.
    在这里插入图片描述
  • 我们存储有边连接的每一对节点ID:例如:

G_karate.edges()

  • 使用邻接矩阵,这通常是在内存中加载的方式。
    对于图中每一个可能的配对,如果两个节点有边相连,则设为1,如果该图是无向图,则A是对称的。
    在这里插入图片描述
  • 使用邻接列表。
    在这里插入图片描述
    这三种方式都是等价的,我们可以根据使用场景来选择图的存储方式。

图的类型和性质

  • 同构图和异构图
    两个图G和H是同构图,能够通过重新标记图G的顶点而产生图H。

  • 如果G和H是同构,那么它们的阶是相同的,它们大小是相同的,它们的顶点度数也对应相同。

  • 异构图是一个与同构图相对应的概念。
    传统同构图,数据中只存在一种节点和边,因此,在构建图神经网络时,所有节点共享同样的模型参数并且拥有同样维度的特征空间。

  • 异构图:可以存在不只一种的节点和边,因此,允许不同类型的节点拥有不同维度的特征和属性

主要的图算法

目前大多数图算法支持的类别主要有三个:

  • Pathfinding(寻路):根据可用性和质量等条件确定最优路径。我们也将搜索算法包含在这一类别中。这可用于确定最快路由或流量路由
  • Centrality(中心性):确定网络中节点的重要性。这可用于识别社交网络中有影响力的人或识别网络中潜在的攻击目标
  • Community detection(社群检测):评估群体聚类的方式。这可用于划分客户或检测欺诈等。

我们只介绍networkx中实现的最常见的基本算法。

寻路和图搜索算法

  • 寻路算法是通过最小化跳(hop)的数量来寻找两个节点之间的最短路径。
  • 搜索算法不是给出最短路径,而是根据图的相邻情况或深度来探索图。这可用于信息检索

搜索算法

图搜索算法主要有两种:

  • 宽度优先搜索:
    首先探索每个节点的相邻节点,然后探索相邻节点的相邻节点
  • 深度优先搜索
    :会尝试尽可能地深入一条路径,如有可能便访问新的相邻节点

在这里插入图片描述

寻路算法

最短路径:

  • 最短路径计算的是一对节点之间的最短的加权(如果图有加权的话)路径。
    这可以用于确定最优的驾驶方向或社交网络上两个人之间的分离程度。

  • 单源最短路径
    单源最短路径(Single Source Shortest Path/SSSP)是找到给定节点与图中其它所有节点之间的最短路径

这常用于IP网络的路由协议:

  • 所有配对最短路径
    所有配对最短路径(All Pairs Shortest Path / APSP)算法是找到所有节点对之间的最短路径。

尽管能够提供相近的结果,但这比为每个节点对调用单源最短路径算法更快。该算法通常可用于确定交通网格的不同分区的流量负载

  • 最小权重生成树

最小权重生成树(minimum spanning tree)是图(一个树)的一个子图,其用权重和最小的边连接了图中的所有节点

注意:最小生成树应该用于无向图。
在这里插入图片描述

社群检测

社群检测时根据指定的质量指标将节点划分为多个分组。

这通常可用于识别社交社群、客户行为或网页主题。 社区是指一组相连节点的集合。但是,目前关于社群还没有广泛公认的定义,只是社群内的节点应该要密集地相连

在这里插入图片描述
Girvan Newman 算法是一个用于发现社群的常用算法。其通过逐步移除网络内的边来定义社区。我们将居间性称为「边居间性(edge betweenness)」。这是一个正比于穿过该边的节点对之间最短路径的数量的值

该算法步骤如下:

  • 计算网络中所有已有边的居间性
  • 移除居间性最高的边.
  • 移除该边后,重新计算所有边的居间性。
  • 重复步骤 2 和 3,直到不再剩余边。

分层聚类

在分层聚类中,我们构建聚类的层次结构,我们用树状图的形式表示聚类。

在这里插入图片描述
其思想是以不同的规模分析社群结构,我们通常自下而上构建树状图,从每个节点一个聚类开始,然后合并两个最近的节点。
在这里插入图片描述
要得到最大连接,在每个步骤,被最短距离分开的两个聚类被组合到一起相似度距离可用以下示意图阐释:
在这里插入图片描述

学习心得

慢慢的将各种图的概念和心得,全部将其搞定,全部学习完整都行啦的样子与打算。全部将其搞定都行啦的理由与样子。

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

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

相关文章

Metasploit入门用法

靶机介绍 Difficult: As always, it’s a very easy box for beginners. Goal: Get flag Download:https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 解题过程: 1.使用nmap进行端口扫描:Nmap -sV IP 2.使用search命令查…

yolov5加入分割头,多任务头

Yolov5同时进行目标检测和分割分割_MidasKing的博客-CSDN博客_yolov5分割 用YOLOv5ds训练自己的数据集,注意点!_用猪头过日子.的博客-CSDN博客 基于pytorch用yolov5算法实现目标检测与分割_无损检测小白白的博客-CSDN博客 原理 代码:

一种三自由度机器人的设计(CAD+Solidworks+文档)

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1课题研究背景及其意义 1 1.2三自由度机器人的发展与现状 1 1.3三自由度机器人的原理和介绍 3 1.4三自由度机器人目前存在问题 4 1.5三自由度机器人的力控制问题 4 1.6三自由度机器人的发展趋势 5 第2章 总体技术方案及系统组成 7 2.…

[附源码]SSM计算机毕业设计电子病历信息管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

AVL的单旋和双旋—附图超详细

文章目录前言:AVL 的插入寻找插入位置更新平衡因子调整AVL右旋左旋左右双旋右左双旋完整代码前言: 我们知道二叉排序树的搜索效率很高,能达到(logn)的时间复杂度,但是当元素有序导致二叉搜索树变成了一个长条(图左&am…

游戏优化之空间划分

使用的动机 定义:将对象根据它们的位置存储在数据结构中,来高效地定位对象。 在游戏中,AI向最近的敌人攻击是很常见的,但如果有很多单位的话,他们AI需要频繁的查找单位,然后在检测是不是距离最近的单位&a…

Git工具使用全解

Git工具使用全解 文章目录Git工具使用全解1.企业开发中的版本控制器2.Git工具的使用场景3.Git工具操作流程(三板斧操作)4.Git工具的安装与常用命令4.1 Git的安装4.2 Git基本操作指令5.Git工具常见问题解决5.1 常见问题:分支冲突解决办法5.2 常见问题:合并…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包第三方库的使用静态库的使用动态库的使用在系统层面上的动态链接理解何为动静态库 静态库(.a):在程序编译链接时将静态库二进制码拷贝到程序代码中,程序运行时不再需要外部的静态库…

面试:类相关---Java、Android有哪些类加载器

Android类加载器与Java类加载器的对比 - 掘金 Android | 类加载器与插件化 - 简书 相关复习: 面试:热修复原理_沙漠一只雕得儿得儿的博客-CSDN博客_android 热修复原理面试 面试:类的初始化过程_沙漠一只雕得儿得儿的博客-CSDN博客 什么…

内置 230+ 工具,它值得被官方纳入标准库

经过了几十年的发展,Python 的轮子生态越来越丰富,例如针对网络请求有 requests,针对命令行开发有 typer 等等,这些第三方库给我们的日常开发带来了极大的便利。 今天我推荐另一个第三方库 – Boltons,和大多数第三方…

go语言之不必要的拷贝

其实我也是个golang开发者~~ Go语言本来就以轻量快速著称,一位GitHub员工却偶然发现: 只改变一个字符的位置,能把一段代码运行速度提高足足42%。 简直就像是…… 这个简单有效的技巧一经发布,就引来众多程序员围观。 原作者自己…

论文中常见的拟合散点验证图(R语言版)

论文中常见的拟合散点验证图(R语言版) 如上图所示,是论文中常见的validation图,python也能实现相似的图绘。 今天先介绍R语言版,python改期再介绍吧 这张图需要依次实现下列功能: data实测与data模拟的散…

RabbitMQ系列【11】延迟队列

有道无术,术尚可求,有术无道,止于术。 文章目录前言1. 过期消息实现延迟队列2. 过期队列实现延迟队列3. 插件实现延迟队列3.1 安装插件3.2 代码实现3.3 测试前言 延迟队列:即消息进入队列后不会立即被消费,只有到达指…

MySQL事务隔离机制 -- 必须说透

文章目录前言一、什么是数据库事务二、事务并发带来的4类问题三、事务4种隔离级别四、Mysql演示4种隔离级别总结前言 如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机制、锁机制、MVCC机制,用一…

c# 实验七 图像列表框及树形视图控件的使用

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:《项目专栏》 📧如果文章知识点有错误的地方&#xf…

[附源码]java毕业设计四六级考试管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

m基于matlab的wcdma软切换算法的研究分析和仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 软切换是WCDMA系统的关键技术之一,软切换算法和相关参数的设置直接影响着系统的容量和服务质量。通过WCDMA系统的软切换技术可以提高小区覆盖率和系统容量。所以软切换技术是…

【ASM】字节码操作 工具类与常用类 LocalVariablesSorter 类 简单介绍与使用

文章目录 1.概述2. LocalVariablesSorter#2.1 class info2.2 fields3.案例3.1 编码实现3.2 编码实现v21.概述 在上一节:【ASM】字节码操作 工具类与常用类 GeneratorAdapter 介绍 我们知道了对于GeneratorAdapter 类来说,它非常重要的一个特点:将一些visitXxx()方法封装成一…

Java面向对象详解(上)

Java面向对象详解(上)🪅面向对象与面向过程的区分✨面向过程:✨面向对象:🪅类是什么?🪅对象是什么?🪅类的结构🪅类中方法:✨成员方法与…

实战讲解SpringBoot启动时自动加载数据库数据到内存:通过回调方法自动运行Bean(图+文+源码)

1 缘起 在补充SpringCloud网关(Gateway)配置白名单相关知识过程中, 有两种实现方案: (1)SpringBoot的启动配置文件application.yml进行配置; (2)自动加载MySQL数据库中的…