NetworkX:如何从一组预定位置构建 Erdos-Renyi 图?
NetworkX: how to build an Erdos-Renyi graph from a set of predetermined positions?
我需要建立类似 Erdos-Renyi 模型的东西(随机图):
我需要根据 deterministic 函数生成的节点位置字典来创建它。这意味着我不能允许 Python 随机决定每个节点去哪里,因为我想决定它。函数是:
pos = dict( (n, n) for n in G.nodes() )
.
我想先创建一个 邻接矩阵 ,以便随机生成类似于 (start, endpoint) 对的东西每条边,像这样:
G=np.random.randint(0, 1, 25).reshape(5, 5)
然后我想以某种方式将矩阵变成我的边列表,如下所示:
G1=nx.grid_2d_graph(G)
但当然它不起作用,因为这个函数需要 2 个参数,而我只给它 1 个。
我的问题:
- 如何在
NetworkX
中创建这种图形?
- 如何确保所有节点都已连接?
- 如何确保在分配矩阵中的
1
后,每对节点都有相同的 概率 着陆 1
?
点 3 的示例。 假设我们创建了规则的点网格,其位置根据 pos
确定。当我们开始连接网络并且我们 select 第一个节点时,我们要确保第一个边的 端点 是剩下的 N-1
个节点之一在网络中(起始节点本身除外)。无论如何,我们要确保所有 N-1
个节点都具有 相同的概率 连接到我们首先分析的节点。
非常感谢!
我将尝试在之前关于此问题的问题的基础上保持一致。鉴于您将 grid_2d_graph 的键设为 'n' 而不是 (i,j) 以及重新标记节点函数:
N = 10
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
现在您可以将 pos 字典设置为从 'n' 键控节点映射到您已经拥有的位置,方法是通过将键与值切换。然后只需调用 Erdos-Renyi 函数来创建具有概率 'p' 任意两个节点之间存在边(自边除外)的图,如您在 点 3[=24 中所述=].然后用pos字典画图。
pos = {y:x for x,y in labels.iteritems()}
G2 = nx.erdos_renyi_graph(100,0.1)
nx.draw_networkx(G2, pos=pos, with_labels=True, node_size = 300)
print G.nodes()
plt.axis('off')
plt.show()
关于保证图在点2是连通的你不能保证图以1的概率连通,但是你可以读一下关于图的大小Erdos-Renyi 图中的 Giant 组件。但是为了避免陷入理论细节,几乎可以肯定的是,当 lambda 即 n*p(此处为 100*0.1)大于 4 时,图形将被连接。尽管对于较小的图形(如 100 个节点),您最好增加拉姆达。根据我自己使用 n= 100 和 p = 0.1 的经验,仅在大约 0.2% 的时间内生成了一个非连接图,并且是在进行了数千次模拟之后。无论如何,您始终可以确保生成的图形是否与 is_connected 方法连接。
我需要建立类似 Erdos-Renyi 模型的东西(随机图):
我需要根据 deterministic 函数生成的节点位置字典来创建它。这意味着我不能允许 Python 随机决定每个节点去哪里,因为我想决定它。函数是:
pos = dict( (n, n) for n in G.nodes() )
.
我想先创建一个 邻接矩阵 ,以便随机生成类似于 (start, endpoint) 对的东西每条边,像这样:
G=np.random.randint(0, 1, 25).reshape(5, 5)
然后我想以某种方式将矩阵变成我的边列表,如下所示:
G1=nx.grid_2d_graph(G)
但当然它不起作用,因为这个函数需要 2 个参数,而我只给它 1 个。
我的问题:
- 如何在
NetworkX
中创建这种图形? - 如何确保所有节点都已连接?
- 如何确保在分配矩阵中的
1
后,每对节点都有相同的 概率 着陆1
?
点 3 的示例。 假设我们创建了规则的点网格,其位置根据 pos
确定。当我们开始连接网络并且我们 select 第一个节点时,我们要确保第一个边的 端点 是剩下的 N-1
个节点之一在网络中(起始节点本身除外)。无论如何,我们要确保所有 N-1
个节点都具有 相同的概率 连接到我们首先分析的节点。
非常感谢!
我将尝试在之前关于此问题的问题的基础上保持一致。鉴于您将 grid_2d_graph 的键设为 'n' 而不是 (i,j) 以及重新标记节点函数:
N = 10
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
现在您可以将 pos 字典设置为从 'n' 键控节点映射到您已经拥有的位置,方法是通过将键与值切换。然后只需调用 Erdos-Renyi 函数来创建具有概率 'p' 任意两个节点之间存在边(自边除外)的图,如您在 点 3[=24 中所述=].然后用pos字典画图。
pos = {y:x for x,y in labels.iteritems()}
G2 = nx.erdos_renyi_graph(100,0.1)
nx.draw_networkx(G2, pos=pos, with_labels=True, node_size = 300)
print G.nodes()
plt.axis('off')
plt.show()
关于保证图在点2是连通的你不能保证图以1的概率连通,但是你可以读一下关于图的大小Erdos-Renyi 图中的 Giant 组件。但是为了避免陷入理论细节,几乎可以肯定的是,当 lambda 即 n*p(此处为 100*0.1)大于 4 时,图形将被连接。尽管对于较小的图形(如 100 个节点),您最好增加拉姆达。根据我自己使用 n= 100 和 p = 0.1 的经验,仅在大约 0.2% 的时间内生成了一个非连接图,并且是在进行了数千次模拟之后。无论如何,您始终可以确保生成的图形是否与 is_connected 方法连接。