我有图表和计算网络密度,现在我应该只保留具有最大权重的分支(网络密度的前10%,例如20个分支,最大权重从200)。我找不到怎么做?
答案 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)))]
希望这有帮助。