文章目录
- [一. 人工特征工程、连接特征](#一. 人工特征工程、连接特征)
- [二. 在节点层面对连接特征进行特征提取](#二. 在节点层面对连接特征进行特征提取)
- [三. 在连接层面对连接特征进行特征提取](#三. 在连接层面对连接特征进行特征提取)
- [四. 在全图层面对连接特征进行特征提取](#四. 在全图层面对连接特征进行特征提取)
一. 人工特征工程、连接特征
- 节点、连接、子图、全图都有各自的属性特征, 属性特征一般是多模态的。
- 除属性特征外,还有连接特征。本讲侧重点为:用人工特征提取的方法对连接特征进行提取。
二. 在节点层面对连接特征进行特征提取
- 节点的度:只看连接个数,不看连接质量。
- 节点的中心性:
- 特征向量中心性:其原理是某节点周围的节点都很重要,那么它也重要。
- 中介中心性:其原理是若某节点处于交通咽喉,那么它很重要。
- 邻接中心性:其原理是若一个节点去哪都近,那么它很重要。
- 节点的聚集系数:衡量节点周围的抱团程度,其实就是查以该节点为端点的三角形个数。
- Graphlets:聚集系数中的三角形结构可以视为一种子图,那么用其他子图代替三角形结构也是可以的,这就是Graphlets。提取某节点周围不同子图的个数,就可以构成一个向量Graphlet Degree Vector(GDV)。这个向量就可以用于描述节点的邻域拓扑结构信息。
- 还有其他的衡量方式如:PageRank、Katz中心性等。在NetworkX里包含多种数据挖掘算法可供使用。
三. 在连接层面对连接特征进行特征提取
- 即提取连接的特征,把连接变成 d 维向量。
- 基于两节点的距离:
- 两节点间最短路径长度:只看长度,忽略个数、质量。
- 基于两节点局部连接信息:
- 两节点共同相邻节点个数(交集)
- 两节点相邻节点的交并集合个数比
- Adamic-Adar index:
- S a = ∑ u ∈ N ( V 1 ) ∩ N ( V 2 ) 1 l o g ( k u ) S_{a}=\textstyle \sum_{u\in N(V_{1})\cap N(V_{2})}\frac{1}{log(k_{u})} Sa=∑u∈N(V1)∩N(V2)log(ku)1。
- 可以这样理解,两个人的连接若通过几个公众人物,那么他俩大概率不会很亲近。若通过一个普通人,那大概关系是不错的。
存在一个问题,如果两个节点没有共同的邻域节点,则以上三个指标都为 0 没有意义,这就需要看全图的信息了。
- 基于两节点在全图的连接信息------Katz index:
- 记录两节点间长度为k的路径个数。
- 其可以通过邻接矩阵的幂来求解。
- 设图的邻接矩阵为A,则节点u、v之间长度为k的路径个数是 A k A^{k} Ak矩阵的第u行第v列的值。
- 公式为 S u , v = ∑ l = 1 ∞ β l A u , v l = ( I − β A ) − 1 − I S_{u,v} = \sum_{l=1}^{\infty } \beta ^{l}A^{l}_{u,v}=(I-\beta A)^{-1}-I Su,v=∑l=1∞βlAu,vl=(I−βA)−1−I,其中 β \beta β是缩放因子,得到的是katz系数矩阵。
四. 在全图层面对连接特征进行特征提取
- 所得的特征应该能反映全图的结构特点。
- Bag-of-node-degrees:只看节点的度,不看连接结构 。实际上还是数数,数不同度对应的节点个数。
- Graphlet Kernel:
- 数 Graphlet 的个数得到 Bag-of-Graphlet,算是 Bag-of-* 的推广。
- 与节点层面不同从全图的角度 Graphlet 可以有孤立节点。
- 统计各种 Graphlet 的个数,也可以构成 d 维向量。
- 对两个图的 Bag-of-Graphlet 做归一化后,再做数量积就得到它俩的 Graphlet Kernel。
- 然而 Graphlet Kernel 计算复杂度过高,应用空间很小,引出Weisfeiler-Lehman Kernel。
- Weisfeiler-Lehman Kernel:
- 其特点是通过迭代不断丰富节点词库。
- 其用到的是颜色微调的方法。
- 通过多次迭代,进行节点颜色微调,丰富节点词库,最后统计不同颜色节点出现的次数,得到向量,实现特征提取。
- 对两个图的向量进行数量积运算,所得即 Weisfeiler-Lehman Kernel 。
- 一般迭代次数越多,效果越好。
- 注1:计算两个图的 Weisfeiler-Lehman Kernel 时,迭代计算要同时进行,即节点颜色词库要由两个图同时贡献。
- 注2:NetwokX 里的 weisfeiler_lehman_graph_hash 实现与上面说的不一样,gklearn.kernels.Weisfeilerlehmankernel 才是一样的。