生成具有幂律度分布的无标度网络

Ago*_*ino 5 python graph networkx graph-algorithm

我正在尝试生成具有以下内容的无标度网络:

  • 具有相同指数的幂定律的度数分布
  • 完全相同的节点数。

我需要建立至少60对夫妻,并为每个夫妻进行仿真。

为此,我需要一种方法来生成具有上述属性的正好n个节点的网络。

现在,我可以使用NetworkX Python库,使用给定的指数,根据给定幂次幂生成具有度数分布的图形。

import networkx as nx
import matplotlib.pyplot as plt

#create a graph with degrees following a power law distribution
s = nx.utils.powerlaw_sequence(100, 2.5) #100 nodes, power-law exponent 2.5
G = nx.expected_degree_graph(s, selfloops=False)

print(G.nodes())
print(G.edges())

#draw and show graph
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos)
plt.show()
Run Code Online (Sandbox Code Playgroud)

但是,这会生成具有许多孤立节点的图形,并且通常不止一个连接的组件。

我可以丢弃孤立的节点,但是最终网络中的节点将少于我的预期,并且可能不是单个网络。它可能是2个或更多独立连接的组件。

Joe*_*oel 3

首先一个问题 - 您是否有理由不想要孤立的节点或多个连接的组件?原则上,真正的“随机”幂律图将具有这些。

所以一些评论:

1)如果你使用expected_ Degree_graph,你将很难消除孤立的节点。这是因为有许多节点的预期度数约为 1(但实际度数来自泊松分布)。这意味着他们的学位很有可能小于 1。要证明这一点,请打印s

2) 另一种选择是使用配置模型图来构建网络。为此,我们从幂律序列中取出数字并取出整数部分。扔掉那些为 0 的。然后用于nx.configuration_model创建图形。然后,您可以删除自环和重复的边。但是,您应该小心 - 高度节点可能有许多自环或重复边。所以你需要小心幂律的尾部不要被剪得太快。这并不能解决拥有多个组件的问题。通常,您将拥有一个非常大的组件和一些非常小的独立组件。除非你有充分的理由丢弃这些案例,否则丢弃这样的案例会使你的样本产生偏差。

import networkx as nx
import matplotlib.pyplot as plt

#create a graph with degrees following a power law distribution

#I believe we can eliminate this loop to find s by using the call   
#nx.utils.create_degree_sequence(100,powerlaw_sequence) with 
#appropriate modification
while True:  
    s=[]
    while len(s)<100:
        nextval = int(nx.utils.powerlaw_sequence(1, 2.5)[0]) #100 nodes, power-law exponent 2.5
        if nextval!=0:
            s.append(nextval)
    if sum(s)%2 == 0:
        break
G = nx.configuration_model(s)
G=nx.Graph(G) # remove parallel edges
G.remove_edges_from(G.selfloop_edges())

#draw and show graph
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos)
plt.savefig('test.pdf')
Run Code Online (Sandbox Code Playgroud)

PS:我想出了在networkx中实现expected_ Degree_graph的算法(不是模型,而是实现它的算法)。如果您有空闲时间,请阅读它。这很酷。