使用 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 距离度量。
我正在使用 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 距离度量。