Python Networkx最小生成树-精度问题?

Python Networkx最小生成树-精度问题?,python,igraph,networkx,kruskals-algorithm,Python,Igraph,Networkx,Kruskals Algorithm,我正在从222x222个节点大小的加权邻接矩阵创建一个图。矩阵中给出的所有权重都是介于0.42757498546089029和1.6671726002927263之间的浮点数。nx.minimum_span_treeG,weight=weight方法给出了下面的第一张图片,同时,如果我将所有矩阵值乘以100.0,同样的方法给出了第二张图片。使用IGRAPHE打印时不会发生这种情况。Networkx的文档对精度问题保持沉默。你知道为什么会这样吗? networkx代码: G=nx.from_nu

我正在从222x222个节点大小的加权邻接矩阵创建一个图。矩阵中给出的所有权重都是介于0.42757498546089029和1.6671726002927263之间的浮点数。nx.minimum_span_treeG,weight=weight方法给出了下面的第一张图片,同时,如果我将所有矩阵值乘以100.0,同样的方法给出了第二张图片。使用IGRAPHE打印时不会发生这种情况。Networkx的文档对精度问题保持沉默。你知道为什么会这样吗?

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)
IGRAPHE代码:

    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

)

你看到的是预期的行为,而不是一个精确性问题。顾名思义,弹簧布局模拟节点之间弹簧在其位置上的动作。节点位置在圆上初始化,然后弹簧的力将应用于节点,默认情况下迭代次数为50。使用弱连接权重时,节点将或多或少地保持在第一种情况下的圆上,使用强权重时,节点将朝向第二种情况下的中心


在igraph中,默认情况下,未加权的图形用于计算布局,您需要为绘图例程显式指定权重。我怀疑您可能在未指定权重参数的情况下绘制了图形

这些算法使用Python浮点数并继承这些运算的精度。浮点数是53位。也许你可以发布一个例子,让我们看看问题是什么?你确定树是不同的吗?我相信只是布局不同,但拓扑结构是相同的,至少乍一看是一样的。我没有改变布局,两张图片都是用相同的spring布局绘制的。对于缩放邻接矩阵,为什么图片中的差异会如此巨大?您需要提供一个更好的帮助。我不认为这是一个精度问题,也不认为这与Paul在回答中提出的初始条件有任何关系。为什么你怀疑我绘制的图没有igraph的权重?networkx的答案是正确的,可以看出networkx使用spring作为默认布局。但是igraph默认不使用spring。关于权重参数的设置:只是猜测。关于默认布局:igraph默认情况下使用Kamada Kawei处理小型图,而Fruchterman Reingold又名spring布局处理大型图。IIRC,截止点约为1000个节点。好的,所以igraph使用spring布局,权重指定为G=G.span\u treeweights='weight',return\u tree=True,所以我认为我给了igraph MST权重。尽管如此,为什么G.u加权回报率为假?是否真的没有考虑权重?取决于如何将邻接矩阵转换为图形。igraph.Graph.Weighted_Adjacencyw.tolist,mode='directed'为您提供一个加权的、有向的igraph图形对象,假设w是您的权重矩阵。您应该认真阅读文档。默认情况下,G.to_undirected删除边属性,例如权重。试着用G.to_undirectedcombined_edges='sum'。确保生成的图形仍然具有权重。另外,强制布局为layout=G.layout'fr';IGRAPHE.plotG,布局=布局。。。。