Traditional Method for ML in Graphs
lecture2主要介绍的是传统的图机器学习方法,从三个维度进行阐述:Node level, Link level, Graph level。想要应用机器学习模型,首先需要从图中提取出能够充分表示这张图信息的特征,而本节lecture介绍的就是比较传统的feature engineering。
Node Level
Node level 的任务比较典型的是对节点进行分类,如下图所示
那么假如我们想使用比如SVM来做节点分类,那么我们就需要节点的feature vector。传统的节点特征包括:
- node degree
- node centrality
- clustering coefficient
- graphlets
Node Degree
最intuitive的节点特征应该就是度
但是只用度作为特征肯定效果是非常差的,因为不同的节点很可能有相同的度,并且度没有考虑到当前节点和它的neighbor之间的connection。
Node Centrality
node degree没有考虑neighbor的importance,因此node centrality将neighbor的importance考虑进来。
Eigenvector centrality
我们认为与相对重要的结点相连的结点是重要的,因此定义结点
v
v
v的centrality
c
v
c_v
cv:
c
v
=
1
λ
∑
u
∈
N
(
v
)
c
u
c_v = \frac{1}{\lambda}\sum_{u \in N(v)}c_u
cv=λ1u∈N(v)∑cu
但是这样一来就变成了一个递归的问题,不好解决。我们用图的Adjacency matrix对上式进行改写就变成了
λ
c
=
A
c
A
i
s
t
h
e
a
d
j
a
c
e
n
c
y
m
a
t
r
i
x
o
f
g
r
a
p
h
G
\lambda c\ =\ Ac \ \ \ \ \ \ \ \ \ \ \ \ \ A\ is\ the \ adjacency\ matrix\ of\ graph\ G
λc = Ac A is the adjacency matrix of graph G
于是不难发现
c
c
c应该是
A
A
A的一个特征向量。根据 Perron-Frobenius Theorem,最大特征值一定是正的且唯一的,因此我们取
λ
=
λ
m
a
x
\lambda\ =\ \lambda_{max}
λ = λmax,
c
c
c就是
λ
m
a
x
\lambda_{max}
λmax对应的特征向量
Betweenness Centrality
Betweenness centrality认为如果一个节点存在于很多最短路上,那么它应该是重要的,举一个直观的例子就是星形图
很显然
1
1
1号结点肯定是最重要的。因此定义结点
v
v
v的betweenness centrality
c
v
=
∑
s
≠
v
≠
t
#
(
s
h
o
r
t
e
s
t
p
a
t
h
s
b
e
t
w
e
e
n
s
a
n
d
t
t
h
a
t
c
o
n
t
a
i
n
s
v
)
#
(
s
h
o
r
t
e
s
t
p
a
t
h
s
b
e
t
w
e
e
n
s
a
n
d
t
)
c_v\ =\ \sum_{s \ne v\ne t} {\frac{\#(shortest\ paths\ between\ s\ and\ t\ that\ contains\ v)}{\#(shortest\ paths\ between\ s\ and\ t)}}
cv = s=v=t∑#(shortest paths between s and t)#(shortest paths between s and t that contains v)
Closeness Centrality
Closeness centrality认为如果一个结点到其他结点的最短路长度比较小,那么它的重要性就相对大,因此定义结点
v
v
v的closeness centrality
c
v
=
1
∑
u
≠
v
s
h
o
r
t
e
s
t
p
a
t
h
l
e
n
g
t
h
b
e
t
w
e
e
n
u
a
n
d
v
c_v\ =\ \frac{1}{\sum_{u\ne v}{shortest\ path\ length\ between\ u\ and\ v}}
cv = ∑u=vshortest path length between u and v1
Clustering Coefficient
Clustering Coefficient是衡量的是结点
v
v
v的neighbor的聚合程度,计算公式为:
e
v
=
#
(
e
d
g
e
s
a
m
o
n
g
n
e
i
g
h
b
o
r
i
n
g
n
o
d
e
s
)
(
d
v
2
)
e_v\ =\ \frac{\#(edges\ among\ neighboring\ nodes)}{\tbinom{d_v}{2}}
ev = (2dv)#(edges among neighboring nodes)
clustering coefficient的分子计算的其实是包含结点 v v v的triangle(三元环)的数量
Graphlet
Graphlet衡量的是结点 v v v的neighbor结构
在介绍如何定义graphlet之前,需要了解一个概念:induced subgraph
Induced Subgraph
induced subgraph是图G的一个子图,包含结点子集 V ′ V' V′以及连接这些节点的所有边,如下图
有了这个概念,我们就可以定义graphlet: Rooted connected induced non-isomorphic subgraphs .下图展示了5个结点的图一共有73种不同的graphlet
Graphlet Degree Vector
有了graphlet的概念以后,就可以定义Graphlet Degree Vector:以结点 v v v为根的graphlet的数量
Link-Level
Link-Level Prediction Task
对于边的预测通常是根据现有的边来预测未来可能出现的边,比如好友预测,A关注了B,B关注了C,那么A和C就有很大概率互相关注。具体来说,Link Prediction有两种形式:
- Links missing at random:随机地隐藏一些边,然后预测它们
- Link over time:根据 t 0 ∼ t 0 ′ t_0 \sim t_0' t0∼t0′时刻的图 G [ t 0 , t 0 ′ ] G[t_0,t_0'] G[t0,t0′],预测在 t 1 ∼ t 1 ′ t_1 \sim t_1' t1∼t1′时刻新出现的边
Link-Level Feature
与Node-Level类似,我们同样需要边的feature来应用机器学习模型进行预测。由于边通常是用一对结点 ( u , v ) (u,v) (u,v)来表示,因此我们只需要计算结点对的特征即可。
Distance-based feature
这一种特征是基于距离的,通过计算两点之间的最短路来表示一对结点的特征
但是这种方法一个很明显的缺点就是无法捕获neighborhood的信息,比如上面的例子中 ( B , H ) (B,H) (B,H)有两个公共的neighbor C , D C,D C,D,而 ( A , B ) 、 ( B , E ) (A,B)、(B,E) (A,B)、(B,E)都只有一个,但是它们的feature却是一样的。
Local Neighborhood Overlap
这种方法是考虑了两个结点之间公共的邻居结点数量,有三种不同的计算方式:
- Common Neighbor: ∣ N ( u ) ⋂ N ( v ) ∣ |N(u)\ \bigcap\ N(v)| ∣N(u) ⋂ N(v)∣
- Jaccard’s coefficient: ∣ N ( u ) ⋂ N ( v ) ∣ ∣ N ( u ) ⋃ N ( v ) ∣ \frac{|N(u) \bigcap N(v)|}{|N(u) \bigcup N(v)|} ∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣
- Adamic-Adar index: ∑ w ∈ N ( u ) ⋂ N ( v ) 1 l o g ( d w ) \sum_{w \in N(u) \bigcap N(v)}{\frac{1}{log(d_w)}} ∑w∈N(u)⋂N(v)log(dw)1
但是这种方法仍然存在一个局限性,我们只考虑了局部的公共邻居,这使得如果一对结点没有common neigbor,那么他们所表示的边的特征就是0,意味着预测的时候这对结点之间不会出现边。但实际情况中显然不是这样
比如这张图里所展示的结点 A A A和结点 E E E是没有common neighbor的,但是它们之间显然是有可能出现边的。
Global Neighborhood Overlap
这种方法针对上面Local Neighbhood Overlap的缺点,提出了考虑全局的公共neighbor。一对结点
(
u
,
v
)
(u,v)
(u,v)的特征表达方式是:统计结点
u
u
u和结点
v
v
v之间所有长度的path,也叫做Katz index。而
(
u
,
v
)
(u,v)
(u,v)之间长度为
l
l
l的路径数量我们可以直接通过adjancency matrix来获取,也就是
A
u
v
l
A_{uv}^{l}
Auvl。实际的Katz index会加一个discount factor,所以公式为:
f
u
v
=
∑
l
=
1
∞
β
l
A
u
v
l
f_{uv}\ =\ \sum_{l=1}^{\infty}{\beta_{l}A^{l}_{uv}}
fuv = l=1∑∞βlAuvl
这个式子可以用级数写成矩阵的形式:
f
=
(
I
−
β
A
)
−
1
−
I
f\ =\ (I -\beta A)^{-1} - I
f = (I−βA)−1−I
Graph-Level
最后是图级别的特征表示,我们希望设计一个 ϕ ( G ) \phi(G) ϕ(G)来表示图 G G G的整体特征。可能是因为图特征一般都是很高维的,如果直接计算的话复杂度会很高,因此在图特征方面通常是应用核方法。l这里介绍两种kernel:
- Graphlet kernel
- Weisfeiler-Lehman kernel
这两种核都采用的是一种 Bag-of-sth 的思想,只不过这里的sth相对比较复杂。
Graphlet Kernel
在Node-Level中提到了Graphlet,但是这里的Graphlet有所不同。不同之处体现在:
- 不需要满足connected的条件
- 不需要是rooted
我们令
g
k
=
(
g
1
,
g
2
,
…
,
g
n
k
)
g_k\ =\ (g_1,g_2,\dots,g_{n_k})
gk = (g1,g2,…,gnk)表示大小的为
k
k
k的Graphlet list,那么Graphlet feature就定义为图
G
G
G中不同大小的Graphlet的数量,也就是
f
(
G
)
i
=
#
(
g
i
⊆
G
)
i
=
1
,
2
,
.
.
.
,
n
k
f(G)_{i}\ =\ \#(g_i \subseteq G)\ \ \ \ \ \ \ i = 1,2,...,n_k
f(G)i = #(gi⊆G) i=1,2,...,nk
然后我们再做一个Normalization,令 h ( G ) i = f ( G ) i ∑ j f ( G ) j h(G)_{i}\ =\ \frac{f(G)_i}{\sum_{j}f(G)_{j}} h(G)i = ∑jf(G)jf(G)i,于是 K ( G , G ′ ) = h G T h G ′ K(G,G')\ =\ h_G^Th_{G'} K(G,G′) = hGThG′。
这种kernel的效果虽然不错,但是计算Graphlet的代价太大,统计一个 n n n个结点的图G中大小为 k k k的Graphlet数量的时间复杂度是 O ( n k ) O(n^k) O(nk)
Weisfeiler-Lehman Kernel
WL kernel是一种更加高效的kernel,如果说Graphlet Kernel用到的是Bag-of-Graphlets,那么WL kernel就像是Bag-of-neighbors,是通过一种叫做Color Refinement的算法来计算特征的。具体的流程如下:
- 给每个结点 v v v设置一个初始颜色 c v ( 0 ) c^{(0)}_{v} cv(0)
- 将结点 v v v的所有邻居 u u u的颜色与节点 v v v的颜色合并,然后重新map为一个新的颜色: c v ( k + 1 ) = M A P { c v ( k ) , { c u ( k ) , u ∈ N ( v ) } } c^{(k+1)}_v\ =\ MAP\{c^{(k)}_{v}, \{c^{(k)}_{u},\ u \in N(v)\}\} cv(k+1) = MAP{cv(k),{cu(k), u∈N(v)}}。
- 重复第二个步骤
- 最后我们统计每种颜色出现的数量作为图 G G G的特征向量
看一个具体的例子比较好理解
最终上面两幅图的feature vector分别为:
于是WL Kernel的计算公式为: K ( G , G ′ ) = ϕ ( G ) T ϕ ( G ′ ) K(G,G')\ =\ \phi(G)^T\phi(G') K(G,G′) = ϕ(G)Tϕ(G′)