TKngDisuke
@TKngDisuke (大輔 徳永)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

NetworkXでのGraph edit distanceのcostの変更がうまく動かない

こちらのgraph_edit_distance

↑上記にあるNetworkXの公式サイトの類似グラフのgraph_edit_distanceの詳細サイトを参考にプログラミングを組みました。
そこで削除、置換、作成が行われる際の重みづけができるのですが、そのコード通りに実行してもエラーが出てしまいます。
環境[python3.9,networkxも最新です,anaconda]
スクリーンショット 2022-10-24 22.48.47.png

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')

スクリーンショット 2022-11-11 15.53.29.png
スクリーンショット 2022-11-11 15.54.15.png

こちらの2つのグラフのGEDは2です。(作成✖️2[nodeとedges])
こちらにdeleteとinsertの重み付けをしたいのですが、公式サイトでは
スクリーンショット 2022-10-24 22.49.09.png

上記の通り、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

1Answer

Comments

  1. stackoverflowに同じような質問と回答があったと思うのですが、見つかりません。
    ともかくlambda関数を指定して、1で返している値を変更すればコストを変更できるはずです。

Your answer might help someone💌