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个或更多独立连接的组件。
首先一个问题 - 您是否有理由不想要孤立的节点或多个连接的组件?原则上,真正的“随机”幂律图将具有这些。
所以一些评论:
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的算法(不是模型,而是实现它的算法)。如果您有空闲时间,请阅读它。这很酷。