图深度学习(二)
本文参考链接
为了督促自己学习,参照这个链接进行了笔记的搬运。需要看原文的可以到对应链接去查看。来自datawhale的自主学习
图理论基础
本节包含图的背景、图的定义、图的性质、图的连接表示、图的类型等
一、图的背景问题:柯尼斯堡七桥
- 柯尼斯堡七桥问题:市区跨普列戈利亚河两岸,河中心有两个小岛。小岛与河的两岸有七条桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?
- 欧拉将**实际的抽象问题简化为平面上的点与线组合,每一座桥视为一条线,桥连接地区视为点。这样若从某点出发后再回到这点,则这一点的线数必须是偶数。**这样的点称为偶顶点。相对的,连有奇数条线的点称为奇顶点。
3.欧拉把问题的实质归于一笔画问题,即判断一个图是否能够遍历完所有的边而没有重复,而柯尼斯堡七桥问题则是一笔画问题的一个具体情境。欧拉最后给出任意一种河──桥图能否全部走一次的判定法则,从而解决了“一笔画问题”。对于一个给定的连通图,如果存在超过两个的奇顶点,那么满足要求的路线便不存在了,且有n个奇顶点的图至少需要 ⌈ n / 2 ⌉ \lceil n/2 \rceil ⌈n/2⌉笔画出。如果只有两个奇顶点,则可从其中任何一地出发完成一笔画。若所有点均为偶顶点,则从任何一点出发,所求的路线都能实现,他还说明了怎样快速找到所要求的路线。
不少数学家都尝试去解析这类事例。而这些解析,最后发展成为了数学中的图论。
二、图的定义
1.简单图
- 图被记为 G = { V , E } {G}=\{{V}, {E}\} G={V,E}
- 其中 V = { v 1 , … , v N } {V}=\{v_{1}, \ldots, v_{N}\} V={v1,…,vN} 是数量为 N = ∣ V ∣ N=|{V}| N=∣V∣ 的节点(node或vertex)的集合, E = { e 1 , … , e M } {E}=\{e_{1}, \ldots, e_{M}\} E={e1,…,eM} 是数量为 M M M 的边(edge或link)的集合。
- 图用节点表示实体(entities),用边表示实体间的关系(relations)。
- 假如一条边 e ∈ E e\in{E} e∈E 连接两个节点 v 1 v_{1} v1 和 v 2 v_{2} v2,那么这条边可以被表示为 e = ( v 1 , v 2 ) e=(v_{1}, v_{2}) e=(v1,v2)。
- 节点和边的信息可以是类别型的(categorical),类别型数据的取值只能是哪一类别。一般称类别型的信息为标签(label)。
- 节点和边的信息可以是数值型的(numeric),数值型数据的取值范围为实数。一般称数值型的信息为属性(attribute)。
- 在图的计算任务中,我们认为,节点一定含有信息(至少含有节点的度的信息),边可能含有信息。
networkx创建一个简单图:
# 创建一个图
g = nx.Graph()
# 添加图的节点
g.add_node(2)
g.add_node(5)
# 添加图的边
g.add_edge(2, 5)
g.add_edge(1, 4) # 当添加的边对应的节点不存在的时候,会自动创建相应的节点
g.add_edge(1, 2)
g.add_edge(2, 6)
# 绘制图
nx.draw(g)
2.有向图&无向图
代码如下(示例):
# 默认情况下,networkX 创建的是无向图
G = nx.Graph()
print(G.is_directed())
# 创建有向图
H = nx.DiGraph()
print(H.is_directed()).oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
# 判断结果
False
True
3.有权图&无权图
根据图的边上权重是否为1,我们可以将他们分为:
- 图的边上权重为1时,它是一个无权图(unweighted graph)
- 图的边上权重不为1时,它是一个有权图(weighted graph)。我们记点 v i v_i vi 到 v j v_j vj 的权重为 w i j w_{ij} wij.
三、图的性质
示例:
空手道俱乐部网络描述了空手道俱乐部 34 名成员的社交网络,并记录了在俱乐部外互动的成员之间的链接。
# 创建一个空手道俱乐部网络
G = nx.karate_club_graph()
# G is an undirected graph
type(G)
# 可视化图
nx.draw(G, with_labels = True)
1.邻接节点(neighbors)
- 节点 v i v_i vi 的邻接节点是与节点 v i v_i vi 直接相连的节点,其被记为 N ( v i ) {N(v_i)} N(vi)。
- 节点 v i v_i vi的 k k k 跳远的邻接节点(neighbors with k k k-hop)是到节点 v i v_i vi 要走 k k k 步的节点(一个节点的 2 2 2 跳远的邻接节点包含了自身)。
2.图的度(degree)
- 节点 v i v_i vi 的度记为 d ( v i ) d(v_i) d(vi),入度记为 d i n ( v i ) d_{in}(v_i) din(vi),出度记为 d o u t ( v i ) d_{out}(v_i) dout(vi)。
- 对于有向有权图:节点 v i v_i vi 的出度(out degree)等于从 v i v_i vi 出发的边的权重之和;节点 v i v_i vi 的入度(in degree)等于从连向 v i v_i vi 的边的权重之和。
- 无向图是有向图的特殊情况,节点的出度与入度相等。
- 无权图是有权图的特殊情况,各边的权重为 1 1 1,那么节点 v i v_i vi 的出度(out degree)等于从 v i v_i vi 出发的边的数量,节点 v i v_i vi 的入度(in degree)等于从连向 v i v_i vi 的边的数量。
- 平均度是一个表达网络整体性质重要的参数。对于无向图来说,平均度的计算为 d ˉ ( G ) = 1 N ∑ i = 1 N d i = 2 M N \bar{d}({G})=\frac{1}{N}\sum^{N}_{i=1}d_i=\frac{2M}{N} dˉ(G)=N1∑i=1Ndi=N2M。
- 度分布 P ( d ) P(d) P(d) 表示随机选择的节点的度为 d d d 的概率,平均度 d ˉ ( G ) = ∑ d = 0 ∞ d P ( d ) \bar{d}({G})=\sum_{d=0}^{\infty} dP(d) dˉ(G)=∑d=0∞dP(d)。
# 网络平均度计算
def average_degree(num_edges,num_nodes):
avg_degree = 0
avg_degree = 2*num_edges/num_nodes
return int(round(avg_degree))
num_edges = G.number_of_edges()
num_nodes = G.number_of_nodes()
avg_degree = average_degree(num_edges,num_nodes)
print("网络平均度是:",avg_degree)
3.行走(walk)和路径(path)
- w a l k ( v 1 , v 2 ) = ( v 1 , e 6 , e 5 , e 4 , e 1 , v 2 ) walk(v_1, v_2) = (v_1, e_6,e_5,e_4,e_1,v_2) walk(v1,v2)=(v1,e6,e5,e4,e1,v2),这是一次“行走”,它是一次从节点 v 1 v_1 v1 出发,依次经过边 e 6 , e 5 , e 4 , e 1 e_6,e_5,e_4,e_1 e6,e5,e4,e1,最终到达节点 v 2 v_2 v2 的“行走”。
- 下图所示为 w a l k ( v 1 , v 2 ) = ( v 1 , e 6 , e 5 , e 4 , e 1 , v 2 ) walk(v_1, v_2) = (v_1, e_6,e_5,e_4,e_1,v_2) walk(v1,v2)=(v1,e6,e5,e4,e1,v2),其中红色数字标识了边的访问序号。
- 在“行走”中,节点是允许重复的。
- 路径是节点不可重复的行走.
4.距离(distance)和直径(diameter)
- 最短路径被定义为两个点之间的距离(distance)。最短路径(shortest path)
v
s
,
v
t
∈
V
v_{s}, v_{t} \in {V}
vs,vt∈V 是图
G
=
{
V
,
E
}
{G}=\{{V}, {E}\}
G={V,E} 上的一对节点,节点对
v
s
,
v
t
∈
V
v_{s}, v_{t} \in {V}
vs,vt∈V 之间所有路径的集合记为
p
s
t
p_{st}
pst。节点对
v
s
,
v
t
v_{s}, v_{t}
vs,vt 之间的最短路径
p
s
t
s
p
p_{st}^{sp}
pstsp 为
p
s
t
p_{st}
pst 中长度最短的一条路径,其形式化定义为
p s t s p = a r g m i n p ∈ P s t ∣ p ∣ p_{st}^{sp}= argmin_{p \in P_{st}}|p| pstsp=argminp∈Pst∣p∣
其中, p p p表示 p s t p_{st} pst 中的一条路径, ∣ p ∣ |p| ∣p∣是路径 p p p的长度。 - 直径(diameter):给定一个连通图 G = { V , E } {G}=\{{V}, {E}\} G={V,E},其直径为其所有节点对之间的最短路径的最大值,形式化定义为 d i a m e t e r ( G ) = m a x v s , v t ∈ V m i n p ∈ p s t ∣ p ∣ diameter({G})=max_{v_{s}, v_{t} \in {V}} min_{p \in p_{s t}}|p| diameter(G)=maxvs,vt∈Vminp∈pst∣p∣
5.子图(subgraph)和连通分量(connected component)和连通图(connected graph)
- 子图(subgraph):有一图 G = { V , E } {G}=\{{V}, {E}\} G={V,E} ,另有一图 G ′ = { V ′ , E ′ } {G}^{\prime}=\{{V}^{\prime}, {E}^{\prime}\} G′={V′,E′} ,其中 V ′ ∈ V {V}^{\prime} \in {V} V′∈V , E ′ ∈ E {E}^{\prime} \in {E} E′∈E 并且 V ′ {V}^{\prime} V′ 不包含 E ′ {E}^{\prime} E′ 中未出现过的节点,那么 G ′ {G}^{\prime} G′ 是 G {G} G 的子图。
- 连通分量(connected component):给定图 G ′ = { V ′ , E ′ } {G}^{\prime}=\{{V}^{\prime}, {E}^{\prime}\} G′={V′,E′} 是图 G = { V , E } {G}=\{{V}, {E}\} G={V,E} 的子图。记属于图 G {G} G 但不属于 G ′ {G}^{\prime} G′ 图的节点集合记为 V ∖ V ′ {V} \setminus {V}^{\prime} V∖V′ 。如果属于 V ′ {V}^{\prime} V′ 的任意节点对之间存在至少一条路径,但不存在一条边连接属于 V ′ {V}^{\prime} V′ 的节点与属于 V ∖ V ′ {V} \setminus {V}^{\prime} V∖V′ 的节点,那么图 G ′ {G}^{\prime} G′ 是图 G {G} G 的连通分量。
- 连通图(connected graph):当一个图只包含一个连通分量,即其自身,那么该图是一个连通图。
6.聚类系数(Clustering Coefficient)
- 聚类系数表示给定节点的邻居彼此链接的程度。
- 节点 i i i 的邻域互连越紧密,其局部聚类系数越高。
- C i C_i Ci 是节点的两个邻居相互链接的概率。
- 对于度数为
d
i
d_i
di 的节点 i,局部聚类系数定义为
C i = E i T i C_i=\frac{E_i}{T_i} Ci=TiEi
其中, E i E_i Ei 表示节点 i i i 的邻居实际存在的边的数量, T i T_i Ti 表示节点 i i i 的邻居可能(最多)存在的边的数量。
- C i = 0 C_i = 0 Ci=0 如果节点 i 的邻居都没有相互链接。
- C i = 1 C_i = 1 Ci=1 如果节点 i 的邻居形成一个全连接图,即它们都相互链接。
- C i = 0.5 C_i = 0.5 Ci=0.5 意味着一个节点的两个邻居有 50 % 50\% 50% 的机会链接。
- 网络的聚类系数即平均聚类系数:是所有节点的集聚系数的平均值为
C = 1 N ∑ i C i C=\frac{1}{N}\sum_i C_i C=N1i∑Ci
def average_clustering_coefficient(G):
avg_cluster_coef = 0
avg_cluster_coef = nx.average_clustering(G)
avg_cluster_coef = round(avg_cluster_coef,2)
return avg_cluster_coef
avg_cluster_coef = average_clustering_coefficient(G)
print("空手道的聚类系数是 {}".format(avg_cluster_coef))
7.接近中心度(closeness centrality)
- 在连通图中,节点的接近中心性(或接近性)是网络中中心性的度量,计算为该节点与图中所有其他节点之间的最短路径长度之和的倒数。
- 节点越中心,它与所有其他节点越接近
- 接近中心度的计算公式为 c ( v ) = 1 ∑ u ≠ v shortest path length between u and v c(v) = \frac{1}{\sum_{u \neq v}\text{shortest path length between } u \text{ and } v} c(v)=∑u=vshortest path length between u and v1
def closeness_centrality(G, node=5):
closeness = 0
path_length_total = 0
for path in list(nx.single_source_shortest_path(G,node).values())[1:]:
path_length_total += len(path)-1
closeness = 1 / path_length_total
closeness = round(closeness, 2)
return closeness
node = 5
closeness = closeness_centrality(G, node=node)
print("空手道俱乐部接近中心性 {:.2f}".format(closeness))
四、图的连接表示
介绍邻接矩阵、关联矩阵和拉普拉斯矩阵。
1.邻接矩阵(Adjacency Matrix)
- 给定一个图 G = { V , E } {G}=\{{V}, {E}\} G={V,E},其对应的邻接矩阵被记为 A ∈ { 0 , 1 } N × N \mathbf{A} \in\{0,1\}^{N \times N} A∈{0,1}N×N。
- A i , j = 1 \mathbf{A_{i,j}}=1 Ai,j=1 表示存在从节点 v i v_i vi 到 v j v_j vj 的边, A i , j = 0 \mathbf{A}_{i, j}=0 Ai,j=0 表示不存在从节点 v i v_i vi 到 v j v_j vj 的边。
- 在无向图中,从节点 v i v_i vi 到 v j v_j vj 的边存在,意味着从节点 v j v_j vj 到 v i v_i vi 的边也存在。因而无向图的邻接矩阵是对称的。
- 在无权图中,各条边的权重被认为是等价的,即认为各条边的权重为1。
- 对于有权图,其对应的邻接矩阵通常被记为 W ∈ R N × N \mathbf{W} \in \mathbb{R}^{N \times N} W∈RN×N,其中 W i , j = w i j \mathbf{W_{i, j}}=w_{ij} Wi,j=wij 表示从节 v i v_i vi 到 v j v_j vj 的边的权重。若边不存在时,边的权重为 0 0 0 。
一个无向无权图的例子(左边为图,右边为图的邻接矩阵):
2.关联矩阵(Incidence Matrix)
- 给定一个图 G = { V , E } {G}=\{{V}, {E}\} G={V,E},其对应的关联矩阵被记为 M ∈ { 0 , 1 } N × M \mathbf{M} \in\{0,1\}^{N \times M} M∈{0,1}N×M。(抱歉这里我们用加粗的 M \mathbf{M} M 表示关联矩阵,用不加粗的 M M M 表示边的个数)
- M i , j = 1 \mathbf{M_{i, j}}=1 Mi,j=1 表示节点 v i v_i vi 和边 e j e_j ej 相连接, M i , j = 0 \mathbf{M_{i, j}}=0 Mi,j=0 表示节点 v i v_i vi 和边 e j e_j ej 不相连接。
- 与邻接矩阵不同,关联矩阵描述的是定点和边之间的关系。
一个无向无权图的例子(左边为图,右边为图的关联矩阵):
3.拉普拉斯矩阵(Laplacian Matrix)
- 拉普拉斯矩阵(Laplacian Matrix):(也叫做 admittance matrix, Kirchhoff matrix)给定一个图
G
=
{
V
,
E
}
{G}=\{{V}, {E}\}
G={V,E},其邻接矩阵为
A
A
A,其拉普拉斯矩阵
L
L
L 定义为
L = D − A \mathbf{L=D-A} L=D−A
其中 D = d i a g ( d ( v 1 ) , ⋯ , d ( v N ) ) \mathbf{D=diag(d(v_1), \cdots, d(v_N))} D=diag(d(v1),⋯,d(vN))是度矩阵。更具体地,我们记拉普拉斯矩阵中每一个元素为 L i j L_{ij} Lij,那么每一个元素可以被定义为
它的每一行和列的加和为
0
0
0。
- 对称归一化的拉普拉斯矩阵,Symmetric normalized Laplacian):给定一个图 G = { V , E } {G}=\{{V}, {E}\} G={V,E},其邻接矩阵为 A A A,其规范化(归一化)的拉普拉斯矩阵定义为
L = D − 1 2 ( D − A ) D − 1 2 = I − D − 1 2 A D − 1 2 \mathbf{L=D^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}}=I-D^{-\frac{1}{2}}AD^{-\frac{1}{2}}} L=D−21(D−A)D−21=I−D−21AD−21
五、图的类型
前面根据边是否具有指向性,区分得到了有向图和无向图。接下来是根据更多不同的属性来对图进行划分。
1.图的拓扑结构
根据图的拓扑结构,规则网络(regular network)可以分为
- 全连接网络(fully-connected network)(下图左)
- 环形网络(ring-shape network)(下图中)
- 星形网络(star-shape network)(下图右)
根据一些其他的不同性质,常见的图模型还有随机图(random graph)、小世界图(small world graph)和无标度图模型(scale-free graph)
2.同质图和异质图
在深度学习中较常见的定义
- 同质图(Homogeneous Graph):只有一种类型的节点和一种类型的边的图
- 异质图(Heterogeneous Graph):存在多种类型的节点和多种类型的边的图(如下图)
3.二分图
二分图或者二部图(Bipartite Graphs):节点分为两类,只有不同类的节点之间存在边。
更具体地,二分图是一个网络,其节点可以分为两个不相交的集合
U
U
U 和
V
V
V,使得每个链接将
U
U
U 节点连接到
V
V
V 节点。换句话说,如果我们将
U
U
U 节点着色为绿色,将
V
V
V 节点着色为紫色,那么每个链接必须连接不同颜色的节点。我们可以为每个二分网络生成两个投影。如果两个
U
U
U 节点链接到二分表示中的相同
V
V
V 节点,则第一个投影通过链接连接两个
U
U
U 节点。如果它们连接到相同的
U
U
U 节点,则第二个投影通过链接连接
V
V
V 节点。
参考资料:
Datawhaledatawhale组队学习