Python留下10%的分支与最大权重NetworkX图

时间:2016-06-11 12:39:18

标签: python graph networkx

我有图表和计算网络密度,现在我应该只保留具有最大权重的分支(网络密度的前10%,例如20个分支,最大权重从200)。我找不到怎么做?

1 个答案:

答案 0 :(得分:2)

这个问题有点令人困惑,因此,如果以后有更多信息,我很乐意修改答案。

  

我有图表并计算网络密度,

我假设你有一个无向(?)加权网络。因此,网络密度(对于加权情况)将通过对边的权重求和并将它们除以可能边的数量来计算(| V | *(| V | -1)其中V是边集和| 。|表示集合的基数)。如果这是您所拥有的,请调用计算出的网络密度Q.

  

我应该只保留具有最大权重的分支(网络密度的前10%

所以,现在,您想要隔离那些的边缘,其重量占Q的10%。让我们调用这个Qfrac=Q*(10/100.0)为此,一般来说,首先按重量按降序对边进行排序,然后开始累积它们的密度贡献,直到累积的总和等于(或超过)Qfrac。

在代码中并假设G是图表,每个边缘都有weight属性:

edgesSorted =  sorted(G.edges(data = True), key=lambda x:x[2]['weight'], reverse=False)
k=0
acc=0.0
NposCons = float(G.number_of_nodes() * (G.number_of_nodes()-1))
while (acc<Qfrac):
    acc+=(edgesSorted[k][2]['weight']/NposCons
    k+=1
edgeExtract = edgesSorted[0:k]

BUT!

  例如20个分支,最大权重来自200)

这个,略有不同。在这种情况下,您似乎不需要进行密度计算,您只需要从图表中包含的200个边缘中选择 10%的高权重边。处理方式略有不同:

同样,在代码中并且具有与上述类似的假设:

edgesSorted =  sorted(G.edges(data = True), key=lambda x:x[2]['weight'], reverse=False)
edgeExtract = edgesSorted[0:int(round(G.number_of_edges() * (10/100.0)))]

希望这有帮助。