微信公众号:leetcode_algos_life,代码随想随记
小红书:412408155
CSDN:https://blog.csdn.net/woai8339?type=blog ,代码随想随记
GitHub: https://github.com/riverind
抖音【暂未开始,计划开始】:tian72530,代码随想随记
知乎【暂未开始,计划开始】:代码随想随记
传统角度学习图
- 从机器学习的角度学习图
- 图的表达
- 选择合适的图
- 图的分类
- 节点度
- 二部图
- 如何构建图
- 图的表示
- 邻接矩阵
- 邻接列表
- 附加属性
- 强弱连通图
- 传统机器学习角度理解图
- 机器学习管道构建图特征
- 问题定义
- 适应性函数学习
- 图的特征构造
- 节点度
- 节点中心性
- 节点度中心性
- 特征向量中心性
- 介数中心性
- 紧密中心性
- 集聚系数
- 图元(Graphlet)
- 总结
- 参考资料
从机器学习的角度学习图
图的表达
图一般分为顶点和边,整个结构成为图。
选择合适的图
图的数学表达是节点和边,在不同应用场景下选择不同场景下的图。
图的分类
图有有向图和无向图,无向图顾名思义没有方向的图,有向图是指有起始点及指向方向的图。
节点度
(一)无向图中有节点度的概念
针对某一个节点A,该节点的节点度的概念是,链接当前节点的边的数量。
(二)有向图中节点度的概念
有向图中,节点度有节点入度和出度。
入度是指指向节点的边的个数
出度是指节点发出的边的个数
该节点的度即为该节点的入度和出度之和。
二部图
二部图是指有两种类型的节点,假设分为类型A和B类型的节点。
该图只有类型之间链接,即A类型的节点链接B类型的节点。
而在同一个类型内部,节点不链接。即:A类型或者B类型各自类型的内部节点不链接。
如何构建图
构建图需要确定两件事情:
(1)节点如何定义
(2)边如何定义
图的表示
图有,主要常见的有:邻接矩阵,
邻接矩阵
如果说,Aij表示从节点i到节点j的链接,如果链接存在,表示为1;如果链接不存在,表示为0。
则有向图和无向图的表示如下:
无向图的邻接矩阵是对称的,正定矩阵。
邻接列表
邻接列表是用其中一个节点为key,其value表示的是以该节点为输出的节点list。
具体举例如下:
1节点没有以1节点为起始节点的输出节点,因此,为空。
2节点有以2节点为输出指向3/4节点,因此,2: 3,4。
3节点有以3为节点输出指向2和4节点的,因此,3: 2,4
4节点有以4为节点输出指向5节点的,因此,4:5
5节点有以5节点为输出指向1/2节点的,因此,5: 1,2
因此,邻接列表如下:
1:
2:3,4
3:2,4
4:5
5:1,2
附加属性
图可以加一些属性,比如,权重等。
权重在邻接矩阵中也可以表示,
多图结构的表示如下:
强弱连通图
强连通图:简单理解,从节点A到节点B能够形成闭环循环。
传统机器学习角度理解图
机器学习管道构建图特征
传统机器学习角度来看,主要是通过构造特征来对目标进行训练。其核心思想是,如何对节点、边和图进行特征设计。
因此,针对无向图,本文进行详细阐述如何构造图中的节点、边和整个图的特征。
问题定义
以无向图为例,该问题定义成,给定顶点和边,如何求解一适应性函数,使得其满足给定特征,预测出目标。
具体接下来,就是如何让适应性函数进行学习?
适应性函数学习
这里用无向图中的节点分类例子进行说明。
场景:
假设有给定一些节点,预测这些节点的类型。
主要看右侧的图。
从机器学习角度看,该问题需要构造特征,那么图怎么构造特征呢?
图的特征构造
图中的各个节点中心度概要简介如下:
节点度
可以将某一个节点的度数看成是其中一个特征。
但该特征无法反映节点的区别。
节点中心性
节点中心性有节点度中心性(Degrree centrality)、介数中心性(Betweeness centrality)、紧密中心性(Closeness centrality)、特征向量中心性( Eigenvector centrality)。
节点度中心性
在这里,节点度中心性的理解是,当前节点连接的节点总数。
背后逻辑是说,一个节点度越大,表示其节点越重要。
归一化的节点度中心性,在节点度的中心性上除以<节点总数-1>,这个可以理解成,一个节点最多和n-1个节点产生链接(自环暂不考虑)。具体计算逻辑如下:
这里分两个大的情况:
-
无向图
无向图不加权图其节点边权重看作1。
无向图权重图其节点边权重是其权重。 -
有向图
有向图不加权图其节点边权重看作1,分入度和出度,总的度数是入度和出度之和。
有向权重图其节点边权重是其权重,分入度和出度,总的度数是入度和出度之和。
优缺点:
优点:简单,直观,计算复杂度低
缺点:仅考虑节点最局部信息,没有对节点周围环境进行探讨。一个典型例子是微博中的僵尸粉。
特征向量中心性
特征向量中心性数学含义上就是特征向量。作用是为了衡量节点在整个网络中的重要性。
为了解决节点度中的缺点问题,考虑周围节点的向量,但其计算复杂度有所增加。因此,在求解的时候,采用幂代法进行高效求解。后续介绍幂代法。
(一)特征向量中心性介绍
假设邻接矩阵为A,存在一个向量x,则其特征向量中心性为A*x。
(二)幂代法求解
整体思路:假设邻接矩阵A(具有特征值和特征向量),给定非零向量x0,则:
x1 = Ax0
x2 = Ax1
x3 = Ax2
…
xn = Ax(n-1)
考虑到数值可能越界,因此,需要归一化,即:
其中,
表示一个向量的2范数,其数值等于向量中各个元素的平方和开根号。
作为代码化,伪代码如下:
for i in range(1, n, 1):
x = A*x
x = x / sqrt(x*x)
(三)举例
假设一邻接矩阵A和初始向量x0,数值如下图片里数值。
采用幂代法求解特征向量过程如下:
(四)优缺点
优点:
考虑到不同节点的不同重要程度。比如,院士节点和杰青节点的重要程度肯定不一样。
缺点:
计算复杂度相对较高
介数中心性
介数中心性(Betweenness centrality,BC)度量节点在最短路径中的重要程度。通常认为是最短路径介数中心性(BC),认为网络中所有节点对的最短路径中(一般情况下,一对节点之间存在多条最短路径),经过一个节点的最短路径数越多,这个节点就越重要。
紧密中心性
紧密度中心性计算的是某一个结点到当前网络内其他所有结点的平均距离,该距离的倒数值称为紧密中心性。
紧密度中心性也叫接近中心性,用于评价一个结点到其他所有结点的紧密程度,适合发掘关键节点。
紧密中心性计算公式如下:
集聚系数
集聚系数(也称群聚系数、集群系数)是用来描述一个图中的顶点之间结集成团的程度的系数。具体来说,是一个点的邻接点之间相互连接的程度。集聚系数分为整体和局部的,局部是单一节点的,整体为整个图的所有节点的平均值。
假设当前节点为V,与之连接的节点个数计作 K。
与节点V连接的节点间连接的个数计作 N,
那么 该节点V的集聚系数是:
CC(V) = 2N/(K(K-1))
举例如下:
图元(Graphlet)
(一)Graphlet介绍
首先,介绍下连通诱导子图。
所谓,连通诱导子图是指该图中的顶点和边都是从图(Graph)中顶点和边的真子集。
graphlets是指大图(Graph)中节点数目相对较少的连通诱导子图。
即:graphlets指的是连通的非同构子图。
举例如下:
(二)k节点Graphlets
含 k 个节点的 graphlet记为 k-graphlets.
(三)Graphlet度向量
节点的graphlet degree 为包含节点的 graphlet 的个数。
Graphlet Degree Vector指的是各种子图出现的次数(必须包含v,并且必须是完全符合子图,子图包含的节点之间不能有多余的边)。
上图中,以节点v为参考,
- a类型的graphlet有两种情况,
- b类型有1种情况,
- c类型没有(因为和b的情况,差了一个竖着的边连接),
- d类型有两种情况,即d旁边的灰色节点当作是节点v。
这种情况下,组成当前节点的 graphlet degree 为[2,1,0,2]。
总结
参考资料
1、cs224w
2、bilibili图机器学习网址
3、图表示学习书籍
4、图深度学习
5、GNN介绍
6、网络重要节点排序方法综述
7、幂代法样例
8、特征向量中心度及scala源码解析
9、紧密中心性
10、聚类系数视频解释
11、聚类系数论文
12、graphlets诱导子图介绍-论文