如何通过考虑节点名称来测量图形编辑距离

时间:2019-03-29 20:41:07

标签: python-3.x networkx

我使用networkx库在python中定义了两个图,现在我要考虑节点的“名称”来测量这两个图之间的距离

我创建了两个图,看起来完全一样(树图)

G=nx.Graph()
G.add_edges_from([("A","B"),("A","C")])

H=nx.Graph()
H.add_edges_from([("X","Y"),("X","Z")])

res=nx.graph_edit_distance(G,H)
res2=nx.optimize_edit_paths(G,H)
res3=nx.optimal_edit_paths(G,H)

我希望替换所有节点,因为节点名称不同,但是我得到的结果是成本(更改/距离)为0。这意味着该函数未考虑节点的名称。

documentation中,建议使用函数“ node_math”,但我不知道如何使用它。它似乎不是networkx函数。

1 个答案:

答案 0 :(得分:1)

给出答案为0的原因是因为它认为节点相等。如果您看到该文档,便会提到

  

node_match(可调用)–如果G1中的节点n1,则返回True的函数   和G2中的n2在匹配过程中应被视为相等。

     

该函数将被调用

node_match(G1.nodes[n1], G2.nodes[n2]).
     

也就是说,该函数将接收以下节点的属性字典   n1和n2作为输入。

现在,由于您尚未声明任何属性,因此在这种情况下

G.nodes['A'] will return {}

H.nodes['Z'] will return {}

现在,由于两者都是空字典,因此它们将被视为相等。

这是您代码的修改版本,我在其中为您的节点添加了标签属性。

import networkx as nx

G=nx.Graph()
G.add_nodes_from([("A", {'label':'a'}), ("B", {'label':'b'}),
                  ("C", {'label':'c'})])

G.add_edges_from([("A","B"),("A","C")])

H=nx.Graph()
H.add_nodes_from([("X", {'label':'x'}), ("Y", {'label':'y'}),
                  ("Z", {'label':'z'})])
H.add_edges_from([("X","Y"),("X","Z")])

# This is the function which checks for equality of labels
def return_eq(node1, node2):
    return node1['label']==node2['label']

print(nx.graph_edit_distance(G, H, node_match=return_eq))
# Output: 3