Graph 将图形编辑距离规格化为[0,1](networkx)

Graph 将图形编辑距离规格化为[0,1](networkx),graph,networkx,graph-theory,similarity,edit-distance,Graph,Networkx,Graph Theory,Similarity,Edit Distance,我想要一个标准化的图形编辑距离。 我正在使用这个函数: 我试图理解如何绘制距离函数,以便能够在0和1之间对其进行规格化,但我并不完全理解 例如: def比较图GA,Gb: 画图 绘图 图形编辑距离=nx。图形编辑距离ga,Gb,节点匹配=lambda x,y:x==y 返回图\u编辑\u距离 比较图G1、G3 为什么图形编辑距离=4 图形构造: 哎 编辑距离通过以下方式测量: nx.graph_edit_distance(Ga, Gb, node_match=lambda x,y : x==y

我想要一个标准化的图形编辑距离。 我正在使用这个函数:

我试图理解如何绘制距离函数,以便能够在0和1之间对其进行规格化,但我并不完全理解

例如:

def比较图GA,Gb: 画图 绘图 图形编辑距离=nx。图形编辑距离ga,Gb,节点匹配=lambda x,y:x==y 返回图\u编辑\u距离 比较图G1、G3 为什么图形编辑距离=4

图形构造: 哎

编辑距离通过以下方式测量:

nx.graph_edit_distance(Ga, Gb, node_match=lambda x,y : x==y)
与graph_edit_距离的区别在于它与节点索引相关

这是“优化\编辑\路径”的输出:

list(optimize_edit_paths(G1, G2, node_match, edge_match,
                        node_subst_cost, node_del_cost, node_ins_cost,
                        edge_subst_cost, edge_del_cost, edge_ins_cost,
                        upper_bound, True))
Out[3]: 
[([(1, 1), (2, None), (3, 3)],
  [((1, 2), None), ((2, 3), None), (None, (1, 3)), (None, (3, 1))],
  5.0),
 ([(1, 1), (2, 3), (3, None)],
  [((1, 2), (1, 3)), (None, (3, 1)), ((2, 3), None)],
  4.0)]
我知道它应该是将图G1转换为与G2同构的图的节点和边编辑操作的最小序列

当我尝试计数时,我得到: 1.将节点2添加到G3, 2.从G3取消e1=1,3 3.从G3中取消e2=3,1 4.将e3=1,2添加到G3 5.将e4=2,3添加到G3

图形编辑距离=5

我错过了什么

或者,为了使我收到的距离正常化,我可以做些什么

我想除以| V1 |+| V2 |+| E1 |+| E2 |,或者除以max | V1 |+| E1 |,| V2 |+| E2 |,但我不确定


提前谢谢

我知道它的老帖子,但我目前正在阅读有关GED的文章,并愿意为将来寻找它的人回答

图形编辑距离为4

原因:

1和3使用无向边连接。而1和2使用定向边连接。现在,图形编辑路径将为:

将无向边转换为定向边 将3改为2 将边添加到2 最后向该边添加一个节点
你能给我们这两张图的定义吗?我预计距离为3 delete,这就是我的networkx返回的结果。所以我想我把图表弄错了。我在一个图中看到一条从1到2到3的路径,在另一个图中看到两个方向上的边在1和3之间。在这种情况下,从第一个图形中删除2->3边,删除节点3,然后添加2->1边。这两个图是同构的,尽管标签不一样。嘿,我在文章中添加了细节。我通过关联不同的节点来测量GED:nx.graph\u edit\u distanceGa,Gb,node\u match=lambda x,y:x==yI仍然期望3.0的距离,这就是我的代码复制和粘贴为您定义的图形提供的。请注意,对于任何一对没有属性的节点,您选择的函数node_match将返回True,它不会检查节点名称是否相同。
list(optimize_edit_paths(G1, G2, node_match, edge_match,
                        node_subst_cost, node_del_cost, node_ins_cost,
                        edge_subst_cost, edge_del_cost, edge_ins_cost,
                        upper_bound, True))
Out[3]: 
[([(1, 1), (2, None), (3, 3)],
  [((1, 2), None), ((2, 3), None), (None, (1, 3)), (None, (3, 1))],
  5.0),
 ([(1, 1), (2, 3), (3, None)],
  [((1, 2), (1, 3)), (None, (3, 1)), ((2, 3), None)],
  4.0)]