给定一个节点,找到它的最高权重边(边权最大)

6
我在NetworkX中有一个有向图。边的权重从0到1不等,代表了它们出现的概率。网络连通性非常高,所以我想修剪边缘,使每个节点只保留最高概率的节点。
我不知道如何遍历每个节点并在图中仅保留最高加权in_edges。是否有一种networkx函数可以让我们做到这一点?
以下是我想要实现的示例。
Nodes:
A, B, C, D

Edges:
A->B, weight=1.0
A->C, weight=1.0
A->D, weight=0.5
B->C, weight=0.9
B->D, weight=0.8
C->D, weight=0.9

Final Result Wanted:
A->B, weight=1.0
A->C, weight=1.0
C->D, weight=0.9

如果一个节点有两条边,且它们都是最高权重的,我希望保留它们两个。
3个回答

8
这里有一些想法:
import networkx as nx

G = nx.DiGraph()
G.add_edge('A','B', weight=1.0)
G.add_edge('A','C', weight=1.0)
G.add_edge('A','D', weight=0.5)
G.add_edge('B','C', weight=0.9)
G.add_edge('B','D', weight=0.8)
G.add_edge('C','D', weight=0.9)

print "all edges"
print G.edges(data=True)

print "edges >= 0.9"
print [(u,v,d) for (u,v,d) in G.edges(data=True) if d['weight'] >= 0.9]

print "sorted by weight"
print sorted(G.edges(data=True), key=lambda (source,target,data): data['weight'])

Aric,你的答案非常接近我想要的,但是我对你设置的阈值有些困惑。我不是在寻找某个特定阈值以上的东西(weight >=0.9)。你会发现B->C没有被包括进去,因为有一条从A到C的边权重更高。相反,我正在寻找进入给定节点的最高价值边(或边)。也许我需要编辑问题以使其更清晰? - ericmjl
仔细一看,你的回答给了我所需的灵感。我马上会发布我的解决方案,但在此期间,我会给你的回答点赞。 - ericmjl

7
我使用了Aric的方法,代码如下:

for node in G.nodes():
    edges = G.in_edges(node, data=True)
    if len(edges) > 0: #some nodes have zero edges going into it
        min_weight = min([edge[2]['weight'] for edge in edges])
        for edge in edges:
            if edge[2]['weight'] > min_weight:
                G.remove_edge(edge[0], edge[1])

0

由ericmjl提供的解决方案在我的程序中并不完全有效,原因是出现了运行时错误。此外,它保留了概率最低的边,而不是问题所要求的最高概率的边(因为:删除所有权重>min的边,而不是删除所有权重<max的边)。此外,内部循环只需要对len(edges)>1进行即可,因为我们想要从具有多条边的节点中删除所有边。

完整的解决方案:

for node in G.nodes():
    edges = G.edges(node, data=True)
    if len(edges) > 1:  # some nodes have zero edges going into it
        max_weight = max([edge[2]['weight'] for edge in edges])

        for edge in list(edges):
            if edge[2]['weight'] < max_weight:
                G.remove_edge(edge[0], edge[1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接