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

时间:2017-04-02 17:48:34

标签: python igraph networkx kruskals-algorithm

我正在从222 x 222节点大小的加权邻接矩阵创建图形。矩阵中给出的所有权重都是0.427574985460890291.6671726002927263之间的浮点数。 nx.minimum_spanning_tree(G, weight = "weight")方法给出了下面的第一张图片,同时如果我将所有矩阵值乘以100.0,则相同的方法会给出第二张图片。在使用igraph绘制相同内容时,不会发生这种情况。 Networkx的文档没有提及精度问题。你知道为什么会这样吗? Minimum spanning tree of a graph with potential precision issues Minimum spanning tree of a graph

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

)

1 个答案:

答案 0 :(得分:-1)

您看到的是预期的行为,而不是精确的问题。顾名思义,弹簧布局“模拟”节点之间弹簧对其位置的作用。节点位置在圆上初始化,然后弹簧的力被应用于节点一定次数的迭代(默认为50)。在连接权重较弱的情况下,您的节点将或多或少地保留在圆上(第一种情况),具有较强的权重,您的节点将倾向于中心(第二种情况)。

在igraph中,默认情况下,未加权图用于计算布局,您需要明确给出绘图例程权重。我怀疑你可能已经绘制了图形而没有指定“权重”参数。