DeepWalk、Node2Vec算法

DeepWalk

DeepWalk算法的中心思想就是在图中随机游走生成节点序列,之后用Word2Vec的方式得到节点的embedding做下游任务。

随机游走

在介绍Deepwalk算法之前,需要先了解游走序列的生成方式。随机游走即在特定网络拓扑构成的图中,从图中的一个随机节点开始,根据此节点的连通情况随机的选择下一个节点,进行一定步长的游走,起止节点之间所经过的节点即为一条游走序列,图中所有节点都要进行一次以此节点为起点的游走,并重复游走数次。

talk is cheap show me the code

import networkx as nx
import random
import matplotlib.pyplot as plt

def random_walk(g: nx.Graph, start_node: int, walk_len: int):
    """
    :param g: 图
    :param start_node: 开始节点
    :param walk_len: 游走步长
    :return:
    """
    walks = [start_node]  # 初始化walks
    while len(walks) < walk_len:
        last = walks[-1]  # 当walks小于要求的步长时获取上一个节点
        neighbor = list(g.neighbors(last))  # 获取邻居节点
        next = random.choice(neighbor)  # 随机选择下一个节点
        walks.append(next)
    print(walks)
    return walks


g = nx.karate_club_graph()
plt.figure(figsize=(10,9))
nx.draw_networkx(g)
for i in range(10):
    random_walk(g, 0, 10)


可以看到输出结果及打印的图,从0节点开始,随机游走10次。
在这里插入图片描述

在这里插入图片描述

通过word2vec模型生成词嵌入

通过 gensim 的 word2vec 模型对上述随机游走获得的训练语料进行训练,获取词嵌入:

# 3.通过word2vec模型生成词嵌入
from gensim.models import Word2Vec

random_walk = random_walk(g, 0, 10)
walks = [str(i) for i in random_walk]
print(walks)
params = {"sentences": walks, "min_count": 0, "vector_size": 64,
          "sg": 1, "hs": 0, "workers": 3, "window": 5, "epochs": 3}

"""
sentneces:训练语料 walks - 随机游走获取的随机关注关系序列
min_count: 最低询频 0 - 为了所有节点都能生成 embedding
vector_size: 询嵌入维度,老版本为size 64 - 一般为2的开方倍数
sg: JI法选择 0-CBOW 1-skip-gram 1 - 选择 skip-gram
hs: 是否使用屋次softmax 0 - 不使用层次 softmax,因为这里语料库很少
workers: 训练的并行度 3 - 并行度,单机选择合适核数即可
window: 5 - 窗口大小
epochs: 训练轮次,老版本也用为iter,报错的话可以换一下 3 - 训练三轮
"""
model = Word2Vec(**params)


def get_embeddings(w2v_model, graph):
    invalid_word = []
    embeddings = {}
    for word in graph.nodes():
        if word in w2v_model.wv:
            embeddings[word] = w2v_model.wv[word]
        else:
            invalid_word.append(word)
    print("无效word", len(invalid_word))
    print("有效embedding", len(embeddings))

    return embeddings


embedding = get_embeddings(model, g)
print(embedding)

可以看到,随机游走序列:[‘0’, ‘8’, ‘32’, ‘31’, ‘0’, ‘7’, ‘3’, ‘7’, ‘1’, ‘13’]
embedding:
在这里插入图片描述

Node2Vec

上述这样一种简单的随机游走在表现和效率上会有一些缺憾。比防说如下图所示:
这样一个图结构,我们有两种思路:

1、采用深度优先的方法,优先采集出一个尽可能长的序列。
2、采用广度优先的方法,尽可能将一个点周围的邻居节点先采集一遍。
在这里插入图片描述
这种采集策略在DeepWalk中就不曾考虑到,所以Node2Vec针对这个问题,提出引入一个新的参数来控制这样一个过程。

在Node2Vec引入参数α来控制随机游走的倾向。以下图为例,假设我们已经采集了t、v节点了,接下来要采集x节点:

1、假设我们采集了x2,x3节点,那么就更倾向于深度搜索
2、假设我们采集了x1节点,那么就更倾向于广度搜索
3、假设我们采集了t节点,那么就更倾向于走回头路的。
在这里插入图片描述
α的值在实验开始前就需要确定,它是由p,q两个超参数来决定,
假设p很大而q很小,那么就会优先采集x2,x3两个节点,假设p,q都很大,就会优先采集x1节点。
可以看到,我们可以通过这种方式,根据不同的图设置不同的采集思路,以此得到质量更高的节点序列~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值