小编Joh*_*nes的帖子

如何使用networkx(Python)计算图形编辑距离?

我正在使用图形编辑距离;根据定义,将原图G1变换成与G2同构的图的最小成本和;

图形编辑操作通常包括:

  • 顶点插入将单个新标记的顶点引入到图中。
  • 顶点删除从图中删除单个(通常是断开连接的)顶点。
  • 顶点替换来更改给定顶点的标签(或颜色)。
  • 边插入在一对顶点之间引入新的彩色边。
  • 边删除删除一对顶点之间的单条边。
  • 边缘替换以更改给定边缘的标签(或颜色)。

现在我想使用networkx的实现 - 我没有任何边标签,G1和G2的节点集是相同的,我不想要与G2同构的图,但我想要G2本身;

这主要是因为G1:1->2->3和G2:3->2->1是同构的,但如果节点代表一些事件,从因果关系的角度来看,它们是非常非常不同的;

因此,在这种情况下,我一直在运行如下测试:

import networkx as nx

G=nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edges_from([(1, 2),(2,3)])


G2=nx.DiGraph()
G2.add_node(1)
G2.add_node(2)
G2.add_node(3)
G2.add_edges_from([(3, 2),(2, 1)])


nx.graph_edit_distance(G,G2)
Run Code Online (Sandbox Code Playgroud)

但它返回距离为零,这是有道理的,因为图彼此同构;

所以我尝试设置node_match但仍然没有成功

import networkx as nx

def nmatch(n1, n2):
    return n1==n2 

G=nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edges_from([(1, 2),(2,3)])


G2=nx.DiGraph()
G2.add_node(1)
G2.add_node(2)
G2.add_node(3)
G2.add_edges_from([(3, 2),(2, 1)])


nx.graph_edit_distance(G,G2, node_match=nmatch)

Run Code Online (Sandbox Code Playgroud)

如果我们假设删除或添加边/顶点的成本为 1,则编辑距离应为 4,因为我们可以:

  • 删除 G 中的两条边,添加 G2 中的 2 条边

在不考虑同构但真正等价的情况下计算编辑距离如何合适?

python graph networkx

5
推荐指数
1
解决办法
2619
查看次数

标签 统计

graph ×1

networkx ×1

python ×1