【图算法】(2) 网络的基本静态几何特征(一),附networkx完整代码

2024-03-03 00:50

本文主要是介绍【图算法】(2) 网络的基本静态几何特征(一),附networkx完整代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,今天和大家分享一下图算法中的静态几何特征,以及如何使用python中的networkx库实现度分布、效率、直径、距离、度-度相关性、介数、核度。内容较多,可通过右侧目录栏跳转。


1. 度分布

1.1 节点的度

以无向网络为例。在网络中,节点 V_{i} 的邻边数 K_{i} 称为该节点的度,是根据网络的邻接矩阵 A_{ij} 求得的。计算公式如下:

K_{i}=\sum _{j=1}^{N}A_{ij} = \sum_{i=1}^{N}A_{ij}

对网络中所有节点的度求平均,可得到网络的平均度 \hat{k}

\hat{k} = \frac{1}{N}\sum _{i=1}^{N}k_{i}=\frac{2L}{N}=tr(A^{2})/N

无向无权图的邻接矩阵 A 的二次幂 A^{2} 的对角元素 a_{ii}^{(2)} 就是节点 V_{i} 的邻边,即 k_{i}=a_{ii}^{(2)} 。实际上,无向无权图的邻接矩阵 A^{2} 的第 i 行或第 i 列的元素之和也是。从而无向无权网络的平均度就是 A^{2} 对角线元素之和除以节点数,即 \hat{k} = tr(A^{2})/N,式中 tr(A^{2})/N 表示矩阵 A^{2} 的迹,即对角线元素之和。


1.2 度分布

大多数实际网络中的节点的度是满足一定的概率分布的。定义 p(k) 为网络中度为 k 的节点在整个网络中所占的比例

规则网络:由于每个节点具有相同的度,所以其度分布集中在一个单一尖峰上,是一种Delta分布。

完全随机分布:度分布具有泊松分布的形式,每一条边的出现概率是相等的,大多数节点的度是基本相同的,并接近于网络平均度 ,若远离峰值,度分布则按指数形式急剧下降。把这类网络称为均匀网络。

无标度网络:具有幂指数形式的度分布,即 p(k)\propto k^{-\gamma } ,所谓无标度是指一个概率分布函数 F(x) 对于任意给定常数 a 存在常数 b 使得 F(ax) 满足 F(x)=bF(x)

幂律分布:是唯一满足无标度条件的概率分布函数。许多实际大规模无标度网络,其幂指数通常为 2\leq \gamma \leq 3 ,绝大多数节点的度相对很低,也存在少量度值相对很高的节点,把这类网络称为非均匀网络(异质网络)

指数度分布网络:满足 p(k)\propto e^{-K/k} ,式中 k>0 一般为常数。


1.3 累计度分布

使用累计度分布函数描述度的分布情况,它与度分布的关系是: p_{k}=\sum_{x=k}^{\propto}p(x) ,它表示度不小于k的节点的概率分布。

度分布为幂律分布,即 p(k)\propto k^{-\gamma } ,则相应的累积度分布函数符合幂指数为 \gamma -1 的幂分布:

p_{k}\propto \sum_{x=k}^{\bowtie }x^{-\gamma }\propto k^{-(\gamma -1)}

度分布为指数分布,即 p(k)\propto e^{-K/k},则相应的累计度分布函数符合同指数的指数分布

p_{k}\propto \sum_{x=k}^{\bowtie }e^{-x/k}\propto e^{-K/k}


1.4 代码实现

1.4.1 泊松分布--ER随机网络

度分布的峰值所对应的横坐标就是网络的平均度

创建ER网络: nx.erdos_renyi_graph( 节点数, 连边概率 )

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt# 创建一个ER随机网络为例
n = 10000  # 网络节点数
p = 0.001  # 连边的概率0.001
# 生成ER网络
ER = nx.erdos_renyi_graph(n, p)# 计算获取网络每个节点的度
d = dict(nx.degree(ER))
# 计算平均度=总度数/结点数
d_avg = sum(d.values()) / len(ER.nodes)  # 10.026# 获取所有的度的值,及其对应的概率
# x记录有哪些度值
x = list(range(max(d.values())+1))
# 获取每个度值出现的次数
d_list = nx.degree_histogram(ER)
# y计算每个度值对应的出现概率=每个度值对应的结点个数/总节点数
y = np.array(d_list) / n# 绘制度分布
plt.plot(x, y, 'o-')
plt.xlabel('du_num')
plt.ylabel('du_prob')
plt.show()

 度分布曲线如下:


1.4.2 幂律分布--BA无标度网络

BA网络需要在双对数坐标轴下绘制,并且由于0值对应的无穷大没有意义,绘制时需要把0值剔除掉。

创建BA网络:nx.barabasi_albert_graph( 节点数, 平均度/2 )

import networkx as nx
import numpy as np
import matplotlib.pyplot as pltn = 10000  # 网络节点数
m = 3  # 平均度=6
# 生成网络
BA = nx.barabasi_albert_graph(n, m)# 获取网络每个节点的度
d = dict(nx.degree(BA))
# 计算平均度=节点度总数/节点总数
d_avg = sum(d.values()) / len(BA.nodes)  # 5.9982# 获取所有出现的度值
x = list(range(max(d.values())+1))
# 获取每个度出现的次数
d_list = nx.degree_histogram(BA)
# 计算没个度值出现的概率=每个度值对应的结点个数/总结点数
y = np.array(d_list) / len(BA.nodes)#(1)在普通坐标轴下绘制度分布图
plt.plot(x, y, 'o-', color='b')
plt.xlabel('du_num')
plt.ylabel('du_prob')
plt.show()#(2)在双对数坐标轴下绘制,由于坐标中存在0出现无穷大的情况
plt.plot(x, y, 'o-', color='r')
plt.xscale('log')
plt.yscale('log')
plt.xlabel('du_num')
plt.ylabel('du_prob')
plt.grid()
plt.show()#(3)在双对数坐标轴下绘制,并且把点0值坐标排除
new_x = []
new_y = []
# 删除0值
for i in range(len(x)):if y[i] != 0:new_x.append(x)new_y.append(y)# 绘图
plt.plot(new_x, new_y, 'o-', color='g')
plt.xscale('log')
plt.yscale('log')
plt.xlabel('du_num')
plt.ylabel('du_prob')
plt.grid()
plt.show()

第一张是在普通坐标系下,第二张是双对数坐标系下,第三张是双对数坐标系下删除0值


2. 网络的效率、直径和平均距离

2.1 方法介绍

网络中的两节点 V_{i} 和 V_{j} 之间经历边数最少的一条简单路径(经历的边各不相同),称为测地线

测地线的边数 d_{ij} 称为两节点 V_{i} 和 V_{j} 之间的距离两节点之间的最短路径长度

1/d_{ij} 称为节点 V_{i} 和 V_{j} 之间的效率,记为 \varepsilon _{ij},通常效率用来度量节点之间的信息传递速度。当 V_{i} 和 V_{j} 之间没有路径连通时,d_{ij}=\Join,而 \varepsilon _{ij}=0 。所以效率很适合度量非全连通网络。

网络的直径D定义为所有距离 d_{ij} 中的最大值D=max_{1\leq i,j \leq N}d_{ij}

平均距离(特征路径长度)L定义为所有节点对之间距离的平均值,它描述了网络中节点间的平均分离程度,即网络有多小,计算公式为:

L=\frac{1}{N^{2}}\sum_{N}^{j=1}\sum_{N}^{i=1}d_{ij}

对于无向图来说,d_{ij}=d_{ji} 且 d_{ii}=0,那么上面的公式可以简化为:

L=\frac{2}{N(N-1)}\sum_{i=1}^{N}\sum_{j=i+1}^{N}d_{ij}

很多实际网络虽然节点数巨大,但平均距离却很小,这称为小世界效应。


2.2 代码实现

网络直径: nx.diameter( Graph )

两个节点之间的效率: nx.efficiency( Graph, 节点1, 节点2 )

两个节点之间的最短路径: nx.shortest_path_length( Graph, 节点1, 节点2 )

网络的局部效率: nx.local_efficiency( Graph )

网络的全局效率: nx.global_efficiency( Graph )

网络的平均距离: nx.average_shortest_path_length( Graph )

import networkx as nx#(1)直径
# 创建1000各节点,平均度为6的BA网络
G1 = nx.barabasi_albert_graph(1000, 3)
# 计算网络的直径=6
print( nx.diameter(G1) )#(2)效率
# 计算节点1和5之间的效率=0.5
print( nx.efficiency(G1,1,5) )#(3)最短路径
# 计算节点1和5之间最短路径长度=2
print( nx.shortest_path_length(G1,1,5) )# 效率==最路距离长度的倒数#(4)局部效率
print( nx.local_efficiency(G1) )  # 0.03958432238854824#(5)全局效率
print( nx.global_efficiency(G1) )  # 0.30804264264331954#(6)求整个网络的平均距离
# 1k个节点只有3.4的平均距离,距离很小
print( nx.average_shortest_path_length(G1) )  # 3.4374934934934935

4. 度-度相关性

4.1 基于最近邻平均度值的度-度相关性

度-度相关性描述了网络中度大的节点和度小的节点之间的关系。若度大的节点倾向于和度大的节点连接,则网络是度-度正相关的;反之,若度大的节点倾向于和度小的节点连接,则网络是度-度负相关的

节点 V_{i} 的最近邻平均度值把节点 Vi 的邻居的度值加起来求平均,公式如下:

 k_{nn,i}=[\sum _{j}a_{ij}k_{j}] / k_{i}

式中,k_{i} 表示节点 V_{i} 的度值,a_{ij} 为邻接矩阵元素。

所有度值为 k 的节点的最近邻平均度值的平均值 k_{nn}(k),公式如下:

k_{nn}(k)=[\sum _{i,k_{i}=k}k_{nn,i}] / [N\cdot p(k)]

式中,N 表示节点总数,p(k) 为度分布函数。

如果 k_{nn}(k) 是随着 k 上升的增函数,则说明度值大的节点倾向于和度值大的节点连接,网络具有正相关特性,称之为同配网络;反之是单调递减函数,则网络具有负相关特性,称之为异配网络。


4.2 代码实现

import networkx as nx
# 参数是网络
def average_nearest_neighbor_degree(G):# 获取所有可能的度k = set([G.degree(i) for i in G.nodes()])# 从小到大排序所有的度sorted_k = sorted(k)# 求所有度值对应的最近邻平均度k_nn_k = []for ki in sorted_k:c = 0k_nn_i = 0for i in G.nodes():if G.degree(i) == ki:k_nn_i += sum([G.degree(j) for j in list(nx.all_neighbors(G,i))]) / kic += 1k_nn_k.append(k_nn_i/c)# 返回所有可能的度,以及度对应的最近邻平均度return sorted_k, k_nn_k


5. 介数

5.1 概念介绍

要衡量一个节点的重要程度,其度值当然可以作为一个衡量指标,但又不尽然,例如在社会网络中,有的节点的度虽然很小,但它可能是两个社团的中间联络人,如果去掉该节点,那么就会导致两个社团的联系中断,因此该节点在网络中起到极其重要的作用。对于这样的节点,需要定义另一种衡量指标,这就引出了另一种重要的全局几何量--介数

介数分为节点介数和边介数两种,反映了节点或边在整个网络中的作用和影响力

节点的介数 Bi 定义如下:

B_{i}=\sum _{j \neq l \neq i }[N_{jl} (i)/N_{jl}]

式中,N_{jl} 代表节点 V_{j} 和 V_{l} 之间的最短路径条数,N_{jl}(i) 表示节点 V_{j} 和 V_{l} 之间的最短路径经过节点 V_{i} 的条数。

边的介数 Bij 定义如下:

B_{ij}=\sum _{(l,m) \neq(i,j) }[N_{lm} (e_{ij})/N_{lm}]

式中,N_{lm} 代表节点 V_{l} 和 V_{m} 之间的最短路径条数,N_{lm}(e_{ij}) 表示节点 V_{l} 和 V_{m} 之间的最短路径经过边 e_{ij} 的条数


5.2 代码实现

计算每个节点的介数: nx.betweenness_centrality( Graph )

计算每条连边的介数: nx.edge_betweenness_centrality( Graph )

import networkx as nx
# 首先创建一个BA无标度网络
BA = nx.barabasi_albert_graph(20, 2)#(1)计算每个节点的介数
bc = nx.betweenness_centrality(BA)
# 以字典保存,键是节点,值是介数
print(bc)
# 获取介数最大的节点标签
max_id = max(bc, key=bc.get)
print(max_id)  # 3 #(2)计算每条边的介数
ebc = nx.edge_betweenness_centrality(BA)
# 以字典保存,键是边,值是介数
print(ebc)
# 获取介数最大的连边的标签
max_ebc = max(ebc, key=ebc.get)
print(max_ebc)  #(3,8)# 绘制网络
nx.draw(BA, node_size=500, with_labels=True)

绘制网络图


6. 核度

6.1 概念介绍

一个图的 k-核 是指反复去掉度值小于 k 的节点及其连线后,所剩余的子图,该子图的节点数就是该核的大小

若一个节点属于 k-核,而不属于 (k+1)-核 ,则此节点的核度为 k

节点核度的最大值叫做网络的核度。

节点的核度可以说明节点在核中的深度核度的最大值自然就对应着网络结构中最中心的位置。k-核 解析可用来描述度分布所不能描述的网络特征,揭示源于系统特殊结构和层次性质。

如下图所示,首先设定一个阈值ks=1,将网络中所有节点的度小于等于1的节点全部删除,直到网络中不存在度小于等于1的节点。有的节点一开始的度是大于1的,但是由于邻接的节点的度是1被删除了,从而导致这个节点的度小于等于1,也要被删除。


6.2 代码实现

计算每个节点的核度: nx.core_number( Graph )

import networkx as nx
# 首先创建一个club网络
kcg = nx.karate_club_graph()# 计算每个节点的核度
ks = nx.core_number(kcg)
# 以字典类型保存,键是节点,值是节点的核度
print(ks)# 获取核度最大的节点标签
max_id = max(ks, key=ks.get)
print(max_id)  # 0# 绘制网络
nx.draw(BA, node_size=500, with_labels=True)

绘制网络图

这篇关于【图算法】(2) 网络的基本静态几何特征(一),附networkx完整代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767942

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO