第二章 图的基本表示与特征工程

一、图的基本表示

1.1 表示
  • 图的本体设计
  • 图的种类(有向、无向、异质、二分、连接带权重)
  • 节点连接数
  • 图的基本表示-邻接矩阵
  • 图的基本表示-连接列表和邻接列表
  • 图的连通性
1.2 图的组成成分

图由节点连接组成

  • 节点可以叫nodes,也可以叫vertices,用N来表示
  • 连接可以叫links也可以叫edges,用E来表示
  • 图可以叫network也可以叫graph,用G(N,E)来表示

![[Pasted image 20230212150215.png]]
上面几个图都可以用节点数为4和连接数为4的图来表示

1.3 本体图 Ontology

上面那几个图都是我们人为设计的,显然我们知道应该把什么当作节点,把什么当作连接,例如第一章里面我们讲导航的时候有提到过将路段作为节点,路段与路段之间的连通性作为连接,但是换一个角度,我们将地点作为节点,这个时候路段就作为连接了。所以面对新的数据,我们怎么知道应该让哪些数据作为节点,哪些数据作为连接呢?这就涉及到本体图了。

参考医疗知识图谱如下

![[Pasted image 20230212151118.png]]

我们可以事先将数据之间的关系设立好,例如食物和疾病之间有哪几种关系等等,这一步要我们在导入数据之前就要设计好。而具体的数据导入之后,上图的疾病、食物、药物等等就会变为实体,连接的与否也会在知识图谱中得到体现

1.4 如何设计本体图?

设计本体图需要以目标为基准,例如参考医疗知识图谱,你想制作一个问答机器人,你想问当有什么症状时就会得到什么疾病,这样你应该将症状和疾病作为两个节点,并建立联系。如果你想问得了一种病应该持什么不应该吃什么食物,你就应该将疾病和食物作为两个节点,并建立联系。

  • 本体图的特点
    • 本体图应该是唯一的、无歧义的
    • 本体图应该适用于本问题,而不一定适用于其他问题
    • 本体图取决于你将来想解决什么问题。(同一数据有不同的解决问题就会产生不同的本体图)
1.5 有向图、无向图、异质图

![[Pasted image 20230212151939.png]]

  • 无向图
    • 无向图中各个节点的连接是无目标指向的
    • 例子
      • facebook的社交网络,朋友与朋友之间都是双向的
  • 有向图
    • 连接是有指向的
    • 例子
      • 推特上互相关注
      • 打电话
  • 异质图(很大一部分神经网络在研究的是异质图)
    • 表示图中节点会是不同的类型,连接也可以是不同的类型
    • 例子
      • 医疗知识图谱中症状和食物是不同类型的节点
      • 推荐系统中商品和用户也是不同类型的节点

在这里插入图片描述

  • 二分图
    • 如果一个异质图中只有两种节点,就称为二分图
    • 例子
      • 上一章讲到的药物副作用里面,涉及到药物和蛋白质这两种节点
      • 购物里面用户和商品就是两种节点
      • 论文引用里面论文和作者是两种节点
    • 如上图,我们也可以将二分图展开,例如1和2都与A有关系,所以1和2之间就建立联系,反复如此就可以将二分图展开,然后分别进行数据挖掘
1.6 节点连接数

节点连接数用来标记一个节点与其他节点建立了多少连接,例如上面二分图里面,1的节点连接数就是1,2就是2,A是3。

一个无向图的平均节点连接数 k ‾ = < k > = 1 N ∑ i = 1 n k i = 2 E N \overline{k}=<k>=\frac{1}{N}\sum_{i=1}^nk_i=\frac{2E}{N} k=<k>=N1i=1nki=N2E

上面公式很好理解,我们假设A和B之间的连接由A和B平分,每人一半,假设一张图的所有连接数为E,那么 E N \frac{E}{N} NE表示每个节点实际平均分到的数量,也就是说是两个节点之间平分的,当A的节点连接数为4的时候,根据平分原则,实际A分到的节点数为2,因此不考虑实际时,实际平均分配的数量乘以2才是平均节点连接数

有向图的平均节点连接数 k ‾ = E N \overline{k}=\frac{E}{N} k=NE
因为A和B之间的连接是不会平分的了,该是谁的就是谁的

1.7 邻接矩阵

离散数学的基础,不过多赘述了
![[Pasted image 20230212153449.png]]

![[Pasted image 20230212153806.png]]

  • 无向图求连接数

    • 连接总数=矩阵中所有元素的和,再除以二
    • 节点连接数 = 节点表示的该行和该列的所有元素的和,再除以二
      ![[Pasted image 20230212154033.png]]
  • 有向图求连接数

    • 连接总数=矩阵中所有元素的和
    • 节点连接数 = 节点表示的该行和该列的所有元素的和
1.8 为什么要把图转为矩阵?

因为计算机无法识别图这种数据,而转换为矩阵就易于处理,而且现如今的深度学习就是在加速矩阵计算。

然而这个矩阵会非常稀疏,例如假设全球70亿人的社交网络,而平均一个人却不会认识超过一千人,所以这个矩阵会非常稀疏

因此用邻接矩阵来表示图会非常不划算

1.9 连接列表和邻接列表

![[Pasted image 20230212154842.png]]

  • 连接列表

    • 只记录存在的节点对
      ![[Pasted image 20230212154929.png]]
  • 邻接列表

    • 对于一个节点,只记录它的指向,有多少个节点就记录多少行
      ![[Pasted image 20230212155115.png]]
1.10 有权图

之前讨论的图在邻接表中产生连接时,数字都是1,而在有权图中,会考虑不同连接的权重,因此常常为其他数
![[Pasted image 20230212155308.png]]

1.11 有环图,多向图

![[Pasted image 20230212155505.png]]

  • 有环图
    • 自己跟自己有连接,例如
  • 多向图
    • 两个节点产生多个连接,例如一个城市到另外一个城市会有多个道路
1.12 连通性

如果一个节点可以抵达另外一个节点,我们称两个节点具有连通性

1.13 强连接、弱连接

考虑方向时,如果任意两个节点都可以相互抵达,称作是强连接的。

如果一个图不是强连接的,但是在不考虑方向时,任意两个节点之间可以相互抵达,称为弱连接

二、传统图机器学习的特征工程

本小节与后续的图神经网络没有关系,后续可以自动构造特征,本小节是人工构造特征

本小节侧重于讲一个节点在群体中的作用,而不是侧重于该节点的属性,也就是连接特征而不是属性特征

2.1 节点层面的特征工程

以银行信用卡欺诈为例,我们需要输入一个节点,然后判断该节点是否属于某类,这种由已知节点猜未知节点的模型方法叫做半监督节点分类

这时候需要根据每一个节点来构造d维的特征,需要考虑如下信息

  • 节点连接数
  • 节点重要度
  • 集群系数
    • 一个节点的多个相邻节点之间是否有联系
  • 图元(Graphlets)
    • 一个节点周围有多少个子图
2.1.1 节点连接数

![[Pasted image 20230212162621.png]]

例如A和G的连接数都是1,但是A是院士手下的,而G只是一个小老板手下的,不能比

对于A来说,节点连接数1就可以作为A的第一个特征

![[Pasted image 20230212162903.png]]

对于地铁站而言,显然连接数越多,越表示这个站点是交通枢纽

2.1.2 节点重要度

衡量重要度的方法

  • Eigenvector centrality(特征向量重要度)
    • 一个节点的重要度等于相邻节点重要度之和除以 λ \lambda λ
    • 这是一个递归的过程,等价于求解邻接矩阵A的特征向量
  • Betweenness centrality(中间性重要度)
    • 判断一个节点是否处于交通咽喉
    • 计算除了该节点外,一个节点到另外一个节点的最短距离里面是否经过了该节点。该结果除以总最短连接的个数就是最终结果,例如一共4个节点,除了这个节点还有3个节点,它们两两组合共计3条,这就是总最短连接个数
  • Closeness centrality(紧密性重要度)
    • 判断哪个节点可以去哪儿都近
    • 计算一个节点到其他节点距离的总和的倒数
2.1.3 集群系数

![[Pasted image 20230212164628.png]]

一个节点周围相邻的节点如果也是两两相连的,表明集群系数较高

2.1.4 图元(Graphlets)

![[Pasted image 20230212164839.png]]

如上图,这种一个节点连接了所有的外围节点,而外围节点之间可能也相连的网络称为自我中心网络

我们在这种网络之中数三角形的个数,来计算聚集系数,到那时如果不是三角形,而是其他的形状呢?

![[Pasted image 20230212183247.png]]

如上图我们可知,考虑两个节点的有一种形状的子图,三个节点的有两种形状的子图,四个节点的有6种情况的子图,如果一直考虑到5个节点,所有加起来一共有73种情况的子图

如果我们选定一个节点,勾选出这个节点周围的子图个数,就可以构造一个向量,叫做Graph Degree Vector(GDV)
![[Pasted image 20230212182643.png]]

从上图可知,当我们要计算u节点的GDV时,对于a这种形状的,有两种满足,b只有一种,以c为节点的只能满足三角形,所以c不满足,以d为节点时有上图两种,因此可以得到u节点的GDV形如(2,1,0,2)

GDV描述了节点u的局部邻域的拓扑连接结构的信息,这里我们是用一些定义好的子图去匹配u节点周围的子图结构,相当于构建了一个直方图,来描述周围子图结构的出现频数。

不同的节点的GDV是不同的,由于一共有73种子图结构,所以GDV是一个73维的向量,可以充分描述一个节点的拓扑结构,比较两个节点的GDV就可以计算两个节点的相似度

用GDV来表示某一个节点

2.1.5 节点层面总结

以上2.1讲了节点重要度和节点的局部邻域拓扑连接结构

  • 节点重要度(importance-based features)(分析该节点是否大牛)
    • Node degree(节点的度)
      • 只反映数量,不反映质量
    • Different node centrality measures(节点重要性度量)
  • 节点的局部邻域拓扑连接结构(Structure-based features)(可以分析节点的功能和角色)
    • Node degree
    • Clustering coefficient
    • Graph degree vector
2.1.6 节点层面思考题(非标准答案,只代表个人回答)

![[Pasted image 20230212203056.png]]

  • 1.节点层面,存在哪些数据挖掘任务,有何应用场景?
    • 节点层面可以通过节点重要度度量挖掘出该节点的重要性如何,例如社交网络中可以知道该节点是否是大牛,又或者第一章开源项目里面可以找到最近爆火的项目以及勤奋的开源企业等等。也可以通过节点的局部邻域拓扑连接结构来分析该节点的功能以及在集群中扮演的角色,例如医疗知识图谱中,蛋白质在不同药物中存在,可能据此找到药物的共同点,或者挖掘出该蛋白质潜在的功能等等
  • 2.“传统图机器学习方法”传统在何处?
    • 需要人为挖掘可能行之有效或者比较重要有价值的特征
  • 3.特征工程在数据挖掘中有什么用?
    • 将一堆烂数据通过数据清洗、特征构造等手段变为一堆较好的数据
    • 形成让计算机能够识别的形式,例如将图转为邻接矩阵
  • 4.在传统图机器学习中,为什么要对节点、连接、全图做特征工程
    • 在传统机器学习中,我们要得到某一个节点在全图中扮演的角色、功能、重要性,以及挖掘出节点与节点之间的关系,甚至由该图得到另外一张新的图(药物设计,蛋白质三维结构设计等等)等等操作,因此我们要针对我们的目的,对目标进行特征工程以进行数据挖掘,这里的目标就是节点、连接以及全图。
  • 5.传统图机器学习方法相比图神经网络(深度学习),有什么优点和缺点?
    • 这里直接对标传统机器学习和深度学习之间的优缺点
    • 优点
      • a.模型复杂度低
      • b.数据需求量一般来说较少
      • c.可解释性强
    • 缺点
      • a.精度比不上深度学习
      • b.深度学习不需要特征工程
  • 6.节点层面可以构造哪些特征?这些特征可以归为哪两类?
    • 参考上面2.1.5总结
  • 7.简述不同的Node Centrality计算方法
    • Eigenvector centrality
      • 1 λ \frac{1}{\lambda} λ1相邻节点重要性之和
    • Betweenness centrality
      • 除该节点外,两节点最短距离经过该点的个数 除该节点外,节点两两配对的个数 \frac{除该节点外,两节点最短距离经过该点的个数}{除该节点外,节点两两配对的个数} 除该节点外,节点两两配对的个数除该节点外,两节点最短距离经过该点的个数
    • Closeness centrality
      • 1 该点到其他点距离的总和 \frac{1}{该点到其他点距离的总和} 该点到其他点距离的总和1
  • 8.只用Node Degree作为节点重要度,会有什么缺点?
    • 只考虑了圈子的大小而没有考虑圈子的质量,100个混子朋友和一个子豪兄朋友是没法比的
  • 9.Eigenvector centrality和PageRank有什么异同?
  • 10.Betweenness centrality和Closeness centrality有什么区别?分别揭示了节点是什么特征?
    • Betweenness centrality可以计算该节点是否是交通的枢纽,如果缺失了Betweenness centrality比较高的节点,可能会使得一部分节点与另外一部分节点失联。Closeness centrality计算得到一个到所有点的距离是最短的点。
    • 第一个揭示了节点在全图的重要性,第二个揭示了节点在全图的中心性
  • 11.湖北到中国任何一个省级行政区,最多跨两个省,说明哪个特征高?
    • Closeness centrality高
2.2 连接层面特征工程

现在已知节点和部分连接,要预测未知的连接,如何解决这个问题?

  • 思路1:直接提取link的特征,把link变成d维向量
  • 思路2:把link两端节点的d维向量拼在一起

思路一是可以的,思路二的话丢失了link本身的连接结构信息,例如A点到B点的高铁,如果只把两节点的信息拼接,就缺失了中间连接的信息。我们既要补全连接,也要猜出连接的类别

连接预测分为两种情况

  • Links missing at random
    • 这适用于静态图,客观存在的图,例如蛋白质分子等,我们可以随机删除一些连接,然后再进行有监督的训练,将删掉的再预测出来
  • Links over time
    • 图是动态、随时间变化的,例如社交网络,论文引用等等,我们可以通过某一时间段内的连接来预测下一个时间段内可能会产生的连接,然后用机器学习算法对这些连接打分,选出top N个,与这个时间段真实产生的连接去做比较,来衡量算法是否靠谱。也可以通过上一时刻的连接来预测下一时刻的连接情况
2.2.1 连接的特征
  • Distane-based features(基于两节点的距离)
    • 两节点的最短路径长度
  • Local neighborhood overlap(基于两节点的局部连接信息)
    • Common neighbors(共同好友个数)
      • 计算两节点的共同好友个数 ∣ N ( v 1 ) ⋂ N ( v 2 ) ∣ |N(v1)\bigcap N(v2)| N(v1)N(v2)
    • Jaccard‘s coefficient(交并比)
      • ∣ N ( A ) ⋂ N ( B ) ∣ ∣ N ( A ) ⋃ N ( B ) ∣ \frac{|N(A)\bigcap N(B)|}{|N(A)\bigcup N(B)|} N(A)N(B)N(A)N(B)
    • Adamic-Adar index(共同好友是不是社牛)
      • ∑ u ∈ N ( v 1 ) ⋂ N ( v 2 ) 1 l o g ( k u ) \sum_{u\in N(v1)\bigcap N(v2)}\frac{1}{log(k_u)} uN(v1)N(v2)log(ku)1
      • 假如两人的共同好友是一个社牛,可能社牛认识的人多,所以这俩人可能友谊没那么坚固。如果共同好友没有,可能就比较坚固
  • Global neighborhood overlap(基于两节点在全图的连接信息)
    • Katz index
      • 两节点u,v之间长度为k的路径个数
      • 计算:A的k次方里面第u行第v列的数值
      • 卡兹系数要求k从0到正无穷,计算 S v 1 v 2 = ∑ i = 1 ∞ β l A v 1 v 2 l S_{v1v2}=\sum_{i=1}^{\infty}\beta^lA^l_{v1v2} Sv1v2=i=1βlAv1v2l
2.2.2 思考题

![[Pasted image 20230212214735.png]]

2.3 全图层面特征工程
2.3.1 Bag-of-Words

对于某一个图,我们想要提取出的特征能够反映全图的特点,这里有一个很关键的思想:在自然语言处理里面,对于一篇文章,我们无法将其直接输进神经网络,因此Word Count产生了,它统计一篇文章中所有单词出现的频率,变为一条向量,可以输进神经网络里面。同样借鉴这种思想,把图当作一篇文章,节点想象为单词,这样一个图就可以变为一条向量,这种思想叫做Bag-of-Words(BoW)

![[Pasted image 20230212215451.png]]

但显然上图中下面两个图的向量表示是相同的,这样就不太好了,看下面的方法

2.3.2 Bag-of-node-degree

如果我们使用节点的连接数作为衡量呢
![[Pasted image 20230212215714.png]]

如图,表示就不一样了

2.3.3 Graphlet Kernel 子图匹配

基于以上这种思想,我们在计算GDV时使用到了73种子图结构,这样也可以运用了
![[Pasted image 20230212220112.png]]

与节点的GDV计算不同,我们在进行全图的统计时,要把全图的所有可能子图结构都算上的

![[Pasted image 20230212220245.png]]

通过计算两张图的graph count vector的点积,我们可以得到一个标量 K ( G , G ‘ ) K(G,G^`) K(G,G),这个标量就可以用来衡量两个图之间的关系了,是否匹配以及是否相近

如果两个图不一样大,就先需要对两个图各自做归一化,再去算kernel值

显然上面这个子图匹配的算法非常好,但是为啥我们不经常用呢?因为枚举全图的子图个数是个复杂度很高的问题,算例要求大,这是个NP难的问题

2.3.4 Weisfeiler-Lehman Kernel

实际上是bag-of-colors,通过节点与周围节点的组合,进一步通过哈希编码来改变自身颜色

这里跟图神经网络有点类似
![[Pasted image 20230212222010.png]]

先让所有节点都是1,对于某一个节点,与周围节点的数字进行组合,比如G1左上角那个1,它周围有三个为1的节点,因此它就会变成1,111,G1右上角那个节点周围只有两个连接的1,因此变为1,11

![[Pasted image 20230212222243.png]]

通过哈希编码将不同的数映射为不同的颜色,并进行数字编码为2,3,4,5等等

![[Pasted image 20230212222357.png]]

进一步再进行第一步的操作与第二步的操作,如下
![[Pasted image 20230212222437.png]]

此时也只进行了两步,还可以进行更多步的哈希,那么可以看看哈希之后的步骤如何,如下
![[Pasted image 20230212222522.png]]

这里不同的颜色可以表示成一行向量

计算出Kernerl之后,一些传统的机器学习方法就可以用了,比如带核函数的支持向量机

2.3.5 思考题

![[Pasted image 20230212222727.png]]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值