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

2024-05-14 19:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一对无标度网络,它们具有:

  • 指数相同的幂律下的度分布
  • 相同数量的节点。

我需要建立至少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()

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

我可以丢弃孤立的节点,但这样我的最终网络将拥有比我预期的更少的节点,并且它可能不是一个单一的网络。它可以是两个或多个独立的连接组件。


Tags: import网络networkx节点asplt指数graph
2条回答

当我遇到一个与你类似的问题时,我很胆小,只使用BA生成器,添加不同数量的新节点链接,例如1,…,5。这保证了一个单一的连接组件和没有平行边。

由于需要固定幂律指数,我建议如下:通常,在级联故障中,研究两种不同类型的拓扑。如果是这种情况,请从最大的连接组件(LCC)生成一个“无标度”网络,如我的ipython notebook

import networkx as nx
from networkx.utils import (powerlaw_sequence, create_degree_sequence)
sequence = create_degree_sequence(num, powerlaw_sequence, exponent=exp)
graph = nx.configuration_model(sequence, seed=seed)
loops = graph.selfloop_edges()
# remove parallel edges and self-loops
graph = nx.Graph(graph)
graph.remove_edges_from(loops)
# get largest connected component
# unfortunately, the iterator over the components is not guaranteed to be sorted by size
components = sorted(nx.connected_components(graph), key=len, reverse=True)
lcc = graph.subgraph(components[0])

在一定的边缘概率以上,LCC中的节点数更加可靠,因此以生成ER图的节点数作为连接拓扑。

正如您在链接度分布中看到的,LCC的拓扑结构仍然是我认为的“无标度”。当你考虑几千个节点的网络时,只要你的两个连接的网络有相同的节点数,你的60个网络没有完全相同的节点数应该不是问题。

如果你想连接两个“无标度”网络,除了从两个lcc中较大的一个中删除随机节点外,我看不到其他方法,除非你得到相同的数目。

告诉我们你是怎么解决的。

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

所以有几点意见:

1)如果使用预期的_度图,将很难消除孤立节点。这是因为有许多节点的期望度约为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')

PS:我提出了在networkx中实现期望度图的算法(不是模型,而是实现它的算法)。如果你有空的话,读一遍。很酷。

相关问题 更多 >

    热门问题