NetworkXでのGraph edit distanceのcostの変更がうまく動かない
こちらのgraph_edit_distance
↑上記にあるNetworkXの公式サイトの類似グラフのgraph_edit_distanceの詳細サイトを参考にプログラミングを組みました。
そこで削除、置換、作成が行われる際の重みづけができるのですが、そのコード通りに実行してもエラーが出てしまいます。
環境[python3.9,networkxも最新です,anaconda]
G1,G2
import numpy as np
import networkx as nx
import scipy as sp
import matplotlib.pyplot as plt
G1 = nx.Graph()
G1.add_nodes_from([("Owner1", {"attribute":"Owner1"},{"label":"Owner1"}),
("M1", {"attribute":"M1"},{"label":"M1"}),
("M2", {"attribute":"M2"},{"label":"M2"}),
("R0", {"attribute":"R0"},{"label":"R0"})])
G1.add_edges_from([("Owner1","R0"), ("Owner1", "M1"),
("M1", "M2")])
print(G1.nodes())
print(G1.edges())
nx.nx_agraph.view_pygraphviz(G1, prog='fdp')
G2 = nx.Graph()
G2.add_nodes_from([("C1", {"attribute":"C1"},{"label":"C1"}),
("S1", {"attribute":"S1"},{"label":"S1"}),
("S2", {"attribute":"S2"},{"label":"S2"}),
("R0R", {"attribute":"R0R"},{"label":"R0R"}),
("M3", {"attribute":"M3"},{"label":"M3"})])
G2.add_edges_from([("C1", "R0R"),
("S1", "S2"), ("C1", "S1"),
("M3", "S2")])
print(G2.nodes())
print(G2.edges())
nx.nx_agraph.view_pygraphviz(G2, prog='fdp')
こちらの2つのグラフのGEDは2です。(作成✖️2[nodeとedges])
こちらにdeleteとinsertの重み付けをしたいのですが、公式サイトでは
上記の通り、costの大きさ、値をどこに書いていればいいのかが書いてません。公式サイトの例題ではrootの例題になっており、説明がありません。
そこで自分で作ってみたのですが、うまくいきません。
GEDの重みづけ、costの変更のプログラミング[エラー有り]
>>> nx.graph_edit_distance(G1, G2,node_del_cost=1,node_ins_cost=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/tokut/opt/anaconda3/lib/python3.9/site-packages/networkx/algorithms/similarity.py", line 190, in graph_edit_distance
for vertex_path, edge_path, cost in optimize_edit_paths(
File "/Users/tokut/opt/anaconda3/lib/python3.9/site-packages/networkx/algorithms/similarity.py", line 1089, in optimize_edit_paths
del_costs = [node_del_cost(G1.nodes[u]) for u in pending_u]
File "/Users/tokut/opt/anaconda3/lib/python3.9/site-packages/networkx/algorithms/similarity.py", line 1089, in <listcomp>
del_costs = [node_del_cost(G1.nodes[u]) for u in pending_u]
TypeError: 'int' object is not callable
そこで他のサイトの
を利用し、無事、ラベル付したGEDでの計算はうまくいきました。
GEDのlabelを考慮付き
for dist in nx.optimize_graph_edit_distance(G1, G2, node_match=lambda a,b: a["attribute"] == b["attribute"]):
print(dist)
こちらは公式サイトに書いていない使い方でうまくいきました。
このようなNetworkXの説明がある日本語のサイトを他に探しましたが、見つかりませんでした。。
そこで重ね付け(cost)をどのようにプログラミングすればうまく行くのかを知りたいです。
よろしくお願いします。
0