DeepWalk算法的参数包括:
graph
: 输入的图结构,使用networkx
库创建的Graph
对象。walk_length
: 随机游走的长度,即每个游走路径包含的节点数量。num_walks
: 每个节点生成的随机游走路径的数量。embedding_size
: 嵌入向量的维度大小。在Word2Vec模型中,每个节点用一个固定长度的向量表示。window_size
: Word2Vec模型中的窗口大小,用于定义上下文单词的范围。它决定了从每个节点的游走路径中提取多少个上下文节点用于训练。num_epochs
: Word2Vec模型的迭代次数,即训练过程中遍历整个数据集的次数。num_workers
: 训练过程中使用的线程/进程数量,用于加速训练过程。
DeepWalk算法通过以下步骤工作:
- 随机游走生成:对于输入的图结构,使用随机游走方法生成大量的随机游走路径。对于每个节点,从其邻居节点中随机选择一个进行扩展,直到达到指定的
walk_length
。- 嵌入学习:使用Word2Vec模型学习节点的嵌入向量。将随机游走路径作为训练数据,通过训练Word2Vec模型来学习节点的嵌入表示。在训练过程中,模型将尝试根据节点的上下文(在游走路径中的其他节点)来预测中心节点。
- 嵌入获取:通过查询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)