DeepWalk算法python实现

 

DeepWalk算法的参数包括:

  1. graph: 输入的图结构,使用networkx库创建的Graph对象。
  2. walk_length: 随机游走的长度,即每个游走路径包含的节点数量。
  3. num_walks: 每个节点生成的随机游走路径的数量。
  4. embedding_size: 嵌入向量的维度大小。在Word2Vec模型中,每个节点用一个固定长度的向量表示。
  5. window_size: Word2Vec模型中的窗口大小,用于定义上下文单词的范围。它决定了从每个节点的游走路径中提取多少个上下文节点用于训练。
  6. num_epochs: Word2Vec模型的迭代次数,即训练过程中遍历整个数据集的次数。
  7. num_workers: 训练过程中使用的线程/进程数量,用于加速训练过程。

 

DeepWalk算法通过以下步骤工作:

  1. 随机游走生成:对于输入的图结构,使用随机游走方法生成大量的随机游走路径。对于每个节点,从其邻居节点中随机选择一个进行扩展,直到达到指定的walk_length
  2. 嵌入学习:使用Word2Vec模型学习节点的嵌入向量。将随机游走路径作为训练数据,通过训练Word2Vec模型来学习节点的嵌入表示。在训练过程中,模型将尝试根据节点的上下文(在游走路径中的其他节点)来预测中心节点。
  3. 嵌入获取:通过查询Word2Vec模型的嵌入向量,获取所有节点的嵌入表示。可以通过model.wv对象的vectors属性获得所有节点的嵌入向量。

环境:

python                    3.10.0

gensim                    4.3.0

networkx                  3.0

import random
from gensim.models import Word2Vec
import networkx as nx
import matplotlib.pyplot as plt


class DeepWalk:
    def __init__(self, graph, walk_length, num_walks, embedding_size, window_size, num_epochs, num_workers):
        self.graph = graph
        self.walk_length = walk_length
        self.num_walks = num_walks
        self.embedding_size = embedding_size
        self.window_size = window_size
        self.num_epochs = num_epochs
        self.num_workers = num_workers

    def random_walk(self, node):
        walk = [node]
        for _ in range(self.walk_length - 1):
            neighbors = list(self.graph.neighbors(node))
            if len(neighbors) == 0:
                break
            node = random.choice(neighbors)
            walk.append(node)
        return walk

    def generate_walks(self):
        walks = []
        nodes = list(self.graph.nodes())
        for _ in range(self.num_walks):
            random.shuffle(nodes)
            for node in nodes:
                walk = self.random_walk(node)
                walks.append(walk)
        return walks

    def learn_embeddings(self, walks):
        model = Word2Vec(walks, vector_size=self.embedding_size, window=self.window_size, min_count=0, sg=1,
                         workers=self.num_workers, epochs=self.num_epochs)
        return model.wv


if __name__ == '__main__':
    # 创建一个空图
    G = nx.Graph()

    # 添加节点和边
    nodes = range(1, 11)  # 生成节点列表从 1 到 10
    edges = [(u, v) for u in nodes for v in nodes if u < v]  # 生成所有节点对应的边,确保边不重复

    G.add_edges_from(edges)

    # 绘制网络图
    nx.draw(G, with_labels=True, node_color='lightblue', edge_color='gray')

    # 保存图形
    plt.savefig('network_graph.png')

    # 显示图形
    plt.show()

    # 创建DeepWalk对象
    deepwalk = DeepWalk(G, walk_length=10, num_walks=20, embedding_size=128, window_size=5, num_epochs=1,
                        num_workers=4)

    # 生成随机游走序列
    walks = deepwalk.generate_walks()

    # 学习嵌入
    embeddings = deepwalk.learn_embeddings(walks)

    # 获取所有节点的嵌入向量
    all_embeddings = embeddings.vectors

    # 输出所有节点的嵌入向量
    for embedding in all_embeddings:
        print(embedding)

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DeepWalk是一种用于学习图形嵌入的算法,它通过将图形中的节点转换为低维向量来捕获节点之间的相似性。DeepWalk使用随机游走来生成节点序列,并将这些节点序列作为输入来训练Skip-Gram模型。在Skip-Gram模型中,每个节点都被视为一个“词”,并且DeepWalk试图学习每个节点表示为低维向量的方式,以便在向量空间中相似的节点彼此接近。 在Python中,可以使用Gensim库来实现DeepWalk算法Gensim是一种用于自然语言处理和主题建模的Python库,也支持图形嵌入。以下是使用Gensim库实现DeepWalk算法的基本步骤: 1. 创建图形:使用networkx库创建一个图形对象,其中包含节点和边。 2. 训练DeepWalk模型:使用Gensim库的DeepWalk类训练DeepWalk模型。需要指定节点序列的长度和向量的维度。 3. 获取节点向量:使用Gensim库的model.wv属性获取节点向量。可以使用节点名称或节点ID来检索相应的向量。 下面是一个使用Gensim库实现DeepWalk算法的示例代码: ```python import networkx as nx from gensim.models import DeepWalk # 创建图形 G = nx.Graph() G.add_edge('A', 'B') G.add_edge('A', 'C') G.add_edge('B', 'D') G.add_edge('C', 'E') G.add_edge('D', 'E') G.add_edge('D', 'F') G.add_edge('E', 'F') # 训练DeepWalk模型 model = DeepWalk(G, walk_length=10, num_walks=80, workers=4) model.train(window_size=5, min_count=1, sg=1, hs=0, negative=5, epochs=20) # 获取节点向量 vector_A = model.wv['A'] print(vector_A) ``` 这段代码创建了一个包含7个节点和7条边的图形,并使用DeepWalk算法将每个节点表示为128维向量。`model.train()`方法用于训练DeepWalk模型,并指定了一些参数,如节点序列的长度、向量的维度和训练的轮数等。最后,使用`model.wv`属性获取节点向量,并使用节点名称来检索相应的向量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值