图广泛存在于真实世界的多种场景中,即节点和边的集合。通过对它们的分析,我们可以深入了解社会结构、语言和不同的交流模式,因此图一直是学界研究的热点。
图分析任务可以大致抽象为以下四类: ( a )节点分类,( b )链接预测,( c )聚类,以及( d )可视化。
但是传统的机器学习图形是有限的。这些网络关系只能使用数学、统计和机器学习的特定子集,而向量空间有更丰富的方法工具集。
所以提出来的嵌入是压缩的表示。邻接矩阵描述图中节点之间的连接。它是一个|V| x |V|矩阵,其中|V|是图中节点的个数。矩阵中的每一列和每一行表示一个节点。矩阵中的非零值表示两个节点相连。使用邻接矩阵作为大型图的特征空间几乎是不可能的。所以嵌入比邻接矩阵更实用,因为它们能将节点属性打包到一个维度更小的向量中。
图嵌入(Graph Embedding,也叫Network Embedding)是一种将图数据(通常为高维稠密的矩阵)映射为低微稠密向量的过程,捕获图的拓扑结构、顶点到顶点的关系以及关于图、子图和顶点的其他相关信息,能够很好地解决图数据难以高效输入机器学习算法的问题。
但是图嵌入也需要满足一定的要求:
Deepwalk是一种将随机游走(random walk)和word2vec两种算法相结合的图结构数据挖掘算法。该算法能够学习网络的隐藏信息,能够将图中的节点表示为一个包含潜在信息的向量。
(1). 建图:构建数据集的关系图网络
(2).采路径:graph就是上面建的图网络,seed_nodes为路径的起点node,walk_length表示路径走多长。
def sample_walks(self, graph, seed_nodes, walk_length):
walks = dgl.sampling.random_walk(graph, seed_nodes, length=walk_length)
return walks
(3).skip-gram:采出路径后,接下来就得根据skip-gram方法采出用来训练的节点对了。
def skip_gram_gen_pairs(self, walk, half_win_size=2):
src, dst = list(), list()
l = len(walk)
# rnd = np.random.randint(1, half_win_size+1, dtype=np.int64, size=l)
for i in range(l):
real_win_size = half_win_size
left = i - real_win_size
if left < 0:
left = 0
right = i + real_win_size
if right >= l:
right = l - 1
for j in range(left, right + 1):
if walk[i] == walk[j]:
continue
src.append(walk[i])
dst.append(walk[j])
return src, dst
class SkipGramModel(nn.Module):
def __init__(self, num_nodes, embed_dim):
super(SkipGramModel, self).__init__()
self.num_nodes = num_nodes
self.emb_dimension = embed_dim
self.embed_nodes = nn.Embedding(self.num_nodes, self.emb_dimension, sparse=True)
nn.init.xavier_uniform_(self.embed_nodes.weight)
def forward(self, src, pos, neg):
embed_src = self.embed_nodes(src) # (B, d)
embed_pos = self.embed_nodes(pos) # (B, d)
embed_neg = self.embed_nodes(neg) # (B, neg_num, d)
pos_socre = torch.sum(torch.matmul(embed_src, embed_pos.transpose(0, 1)), 1)
pos_socre = -F.logsigmoid(pos_socre)
neg_socre = torch.sum(torch.matmul(embed_src, embed_neg.transpose(1, 2)), (1, 2))
neg_socre = -F.logsigmoid(-neg_socre)
loss = torch.mean(pos_socre + neg_socre)
return loss
完整代码见博主分享
https://blog.csdn.net/liangwqi/article/details/102957180
https://zhuanlan.zhihu.com/p/397710211