图神经网络(一)图的基本介绍

  1. 图的表示
    图一般包括有向图和无向图
    使用邻接矩阵来表示图
    节点的度degree:表示该节点与其他节点相连的边数
    (有向图中分为入度和出度)

  2. 图的特性
    连通图Connected Graph∶对于一个无向图,如果任意的节点 \(i\) 能够通过一些边到达节点 \(j\) ,则称之为连通图。
    (如果图中任意两个节点能够互相到达,则是强连通,否则是弱连通,但无向图若是连通图则一定是弱连通)

    连通分量Connected Component∶无向图 \(G\) 的一个极大连通子图称为 \(G\) 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。
    最短路径Shortest Path:两个节点直接相连或者通过其他节点可达的最近距离

    图直径Diameter:相隔最远的节点通过其他节点可达的最近距离
    举个例子,在这个案例中(边的长度都为1),可以计算出连接任意两个节点的最短路径。该图的直径为 3,因为没有任意两个节点之间的最短路径的长度超过 3。

  3. 图中心性Centrality
    ·度中心性Degree Centrality

    一个节点的度越大,它就越重要

    公式: $$degree_{centrality} = \frac{N_{degree}(与该节点连通的节点数)}{n(节点总数) - 1}$$
    在下面的蝴蝶结网络中,节点 \(D\) 的连接数是 6,和网络中的所有人都建立了直接联系,其他节点的连接数都是 3,因此节点 \(D\) 的点度中心性最高。整个网络一共有 7 个节点,意味着每个人最多可以有 6 个社会关系。因此,节点 \(D\) 的点度中心性是6/6=1,其他节点的点度中心性是3/6=0.5。

    ·特征向量中心性Eigenvector Centrality

    与一个节点相连的节点越重要(度越大),它就越重要(即不仅考虑当前节点的度还考虑其邻居节点的度)


    对于无向图,邻接矩阵 \(A\) 是一个对称矩阵。\(x\) 是一个5x1的向量,向量的值对应图中每个点的度。

    相乘得到一个5x1的向量,第一个元素是用矩阵A的第一行去“获取”每一个与第一个点有连接的点的度,也就是第2个、第3个和第4个点的度,然后将它们加起来。
    这样做的结果就是“扩散了”度中心性。你的朋友的朋友越多,你的特征向量中心性就越高。

    继续用矩阵 \(A\) 乘以结果向量。即让中心性数值再次沿着图的边界“扩散”。我们会观察到两个方向上的扩散(点既给予也收获相邻节点)。这一过程最后会达到一个平衡,特定点收获的数量会和它给予相邻节点的数量取得平衡。数值会越来越大,但各个节点的度在整体中的比例会保持稳定。
    现在把所有点的数值构成的向量用更一般的形式表示:

    图中的点存在一个数值集合,对于它,用矩阵 \(A\) 去乘不会改变向量各个数值的相对大小。也就是说,它的数值会变大,但乘以的是同一个因子。用数学符号表示就是:$$ A*x=\lambda *x $$
    满足这一属性的向量 \(x\) 就是矩阵 \(A\) 的特征向量。

    复习一下特征值和特征向量的求解:
    数 $\lambda $ 称为 \(A\)特征值\(x\) 称为 \(A\) 的对应于特征值 $\lambda $ 的特征向量。式 \(A*x=\lambda *x\) 也可写成 \((A-λE)x=0\),并且 \(|λE-A|\) 叫做 \(A\)特征多项式。当特征多项式等于 0 的时候,称为 \(A\)特征方程,特征方程是一个齐次线性方程组,求解特征值的过程其实就是求解特征方程的解。$$Ax=\lambda x\rightarrow Ax=\lambda Ex\rightarrow (\lambda E-A)x=0$$

    \[\left | \lambda E-A \right |=\begin{vmatrix}&\lambda -a_{11} & -a_{12} &\cdots & -a_{1n}\\ & -a_{21} &\lambda -a_{22} &\cdots & -a_{2n}\\ &\cdots &\cdots &\cdots &\cdots \\ & -a_{m1} & -a_{m2} &\cdots &\lambda -a_{mn} \\ \end{vmatrix}=0 \]

    例:计算A的特征值和特征向量。

    \[A=\begin{pmatrix}4& 2 & -5 \\ 6& 4 & -9 \\ 5& 3 & -7 \end{pmatrix} \]

    解:

    \[\left | \lambda E-A \right |=\begin{vmatrix}\lambda -4 & -2 & 5\\ -6 &\lambda -4 & 9\\ -5& -3 &\lambda +7 \end{vmatrix}=0 \]

    计算行列式得:\((\lambda -4)(\lambda -4)(\lambda +7)+(-2)*9*(-5)+5*(-6)*(-3)-(5*(\lambda -4)*(-5)+(-2)*(-6)*(\lambda +7)+(\lambda -4)*9*(-3))=0\)
    化简得:\(\lambda^{2}*(\lambda -1)=0\)
    得到特征值:\(\lambda_{1}=1,\lambda_{2}=\lambda_{3}=0\)
    \(\lambda_{1}=1\)时,代入$ (\lambda E-A)x=0$得:

    \[\begin{pmatrix} -3 & -2 & 5 \\-6& -3 & 9\\ -5 & -3 & 8 \end{pmatrix}\begin{pmatrix}x_{1}\\ x_{2}\\ x_{3} \end{pmatrix}=0 \]

    化简得到:

    \[\begin{pmatrix} 1 & 0 & -1 \\0& 1 & -1\\ 0 & 0 & 0 \end{pmatrix}\begin{pmatrix}x_{1}\\ x_{2}\\ x_{3} \end{pmatrix}=0 \]

    \(\left\{\begin{matrix} x_{1}-x_{3}=0\\ x_{2}-x_{3}=0 \end{matrix}\right.\)
    \(x_{1}=1\),得到特征向量:\(\xi _{1}=\begin{pmatrix} 1\\ 1\\ 1 \end{pmatrix}\)
    同理,当\(\lambda_{2}=\lambda_{3}=0\)时,得到得到特征向量:\(\xi _{2}=\xi _{3}=\begin{pmatrix} 1\\ 3\\ 2 \end{pmatrix}\)

    先按照公式求出特征值和特征向量,再选择最大特征值对应的特征向量,该特征向量对应的每个值就是对应节点的特征向量中心性

    ·中介中心性 Betweenness Centrality

    如果一个节点位于其他节点的多条最短路径上,那么该节点就是核心节点,就具有较大的中介中心性。

    公式: $$Betweenness = \frac{经过该节点的最短路径数}{其余两两节点的最短路径数}$$
    回到上面的蝴蝶结网络,假设我们要计算节点D的中介中心性。

    • 首先,计算节点D之外,所有节点对之间的最短路径有多少条,这里是15条。
    • 然后,再看所有这些最短路径中有多少条经过节点D,例如节点A要想找到节点E,必须经过节点D。因此经过节点D的最短路径有9条。
    • 最后,用经过节点D的最短路径除以所有节点对的最短路径总数,这个比率就是节点D的中介中心性。节点D的中介中心性是9/15=0.6。

    ·连接中心性Closeness Centrality

    如果节点到图中其他节点的最短距离都很小,那么它的接近中心性就很高。

    公式: $$Closeness = \frac{n-1}{节点到其他节点最短路径之和}$$
    与中介中心性一样,都利用了整个网络的特征,即一个节点在整个结构中所处的位置。相比中介中心性,接近中心性更接近几何上的中心位置
    假设我们要计算节点D的接近中心性

    • 首先我们计算从节点D到所有其他节点的最短距离之和。从图中可以判断,节点D到所有其他节点的距离均为1,距离之和为6。
    • 因此,节点D的接近中心性为(7-1)/6=1。分子为网络中节点总数减去1。

    也就是说,如果一个人可以直接跟网络中所有其他人联系,那么他/她的接近中心性就是1。对于其他节点,如节点A的接近中心性为(7-1)/9=0.667。

  4. 网页排序算法
    ·PageRank

    来自受欢迎的网页的跳转应该重于不太受欢迎的网页的跳转。思想依据和特征向量中心性其实是一致的。

    将Web做如下抽象:
    (1)将每个网页抽象成一个节点;
    (2)如果一个页面A有链接直接指向B,则存在一条有向边从A到B(多个相同链接不重复计算边)。
    因此,整个Web被抽象为一张有向图。现在假设世界上只有四张网页:A、B、C、D,其抽象结构如下图:

    显然这个图是强连通的(从任一节点出发都可以到达另外任何一个节点)。
    PageRank算法基本思想描述:被用户访问越多的网页可能质量越高,而用户在浏览网页时主要通过超链接进行页面跳转,因此需要通过分析超链接组成的拓扑结构来推算每个网页被访问频率的高低。最简单的,我们可以假设当一个用户停留在某页面时,跳转到页面上每个被链页面的概率相同
    例如,上图中A页面指向B、C、D,所以一个用户从A跳转到B、C、D的概率各为1/3。设一共有N个网页,则可以组织这样一个N维矩阵,其中第i行j列的值表示用户从页面j转到页面i的概率。(即每列之和为1)这样一个矩阵叫做转移矩阵(Transition Matrix)。(其实就是转置的归一化邻接矩阵🧐)下面是上图的转移矩阵M:

    设初始时每个页面的rank值为1/N,这里就是1/4。按A−D顺序得到向量v:

    注意:M第一行分别是A、B、C和D转移到页面A的概率,而v的第一列分别是A、B、C和D当前的rank,因此用M的第一行乘以v的第一列,所得结果就是页面A最新rank的合理估计,同理,Mv的结果就分别代表A、B、C、D新rank值。

    然后用M再乘以这个新的rank向量,又会产生一个rank向量。迭代这个过程,可以证明v最终会收敛,即v≈Mv,此时计算停止。最终的v就是各个页面的pagerank值。上面的向量经过几步迭代后,大约收敛在(1/4,1/4,1/5,1/4),这就是A、B、C、D最后的pagerank。
    a.终止点问题
    上面过程要满足收敛性,需要具备一个条件:图是强连通的,即从任意网页可以到达其他任意网页。
    互联网中存在网页不满足强连通的特性,因为有一些网页不指向任何网页,按照上面公式迭代计算下去,导致前面累计得到的转移概率被清零,最终得到的概率分布向量所有元素几乎都为0
    假设把上面图中C到D的链接丢掉,C变成了一个终止点,得到下面这个图:

    转移矩阵M为:

    不断迭代,最终得到所有元素都为0。

    b.陷阱问题
    陷阱问题:是指有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:

    这种情况下,PageRank算法不断迭代会导致概率分布值全部转移到c网页上,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图则对应的转移矩阵M为:

    不断迭代,最终得到如下结果:

    c.完整PageRank算法
    为了解决终止点问题和陷阱问题,下面需要对算法进行改进。假设选取下一个跳转页面时,既不选当前页面,也不选当前网页上的其他链接,而是以一定概率跳转到其他不相关网页
    假设跳转到当前页面(包括当前页面上的链接)的概率为a(也称为基尼系数),那么跳转到其他页面概率为(1−a),进一步假设每个页面被访问的概率相同都是1/n,于是原来的迭代公式转化为:

    假设α的值为0.85,e是网页数目的倒数,共4个网页,所以e等于1/4。现在计算有陷阱的网页的概率分布:

    利用上面公式继续迭代下去,直到收敛,得到最终rank值。
    ·HITS
    感觉这个用的比较少,其实就是hub对应出度,authority对应入度

    5. 实战代码

    import numpy as np
    import pandas as pd
    import networkx as nx
    
    edges = pd.DataFrame()
    edges['sources'] = [0,1,2,3,4,4,6,7,7,9,1,4,4,4,6,7,5,8,9,8]
    edges['targets'] = [1,4,4,4,6,7,5,8,9,8,0,1,2,3,4,4,6,7,7,9]
    #edges['weights'] = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    # source 为起点,target为终点, weight为度
    G = nx.from_pandas_edgelist(edges, source='sources',target='targets')
    # degree
    print(nx.degree(G))
    # 连通分量
    print(list(nx.connected_components(G)))
    # 图直径
    print(nx.diameter(G))
    # 度中心性
    print('度中心性',nx.degree_centrality(G))
    # 特征向量中心性
    print('特征向量中心性',nx.eigenvector_centrality(G))
    # betweenness
    print('betweenness',nx.betweenness_centrality((G)))
    # closeness
    print('closeness',nx.closeness_centrality(G))
    # pagerank
    print('pagerank',nx.pagerank(G))
    # HITS
    print('HITS',nx.hits(G,tol=0.00001))
    

总结:

度中心性:一个人的社会关系越多,他就越重要
特征向量中心性:与一个人连接的人社会关系越多,他就越重要
中介中心性:如果一个成员处于其他成员的多条最短路径上,那么该成员就是核心成员
接近中心性:一个人跟所有其他成员的距离越近,他就越重要
PageRank:来自受欢迎的网页的跳转应该重于不太受欢迎的网页的跳转

参考资料:
b站视频【图神经网络】GNN从入门到精通
GNN(一) 图神经网络基本知识
谁是社会网络中最重要的人?
矩阵特征值和特征向量详细计算过程
PageRank算法原理剖析及Spark实现

posted @ 2022-04-30 21:57  YTT77  阅读(991)  评论(0编辑  收藏  举报