前提
環境[python3.9,networkxも最新です,anaconda]
上記の環境でグラフの類似率を求めるプログラミングを実行しています。
https://networkx.org/documentation/stable/reference/algorithms/similarity.html#
↑NetworkXの公式サイトの類似グラフのgraph_edit_distanceの詳細サイトを参考にプログラミングを組みました。
GEDという手法を用いるのですが、その内容を理解しないといけないので参考URLを置いておきます。
https://nw.tsuda.ac.jp/lec/EditDistance/
そこで削除、置換、作成が行われる際の重みづけができるのですが、そのコード通りに実行してもエラーが出てしまいます。
実現したいこと
削除、置換、作成が行われる際の重みづけをできるようにする。
(普段は削除は1、置換は1、作成は1だと思いますが、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
該当のソースコード
python
1import numpy as np 2import networkx as nx 3import scipy as sp 4import matplotlib.pyplot as plt 5 6G1 = nx.Graph() 7G1.add_nodes_from([("Owner1", {"attribute":"Owner1"},{"label":"Owner1"}), 8("M1", {"attribute":"M1"},{"label":"M1"}), 9("M2", {"attribute":"M2"},{"label":"M2"}), 10("R0", {"attribute":"R0"},{"label":"R0"})]) 11G1.add_edges_from([("Owner1","R0"), ("Owner1", "M1"), 12("M1", "M2")]) 13print(G1.nodes()) 14print(G1.edges()) 15nx.nx_agraph.view_pygraphviz(G1, prog='fdp') 16 17G2 = nx.Graph() 18G2.add_nodes_from([("C1", {"attribute":"C1"},{"label":"C1"}), 19("S1", {"attribute":"S1"},{"label":"S1"}), 20("S2", {"attribute":"S2"},{"label":"S2"}), 21("R0R", {"attribute":"R0R"},{"label":"R0R"}), 22("M3", {"attribute":"M3"},{"label":"M3"})]) 23G2.add_edges_from([("C1", "R0R"), 24("S1", "S2"), ("C1", "S1"), 25("M3", "S2")]) 26print(G2.nodes()) 27print(G2.edges()) 28 29nx.nx_agraph.view_pygraphviz(G2, prog='fdp') 30 31nx.graph_edit_distance(G1, G2,node_subst_cost=(G1.nodes[G1], G2.nodes[G2]), node_del_cost=1, node_ins_cost=1)
こちらの2つのグラフのGEDは2です。(作成✖️2[nodeとedges])
こちらにdeleteとinsertの重み付けをしたいのですが、公式サイトでは
上記の通り、costの大きさ、値をどこに書いていればいいのかが書いてません。公式サイトの例題ではrootの例題になっており、説明がありません。
そこで自分で作ってみたのですが、うまくいきません。
試したこと
様々な記載方法を試しましたが、実行する際にエラーが出てしまいます。
https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/networkx%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E9%A1%9E%E4%BC%BC%E5%BA%A6/
上記のサイトを利用してラベル付きのGED測定はできたのですが、重み付けの記事がなく、どうやってうまくcostを自分のやりたいように増やせるかがわかりません。
補足情報(FW/ツールのバージョンなど)
環境[python3.9,networkxも最新です,anaconda]
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/17 12:15
2023/01/02 17:57
2023/01/02 19:02
2023/01/06 04:58
2023/01/06 08:19
2023/01/06 08:45
2023/01/06 14:14