Networkx 最小生成树 - 精度问题?
Networkx Minimum Spanning Tree - precision issues?
我正在根据大小为 222 x 222 节点的加权邻接矩阵创建图。矩阵中给出的所有权重都是介于0.42757498546089029
和1.6671726002927263
之间的浮点数。 nx.minimum_spanning_tree(G, weight = "weight")
方法给出了下面的第一张图片,同时如果我将所有矩阵值乘以 100.0
相同的方法给出了第二张图片。使用 igraph
绘制相同内容时不会发生这种情况。 Networkx
的文档没有提及精度问题。你知道它为什么会发生吗?
网络代码:
G=nx.from_numpy_matrix(M)
G1=nx.minimum_spanning_tree(G, weight = "weight")
labels = {i : node_names[i][1] for i in G1.nodes()}
colors = {i : node_attributes[labels[i]] for i in G1.nodes()}
for i in G1.nodes():
G1.node[i]["color"] = 'white'
G1.node[i]["style"] = "filled"
G1.node[i]["fillcolor"] = colors[i]
color=nx.get_node_attributes(G1,'color')
fillcolor=nx.get_node_attributes(G1,'fillcolor')
H=nx.relabel_nodes(G1,labels)
nx.draw(H, scale=30, nodelist=H.nodes(), linewidths=0, with_labels = True, node_size=500,font_size=8)
igraph 代码:
g = igraph.Graph.Weighted_Adjacency(M.tolist())
for i, v in enumerate(g.vs):
v["color"] = colors[i]
v["label"] = labels[i]
v["frame_color"] = colors[i]
v["label_size"] = 10
v["size"] = 26
G = g.spanning_tree(weights='weight', return_tree=True)
G.to_undirected()
igraph.plot(G, labels=False, bbox = (900, 900), margin=40, loops=False
)
您看到的是预期行为,根本不是精度问题。顾名思义,spring 布局 "simulates" 节点之间 spring 的动作到它们的位置。节点位置在一个圆圈上初始化,然后 springs 的力被应用于您的节点一定数量的迭代(默认为 50)。在连接权重较弱的情况下,您的节点或多或少会留在圆圈上(第一种情况),在权重较大的情况下,您的节点将被吸引到中心(第二种情况)。
在 igraph 中,默认情况下,未加权的图用于计算布局,您需要明确地为绘图例程提供权重。我怀疑您可能在未指定 "weights" 参数的情况下绘制了图形。
我正在根据大小为 222 x 222 节点的加权邻接矩阵创建图。矩阵中给出的所有权重都是介于0.42757498546089029
和1.6671726002927263
之间的浮点数。 nx.minimum_spanning_tree(G, weight = "weight")
方法给出了下面的第一张图片,同时如果我将所有矩阵值乘以 100.0
相同的方法给出了第二张图片。使用 igraph
绘制相同内容时不会发生这种情况。 Networkx
的文档没有提及精度问题。你知道它为什么会发生吗?
网络代码:
G=nx.from_numpy_matrix(M)
G1=nx.minimum_spanning_tree(G, weight = "weight")
labels = {i : node_names[i][1] for i in G1.nodes()}
colors = {i : node_attributes[labels[i]] for i in G1.nodes()}
for i in G1.nodes():
G1.node[i]["color"] = 'white'
G1.node[i]["style"] = "filled"
G1.node[i]["fillcolor"] = colors[i]
color=nx.get_node_attributes(G1,'color')
fillcolor=nx.get_node_attributes(G1,'fillcolor')
H=nx.relabel_nodes(G1,labels)
nx.draw(H, scale=30, nodelist=H.nodes(), linewidths=0, with_labels = True, node_size=500,font_size=8)
igraph 代码:
g = igraph.Graph.Weighted_Adjacency(M.tolist())
for i, v in enumerate(g.vs):
v["color"] = colors[i]
v["label"] = labels[i]
v["frame_color"] = colors[i]
v["label_size"] = 10
v["size"] = 26
G = g.spanning_tree(weights='weight', return_tree=True)
G.to_undirected()
igraph.plot(G, labels=False, bbox = (900, 900), margin=40, loops=False
)
您看到的是预期行为,根本不是精度问题。顾名思义,spring 布局 "simulates" 节点之间 spring 的动作到它们的位置。节点位置在一个圆圈上初始化,然后 springs 的力被应用于您的节点一定数量的迭代(默认为 50)。在连接权重较弱的情况下,您的节点或多或少会留在圆圈上(第一种情况),在权重较大的情况下,您的节点将被吸引到中心(第二种情况)。
在 igraph 中,默认情况下,未加权的图用于计算布局,您需要明确地为绘图例程提供权重。我怀疑您可能在未指定 "weights" 参数的情况下绘制了图形。