https://github.com/shenweichen/GraphEmbedding
G = nx.read_edgelist(‘…/data/wiki/Wiki_edgelist.txt’,create_using=nx.DiGraph(),nodetype=None,data=[(‘weight’,int)])
model = DeepWalk(G,walk_length=10,num_walks=80,workers=1)
model.train(window_size=5,iter=3)
embeddings = model.get_embeddings()
evaluate_embeddings(embeddings)
plot_embeddings(embeddings)
▐ 分类任务结果
micro-F1 : 0.6674
macro-F1 : 0.5768
▐ 可视化结果
LINE
之前介绍过DeepWalk,DeepWalk使用DFS随机游走在图中进行节点采样,使用word2vec在采样的序列学习图中节点的向量表示。
LINE也是一种基于邻域相似假设的方法,只不过与DeepWalk使用DFS构造邻域不同的是,LINE可以看作是一种使用BFS构造邻域的算法。此外,LINE还可以应用在带权图中(DeepWalk仅能用于无权图)。
之前还提到不同的graph embedding方法的一个主要区别是对图中顶点之间的相似度的定义不同,所以先看一下LINE对于相似度的定义。
▐ LINE 算法原理
1. 一种新的相似度定义
✎ first-order proximity
1阶相似度用于描述图中成对顶点之间的局部相似度,形式化描述为若之间存在直连边,则边权
即为两个顶点的相似度,若不存在直连边,则1阶相似度为0。如上图,6和7之间存在直连边,且边权较大,则认为两者相似且1阶相似度较高,而5和6之间不存在直连边,则两者间1阶相似度为0。
✎ second-order proximity
仅有1阶相似度就够了吗?显然不够,如上图,虽然5和6之间不存在直连边,但是他们有很多相同的邻居顶点(1,2,3,4),这其实也可以表明5和6是相似的,而2阶相似度就是用来描述这种关系的。形式化定义为,令表示顶点
与所有其他顶点间的1阶相似度,则
与
的2阶相似度可以通过
和
的相似度表示。若
与
之间不存在相同的邻居顶点,则2阶相似度为0。
2. 优化目标
✎ 1st-order
对于每一条无向边,定义顶点
和
之间的联合概率为:
,
为顶点
的低维向量表示。(可以看作一个内积模型,计算两个item之间的匹配程度)
同时定义经验分布:
,
优化目标为最小化:
是两个分布的距离,常用的衡量两个概率分布差异的指标为KL散度,使用KL散度并忽略常数项后有:
1st order 相似度只能用于无向图当中。
✎ 2nd-order
这里对于每个顶点维护两个embedding向量,一个是该顶点本身的表示向量,一个是该点作为其他顶点的上下文顶点时的表示向量。
对于有向边,定义给定顶点
条件下,产生上下文(邻居)顶点
的概率为:
,其中
为上下文顶点的个数。
优化目标为:
,其中
为控制节点重要性的因子,可以通过顶点的度数或者PageRank等方法估计得到。
经验分布定义为:
,
是边
的边权,
是顶点
的出度,对于带权图,
使用KL散度并设
,忽略常数项,有
3. 优化技巧
✎ Negative sampling
由于计算2阶相似度时,softmax函数的分母计算需要遍历所有顶点,这是非常低效的,论文采用了负采样优化的技巧,目标函数变为:
,
是负边的个数。
论文使用,