图的基本知识

1、什么是图

图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge)组成。
在这里插入图片描述
如上图所示: 杰斯、维克托、凯特琳等任务是一个节点、人物之间有朋友、敌对等等关系,这种的点边关系就构成了图。

2、图的表示

值得注意的是,图的顶点集合不能为空,但边的集合可以为空。图可能是无向的,这意味着图中的边在连接顶点时无需区分方向。否则,称图是有向的。
在这里插入图片描述

如何去表示一张图?

我们截取上面双城之战任务关系图中的一部分:
在这里插入图片描述
如上图总共有5个人物,人物之间如果有关系,我们在表格中对应填1
对应邻接表邻接矩阵如下:
在这里插入图片描述

3、图的性质:度

在这里插入图片描述

对于无向图来说,无向图的度:
A :3
B: 2
C:2
D:1

对于有向图来说,有向图的度分为出度和入度:
A:出度 2,入度 1
B:出度 1,入度 1
C:出度 1,入度 1
D:出度 0,入度 1

4、连通图、连通分量

在这里插入图片描述
很直观的看出,右图中有一个节点E是一个孤立节点,因此右图是一个非连通图。

无向图G的极大连通子图称为G的连通分量( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。

有向图连通性

强连通图:是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。

弱连通图:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
在这里插入图片描述

5、度中心性

度中心性(Degree Centrality)是在网络分析中刻画节点中心性(Centrality)的最直接度量指标。一个节点的节点度越大就意味着这个节点的度中心性越高,该节点在网络中就越重要。
在这里插入图片描述
在这里插入图片描述
范德尔 = 3/(5-1) = 0.75
小不点 = 2/(5-1) = 0.5
希尔科 = 1/(5-1) = 0.25

特征向量中心性

在这里插入图片描述

中介中心性

计算公式:
在这里插入图片描述

其中dst表示s到t的最短路径数量,dst()表示从s到t的最短路径中经过节点的数量。
若需要进行标准化,在如上公式基础上,除以(n-1)(n-2),n为节点数量。

举例说明:
在这里插入图片描述
A的中介中心性值为0
因为所有顶点之间的最短路径都不经过A。

B的中介中心性值为8,标准化后为:8/(6*7)

因为有以下路径经过B。
从A出发的最短路径和从A出发的经过B的最短路径条数一致,都是是5,路径如下:

  • ABD
  • ABC
  • ABDE
  • ABDF
  • ABCE
    则从A出发的顶点的对B的贡献为1/1 + 1/1 + 1/1 + 2/2 = 4(因为ABDE和ABCE起始点和终点相同)

没有从B出发的经过B最短路径。

从C出发的经过B的最短路径条数是1,路径为CBA,CA之间的最短路径为CBA
则从C出发的顶点的对B的贡献为1/1 = 1

从D出发的经过B的最短路径条数是1,路径DBA,DA之间的最短路径为DBA
则从D出发的顶点的对B的贡献为1/1 = 1

从E出发的经过B的最短路径条数是2,路径如下:

  • ECBA
  • EDBA

EA之间的最短路径为:

  • ECBA
  • EDBA

则从E出发的顶点的对B的贡献为2/2=1

从F出发的经过B的最短路径条数是1,路径为:FDBA,FA之间的最短路径为FDBA
则从F出发的顶点的对B的贡献为1/1=1

所以B的中介中心性值是8,标准化后为:8/(6*7)

连接中心性

Closeness = (n-1)/节点到其他节点最短路径之和

在这里插入图片描述
A的Closeness = (6-1)/1+2+2+3+3 = 5/11
B的Closeness = (6-1)/1+1+1+2+2 = 5/7
C的Closeness = (6-1)/2+1+1+1+2 = 5/7

代码实现

import numpy as np
import pandas as pd
import networkx as nx

# 初始化图
edges = pd.DataFrame()
edges['sources'] = [1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5]
edges['targets'] = [2, 4, 5, 3, 1, 2, 5, 1, 5, 1, 3, 4]
edges['weights'] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

G = nx.from_pandas_edgelist(edges, source='sources', target='targets', edge_attr='weights')
# degree
print('每个节点的度:', nx.degree(G))
# 每个节点的度:[(1, 3), (2, 2), (4, 2), (5, 3), (3, 2)]

# 连通分量
print('连通分量:', list(nx.connected_components(G)))
# 连通分量: [{1, 2, 3, 4, 5}]

# 图直径
print('图直径:', nx.diameter(G))
# 图直径: 2

# 度中心性
print('度中心性:', nx.degree_centrality(G))
# 度中心性: {1: 0.75, 2: 0.5, 4: 0.5, 5: 0.75, 3: 0.5}

# 特征向量中心性
print('特征向量中心性:', nx.eigenvector_centrality(G))
# 特征向量中心性: {1: 0.5298988890761731, 2: 0.35775191431708964, 4: 0.4271316779596084, 5: 0.5298988890761731, 3: 0.35775191431708964}

# betweenness
print('betweenness:', nx.betweenness_centrality(G))
# betweenness: {1: 0.25, 2: 0.08333333333333333, 4: 0.0, 5: 0.25, 3: 0.08333333333333333}

# closeness
print('closeness:', nx.closeness_centrality(G))
# closeness: {1: 0.8, 2: 0.6666666666666666, 4: 0.6666666666666666, 5: 0.8, 3: 0.6666666666666666}

# pagerank
print('pagerank:', nx.pagerank(G))
# pagerank: {1: 0.24369622576677993, 2: 0.1722562971205864, 4: 0.16809495422526696, 5: 0.24369622576677993, 3: 0.1722562971205864}

# HITS
print('HITS:', nx.hits(G))
# HITS: (hubs:{1: 0.24059715204600776, 2: 0.162434564716677, 4: 0.19393656647463042, 5: 0.24059715204600784, 3: 0.16243456471667692}, 
# authorities:{1: 0.24059715204600784, 2: 0.16243456471667692, 4: 0.1939365664746304, 5: 0.24059715204600768, 3: 0.16243456471667697})

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值