机器学习 -- DeepWalk

1.0 DeepWalk的提出

Word2Vec是基于序列进行Embedding;但是随着实体之间的关系越来越复杂,网络化,此时序列Embedding需要升级为Graph Ebedding;
在这里插入图片描述

1.1 基本概念:

节点的度:在图论中,和该节点相关联的边的条数,特别地,对于有向图,进入该节点边的条数称为节点的入度;从该节点发出边的条数称为出度;
在这里插入图片描述

1.2 DeepWalk的步骤

  1. 构建每一个节点的随机游走序列, 没有个游走序列有两种截断方式: 游走长度达到给定值 和 该节点没有更多的 邻居节点;
  2. 采用word2vec算法(skip-gram)进行训练,生成每个节点的Embedding表示;
  3. DeepWalk = RandomWalk + SkipGram
    在这里插入图片描述

1.3 DeepWalk的特点

数据量比较稀疏的时候,仍然有比较好的表现;
能够实现并行化操作,节约时间开销;
支持大规模在线执行预测;

1.4 DeepWalk实现代码

1.4.1 算法流程

随机游走

在这里插入图片描述

SkipGram

在这里插入图片描述

1.4.2 Demo
import networkx as nx
import pandas as pd
import numpy as np
import random
from tqdm import tqdm
from sklearn.decomposition import PCA
from gensim.models import Word2Vec

import warnings
warnings.filterwarnings('ignore')

import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv("space_data.tsv", sep = "\t")
# construct an undirected graph
G=nx.from_pandas_edgelist(df, "source", "target", 
                          edge_attr=True, create_using=nx.Graph())
# function to generate random walk sequences of nodes
def get_randomwalk(node, path_length):
    
    random_walk = [node]
    
    for i in range(path_length-1):
        temp1 = set(G.neighbors(node))
        
        temp = set(temp1) - set(random_walk)   
        if len(temp) == 0:
            break
        
        # 随机游走中的随机,体现在这里
        random_node = random.choice(list(temp))
        random_walk.append(random_node)
        node = random_node
        
    return random_walk
get_randomwalk('astronaut', 10)

all_nodes = list(G.nodes())

random_walks = []

for n in tqdm(all_nodes):
    for i in range(5):
        random_walks.append(get_randomwalk(n,10))

# train word2vec model
model = Word2Vec(window = 4, sg = 1, hs = 0,
                 negative = 10, # for negative sampling
                 alpha=0.03, min_alpha=0.0007,
                 seed = 14)

model.build_vocab(random_walks, progress_per=2)

model.train(random_walks, total_examples = model.corpus_count, epochs=20, report_delay=1)
model.similar_by_word('astronaut training')

在这里插入图片描述

相关论文连接:
https://github.com/wzhe06/Reco-papers/blob/master/Embedding/%5BGraph%20Embedding%5D%20DeepWalk-%20Online%20Learning%20of%20Social%20Representations%20%28SBU%202014%29.pdf

DeepWalk是一种基于网络嵌入的无监督学习算法,用于将图形数据嵌入低维空间。其基本思想是将节点表示为向量,这些向量可以用于执行各种任务,例如节点分类、社区检测和链接预测等。DeepWalk通过随机游走来捕捉网络的局部和全局结构,并使用skip-gram模型来学习节点表示。 Python实现DeepWalk的库很多,其中比较流行的是gensim和stellargraph。Gensim是一种用于文本和网络嵌入的Python库,提供了一种快速、高效的实现DeepWalk的方法。Stellargraph是一种专门用于图形机器学习的Python库,它提供了一种灵活的DeepWalk实现,可以用于多种类型的图形数据。 下面是使用gensim进行DeepWalk的示例代码: ```python from gensim.models import Word2Vec from gensim.models import KeyedVectors from gensim.models.deepwalk import DeepWalk from gensim.models.word2vec import LineSentence # 加载网络数据 sentences = LineSentence('data/network.txt') # 训练DeepWalk模型 model = DeepWalk(sentences, size=128, window=5, min_count=1, sg=1, workers=4) model.train(sentences, total_examples=model.corpus_count, epochs=10) # 获取节点向量 node_vectors = model.wv # 保存节点向量 node_vectors.save_word2vec_format('data/node_vectors.txt') ``` 其中,'data/network.txt'是网络数据文件,size是嵌入向量的维度,window是skip-gram模型的窗口大小,min_count是忽略出现次数小于该值的词语,sg是选择使用skip-gram模型还是CBOW模型,workers是用于训练的线程数。 最后,我们将节点向量保存为文本文件,以备后续使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值