目前的图算法一般指:
1.数据结构中的,最小生成树(Prim算法),最短路径(迪杰斯特拉,佛洛依德),拓扑排序,关键路径
2.概率图模型,涉及图的表示
3.图神经网络,包括图嵌入(graph embedding(基于随机游走))和GCN(基于邻居汇聚)两部分
图嵌入:
将图中的节点以低维稠密的形式表达,要求在原始图中相似的节点在地位表达空间也接近。得到的表达向量可以用于下游任务
主要有:deepWalk
deepWalk算法
首先从顶点矩阵选取一个样本,假设n个顶点
构造一个二叉树,应该是类似w2v里的哈夫曼树,为了快速寻找到最终的结果。
循环num_walks次:
遍历每个节点,进行深度随机游走,每个节点获得walk_length作为序列。
这里的深度随机游走,是可重复访问已访问节点。
获得所有节点num_walks次的深度随机游走的序列共num_walks*n个序列
将这些序列作为语料放入w2v中使用skim_gram训练。
deepWalk只适用于无权图,因为它是随机选取领域进行DFS.
LINE:
LINE也是基于领域相似假设的方法,可以看作是使用BFS构造领域的算法,还可以使用在带权图。
对于这样一个图,如何衡量两个点的相似度?
一:两个点直接相连
二:有一些共同的相连的节点
对于第一个两个直接相连,我们可以用一阶相似来度量。
一阶相似度
首先需要了解一下
散度
的概念
一阶相似度:
使用权重的分布来去拟合两个点之间的联合概率分布,使用散度来度量两者概率分布之间的相似情况。
注:一阶相似度只能用于无向图。
二阶相似度:
NODE2VC:
其实和deepwalk算法非常相似,是deepwalk算法的一种扩展。NODE2VEC是将DFS和BFS结合起来的随机游走,通过两个超参数,p和q进行控制游走。
算法流程:
这里面其实主要的还是如何进行有偏采样,即根据顶点邻居节点不同的权重,进行采样。
首先
,遍历所有顶点,对当前顶点的邻居节点构建对应的采样accept和alias表,此时accept表里全是1,alias表全为0,生成alias_node字典存放aceept和alias表.
然后
,遍历所有的边,(node1,node2),找到node2的所有邻居顶点,按照邻居顶点与node1的关系,给以不同的权重,如果与node1相连,给1,如果邻居顶点是node2,给1/p,如果邻居顶点与node1无关,与node2有边,则给1/q;这样就获得了顶点node2与邻居顶点的权重列表,依据权重列表创建采样表accept和alias表,生成alias_edges字典;
Alias算法采样
总共迭代num_walks次:
接着
,遍历每个顶点进行随机游走:当当前的游走序列只有一个顶点时,对当前顶点找到它的所有邻居顶点,对邻接顶点依照alias_node表进行有偏采样
当当前游走序列超过1个顶点,则将序列中最近访问的点对应的边,依照alias_edges字典进行采样
最后生成当前node的随机游走序列
最后
:将迭代了num_walks次,生成的num_walks*num(v)个随机游走序列,放入w2v进行训练,生成各个顶点的向量表示。
(未完待续~)
参考链接:
https://zhuanlan.zhihu.com/weichennote