我正在尝试使用networkx和node2vec为边缘列表创建嵌入。我的边缘列表如下:
1 2
1 6
...
450 230
...
601 602
基本上,这是一个无权无向图,并存储在文本文件中。我正在尝试使用以下方法将其转换为图形:
nx_G = nx.read_edgelist(args.input, delimiter=' ', create_using=nx.DiGraph())
G = node2vec.Graph(nx_G, args.directed, args.p, args.q, args.seed)
G.preprocess_transition_probs()
walks = G.simulate_walks(args.num_walks, args.walk_length)
walks = [str(walk) for walk in walks]
model = Word2Vec(walks, size=args.dimensions, window=args.window_size, min_count=0, sg=1, workers=args.workers, iter=args.iter)
model.wv.save_word2vec_format(args.output)
其中args.input提供文本文件。 read_edgelist函数可正确读取节点,并正在创建嵌入。但是,在嵌入文件中,节点的编号不是1到606(这些是我的边缘列表中的节点值):相反,它们的编号为14,数字从0到9,某些特殊字符作为节点值而是为其创建了嵌入。就是说,它不是读取单个位的整数(例如29),而是读取2并为其计算嵌入。我不明白为什么会这样,希望能提供一些见识。
答案 0 :(得分:0)
我通过注释掉networkx存储库的main.py文件中的以下代码行来解决此问题:
walks = [map(str, walk) for walk in walks]
答案 1 :(得分:0)
我建议您使用stellargraph library,它为机器学习提供了很好的图形算法。例如基本的Node2Vec ...
from stellargraph.data import BiasedRandomWalk
from stellargraph import StellarGraph
from gensim.models import Word2Vec
rw = BiasedRandomWalk(StellarGraph(g_nx))
walks = rw.run(
nodes=list(g_nx.nodes()), # root nodes
length=100, # maximum length of a random walk
n=10, # number of random walks per root node
p=0.5, # Defines (unormalised) probability, 1/p, of returning to source node
q=2.0 # Defines (unormalised) probability, 1/q, for moving away from source node
)
model = Word2Vec(walks, size=128, window=5, min_count=0, sg=1, workers=2, iter=1)
model.wv['29']