使用 Networkx 的两个网络的加权 Jaccard 相似度

Weighted Jaccard Similarity for Two Networks with Networkx

我正在使用 Python networkx 计算以下 2 个网络的 Jaccard 相似度:

G.edges(data=True)
OutEdgeDataView([('v1', 'a', {'weight': 1}), ('v1', 'b', {'weight': 1}), ('a', 'd', {'weight': 1}), ('a', '11', {'weight': 7}), ('b', 'v4', {'weight': 1}), ('b', 'v9', {'weight': 1}), ('v9', 'b', {'weight': 1})])

K.edges(data=True)
OutEdgeDataView([('v1', 'asssssss', {'weight': 1}), ('v1', 'b', {'weight': 1}), ('asssssss', 'd', {'weight': 1}), ('asssssss', '11', {'weight': 7}), ('b', 'asssssss', {'weight': 10}), ('b', 'd', {'weight': 10}), ('v9', 'b', {'weight': 1})])

我正在使用以下解决方案 :

def jaccard_similarity(g, h):
    i = set(g).intersection(h)
    return round(len(i) / (len(g) + len(h) - len(i)),6)

jaccard_similarity(G.edges(), K.edges())
0.166667

但是,我需要将此计算扩展到 weighted jaccard measure (distance or similarity),其中 考虑了弧权重 并且适用于有向和无向网络,它们可能具有不同的边和节点。

你能帮帮我吗?

对于加权的Jaccard,我们需要定义一个向量。如果我们将所有边的并集视为我们的向量维度,那么每个图的权重都会在 space.

中形成一个坐标
def weighted_jaccard(g1, g2):
    edges = set(g1.edges()).union(g2.edges())
    mins, maxs = 0, 0
    for edge in edges:
        weight1 = g1.get_edge_data(*edge, {}).get('weight', 0)
        weight2 = g2.get_edge_data(*edge, {}).get('weight', 0)
        mins += min(weight1, weight2)
        maxs += max(weight1, weight2)
    return mins / maxs

当所有权重都为1时,这个定义与非加权Jaccard一致

值得指出的是,一旦您以这种方式定义了向量,您几乎可以应用任何 Rn 距离度量。