Je crée un graphique à partir d'une matrice d'adjacence pondérée de la taille de 222 x 222 nœuds. Tous les poids donnés dans la matrice sont des nombres à virgule flottante compris entre 0.42757498546089029
et 1.6671726002927263
. nx.minimum_spanning_tree(G, weight = "weight")
méthode me donne la première image ci-dessous, pendant ce temps, si je multiplie toutes les valeurs de la matrice par 100.0
la même méthode me donne la deuxième image. Cela ne se produit pas en traçant la même chose avec igraph
. La documentation de Networkx
est silencieuse sur les problèmes de précision. Savez-vous pourquoi cela pourrait se produire? Networkx Minimum Spanning Tree - problèmes de précision?
Code 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)
Code 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
)
Ces algorithmes utilisent des nombres à virgule flottante Python et héritent de la précision de ces opérations (les flottants sont de 53 bits selon https://docs.python.org/3/tutorial/floatingpoint.html) – Aric
Peut-être pouvez-vous poster un exemple Nous pouvons donc voir quel est le problème? – Aric
Etes-vous sûr que les arbres sont différents? Je crois que seule la disposition diffère, mais la topologie est la même, du moins au premier coup d'œil. – DyZ