Python 如何使用networkx计算两个多重图形之间的图形编辑距离?
假设我有两个图G和H:Python 如何使用networkx计算两个多重图形之间的图形编辑距离?,python,python-3.x,networkx,Python,Python 3.x,Networkx,假设我有两个图G和H: G=nx.multi-digraph() G.add_节点(0,id='a',f='none') G.add_节点(1,id='b',f='k') G.添加_边(0,1,r='bicycle') G.添加边(1,0,r='bicycle\u r') G.添加_边(1,0,r='bicycle_rr') H=nx.multi-digraph() H.add_节点(0,id='a',f='none') H.add_节点(1,id='b',f='k') H.add_边(0,1,
G=nx.multi-digraph()
G.add_节点(0,id='a',f='none')
G.add_节点(1,id='b',f='k')
G.添加_边(0,1,r='bicycle')
G.添加边(1,0,r='bicycle\u r')
G.添加_边(1,0,r='bicycle_rr')
H=nx.multi-digraph()
H.add_节点(0,id='a',f='none')
H.add_节点(1,id='b',f='k')
H.add_边(0,1,r='bicycle')
H.add_边(1,0,r='bicycle_r')
networkx
为我们提供了一个非常简单的api来计算相同类型的两个图形之间的编辑距离,即nx.graph\u edit\u距离(G,H,node\u match=node\u match,edge\u match=edge\u match)
。对于node\u match
和edge\u match
,我只是将它们定义为所有标签的精确匹配(即id
和f
用于节点,而r
用于边缘)。这在这里并不重要,因为在我的示例中,两个图之间没有替换操作
G和H之间的编辑距离应为1,因为G在节点1和0之间还有一条边。但是,nx.graph\u edit\u distance
返回的答案是0。它似乎忽略了两个图节点之间的多条边。我用简单的有向图(即nx.DiGraph()
)进行了尝试,效果很好。但我真的不知道如何告诉距离计算器考虑删除多条边
我认为当应用于多个图形时,nx.graph\u edit\u distance
有问题。我试过在多个图上nx.is_同构。此函数返回两个图形是否同构(即距离是否为0),并接受与nx.graph\u edit\u distance
完全相同的输入。它们都有节点匹配
和边缘匹配
。正如文档所建议的那样,edge\u match
的输入应该是G1[u1][v1],G2[u2][v2]
,但是,当我检查nx的edge\u match
输入时,图形编辑距离和nx.是否同构,我发现nx.graph\u edit\u distance
中的edge\u match
的输入边没有multi-graph中的边形状,而nx.graph\u edit\u distance中的edge\u match
的输入边形状是同构的。我认为这可能是networkx的一个严重缺陷
编辑:
我检查了networkx的源代码。现在我很确定这是一只虫子。edge\u match
的用法与文档中的声明不一致
elif边缘匹配:
C[0:m,0:n]=np.数组([1-int(边匹配(G1.边[g],G2.边[h]))
对于挂起中的g\u g对于挂起中的h\u h]
).重塑(m,n)
下面是我对节点匹配
和边缘匹配
的实现:
def节点匹配(n1,n2):
如果n1['id']==n2['id']和n1['f']==n2['f']:
返回真值
其他:
返回错误
def edge_匹配(e1、e2):
如果e1['r']==e2['r']:
返回真值
其他:
返回错误
def多重边缘匹配(e1、e2):
如果e1.keys()!=e2.keys():
返回错误
对于e1.keys()中的k:
如果e1[k]['r']!=e2[k]['r']:
返回错误
返回真值
请注意,根据文档,对于多图,edge\u match
不应该起作用,因为在多图中,G[u1][u2]首先由边id索引,因此我定义了multi\u edge\u match
。但是,nx.graph\u edit\u distance(G,H,node\u match,multi\u edge\u match)
将导致运行错误。我们只能调用nx.graph\u edit\u distance(G,H,node\u match,edge\u match)
,然后得到意外的结果。
而对于nx.is\u同构
,我们只能调用nx.is\u同构(G,H,node\u match,multi\u edge\u match)
而不是nx.is\u同构(G,H,node\u match,edge\u match)
,这就是我所期望的。因此,我认为nx.graph\u edit\u distance
的实现可能不适用于多个图。如果没有错误,至少与文档不一致。请包括您的node\u match
和edeg\u match
功能。我怀疑问题在于您对这些函数的实现,但如果您不包括它们,我们就无法打折。@spinkus是有道理的。我已经用这些函数更新了我的问题。我正在Python3.7上使用NX2.4。graph\u edit\u distance给出1,有无节点匹配或边匹配,我认为您不需要。