具有Networkx的两个网络的加权Jaccard相似性

2024-05-13 23:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python networkx计算以下两个网络的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})])

我正在使用以下解决方案,请提供in this answer

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),该weighted jaccard measure (distance or similarity)考虑了弧权重,并适用于有向和无向网络,它们可能具有不同的边和节点

你能帮我吗


Tags: 网络truedatalendistancev1measureweight
1条回答
网友
1楼 · 发布于 2024-05-13 23:41:11

对于加权Jaccard,我们需要定义一个向量。如果我们将所有边的并集视为向量维,那么每个图的权重在该空间中形成一个坐标

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距离度量

相关问题 更多 >