Stellargraph使用Node2Vec生成嵌入时报UFuncTypeError如何解决?
报错原因与解决方案
报错根因
从报错栈可以定位到错误触发在gensim的Word2Vec初始化权重阶段,代码尝试将节点ID与种子的字符串形式拼接,当你的节点ID为数值类型(如int、numpy数值类型)时,数值与字符串相加触发类型不匹配错误。该问题本质是你当前使用的gensim版本与Stellargraph官方教程适配的版本存在参数、逻辑差异导致的。
可行解决方案
- 方案1:修改随机游走结果的节点类型(最推荐,无需改动依赖、不丢失边特征)
在你获取随机游走结果的代码后,添加节点转字符串的逻辑,修改后的node2vec_embedding函数如下:
def node2vec_embedding(graph, name): rw = BiasedRandomWalk(graph) walks = rw.run(graph.nodes(), n=num_walks, length=walk_length, p=p, q=q) # 新增:将所有节点ID转为原生字符串 walks = [[str(node) for node in walk] for walk in walks] print(f"Number of random walks for '{name}': {len(walks)}") model = Word2Vec( walks, size=dimensions, window=window_size, min_count=0, sg=1, workers=workers, iter=num_iter, ) def get_embedding(u): # 这里也要对应转字符串匹配查找 return model.wv[str(u)] return get_embedding
修改后就可以正常运行,全程使用Stellargraph的图结构,边特征不会丢失。
方案2:降级gensim到适配版本
Stellargraph官方Node2Vec教程适配的gensim版本为3.8.3,直接执行如下命令安装对应版本即可解决:pip install gensim==3.8.3
安装完成后不需要修改原有代码即可直接运行。方案3:调整转NetworkX的逻辑保留边特征
如果要使用第三方node2vec库,可以在转NetworkX时指定边特征的映射字段,不会丢失边特征:
from node2vec import Node2Vec # 转格式时指定边权重/特征对应的列名 graph_train_nx = StellarGraph.to_networkx(graph_train, edge_weight_attr="你的边特征字段名") # 初始化时指定权重对应的key node2vec = Node2Vec(graph_train_nx, weight_key="你的边特征字段名") model = node2vec.fit()
内容的提问来源于stack exchange,提问作者Reine Baudache
相关产品推荐
相关产品推荐

