不确定它是否完全符合您的要求,但希望您能发现其中一些有用的内容。让我们以以下图形G
和H
为例:
l1 = [['A','C'], ['A', 'D'], ['I','F'], ['K', 'E'], ['D', 'A'], ['A', 'B'], ['C', 'D']]
l2 = [['A','B'], ['Q', 'D'], ['J','F'], ['A', 'E'], ['D', 'F'], ['X','A']]
G = nx.from_edgelist(l1)
H = nx.from_edgelist(l2)
G.nodes()
H.nodes()
为了获得一个相似度“度量”,您可能需要考虑交集和并集的差异来提出一些自定义的相似或不同的定义。也许
Jaccard距离是一个不错的选择。
def jaccard_similarity(g, h):
i = set(g).intersection(h)
return round(len(i) / (len(g) + len(h) - len(i)),3)
jaccard_similarity(G.edges(), H.edges())
这里可能也有用的是制作一个可视化图表,以便于理解两个图形的相似和不同之处。我们可以先使用compose
,它会给我们提供节点集和边集的简单并集:
GH = nx.compose(G,H)
GH.nodes()
遍历组成图的边缘和节点,并根据它们属于哪个图(包括同时属于两个图的情况)为它们分配一种颜色。这也可以扩展为添加一些属性,指示它属于哪个图:
edge_colors = dict()
for edge in GH.edges():
if G.has_edge(*edge):
if H.has_edge(*edge):
edge_colors[edge] = 'magenta'
continue
edge_colors[edge] = 'lightgreen'
elif H.has_edge(*edge):
edge_colors[edge] = 'lightblue'
G_nodes = set(G.nodes())
H_nodes = set(H.nodes())
node_colors = []
for node in GH.nodes():
if node in G_nodes:
if node in H_nodes:
node_colors.append('magenta')
continue
node_colors.append('lightgreen')
if node in H_nodes:
node_colors.append('lightblue')
因此,交叉节点和边缘将具有品红色。否则,它们将分别属于图G或图H,并具有绿色或蓝色。
现在,我们可以使用上述颜色字典/列表来绘制图形。这应该是一个很好的方法来查看两个图中的交叉和不相交节点/边缘:
pos = nx.spring_layout(GH, scale=20)
nx.draw(GH, pos,
nodelist=GH.nodes(),
node_color=node_colors,
edgelist=edge_colors.keys(),
edge_color=edge_colors.values(),
node_size=800,
width=8,alpha=0.5,
with_labels=True)
![输入图像描述](https://istack.dev59.com/ub3zF.webp)