使用Word2Vec训练网络嵌入时生成节点向量数远少于总节点数是什么原因
问题根因
你训练时只得到28015个向量是因为Gensim的Word2Vec默认开启了低频词过滤:默认min_count=5,即所有在随机游走序列中总出现次数少于5的节点都会被直接排除,不会生成对应向量。图中度数较低的节点、孤立节点大概率在随机游走中出现次数不足阈值,因此被过滤。
解决步骤
- 第一步:修改Word2Vec初始化参数,关闭低频过滤
你只需要在初始化Word2Vec时添加min_count=1参数,即可保留所有至少出现过1次的节点:def run_skipgram(walk_path): walks = np.load(walk_path).tolist() # 新增min_count=1参数,不过滤任何出现过的节点 skipgram = Word2Vec(sentences=walks, vector_size=128, negative=5, window=8, sg=1, workers=6, epochs=3, min_count=1) keys = list(map(int, skipgram.wv.index_to_key)) keys.sort() vectors = [skipgram.wv[key] for key in keys] return np.array(vectors) - 第二步:验证随机游走序列的完整性
如果修改参数后仍未得到全部169343个节点的向量,说明你生成的随机游走序列本身没有覆盖所有节点,建议提前统计游走序列中所有去重后的节点总数,排查随机游走生成逻辑是否遗漏了孤立节点、度数为0的节点。 - 第三步:校验节点类型一致性
确保游走序列中存储的节点标识和你后续查询的节点类型完全一致,避免出现字符串、整数类型不匹配导致的查询遗漏。
内容的提问来源于stack exchange,提问作者khairi abidi
相关产品推荐
相关产品推荐

