Networkx - 从网络中获取概率 p(k)

Networkx - Get probability p(k) from network

我绘制了 network(数据框)的直方图,其中包含 'k' 个节点连接数,如下所示:

import seaborn as sns

parameter ='k'
sns.histplot(network[parameter])

但现在我需要使用上述组分布创建一个模块化随机图:

from networkx.generators.community import random_partition_graph

random_partition_graph(sizes, p_in, p_out, seed=None, directed=False)

而且,我需要这个值 p(k) 而不是计数,它必须作为 p_in.

传递
p_in (float)
probability of edges with in groups

如何从我的 network 中获取 p(k)

这就是我处理您所描述的情况的方式。首先,您可以规范化直方图,使直方图的积分等于 1。这可以通过适当设置直方图的 weights 参数来实现。然后可以将此直方图视为学位的概率分布。现在您有了这个概率分布,即概率列表(代码中的 deg_prob),您可以使用 np.random.choice(np.arange(np.amin(degrees),np.amax(degrees)+1), p=deg_prob, size=N_sampling) 从中随机抽样。从这个随机抽样中,您可以通过在 w 参数中传递样本来创建随机 expected_degree_graph。 然后,您可以将原始图的度分布与随机图中的度分布进行比较。

请参阅下面的代码和更多详细信息:

import networkx as nx
from networkx.generators.random_graphs import binomial_graph
from networkx.generators.degree_seq import expected_degree_graph
import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()

N_nodes=1000
G=binomial_graph(n=N_nodes, p=0.01, seed=0) #Creating a random graph as data
degrees = np.array([G.degree(n) for n in G.nodes()])#Computing degrees of nodes
bins_val=np.arange(np.amin(degrees),np.amax(degrees)+2) #Bins

deg_prob,_,_=plt.hist(degrees,bins=bins_val,align='left',weights=np.ones_like(degrees)/N_nodes,
                      color='tab:orange',alpha=0.3,label='Original distribution')#Histogram

#Sampling from distribution
N_sampling=500
random_sampling=np.random.choice(np.arange(np.amin(degrees),np.amax(degrees)+1), p=deg_prob, size=N_sampling)

#Creating random graph from samples
G_random_sampling=expected_degree_graph(random_sampling,seed=0,selfloops=False)
degrees_random_sampling = np.array([G_random_sampling.degree(n) for n in G_random_sampling.nodes()])

deg_prob_random_sampling,_,_=plt.hist(degrees_random_sampling,bins=bins_val,align='left',
                                      weights=np.ones_like(degrees_random_sampling)/N_sampling,color='tab:blue',label='Sample distribution',alpha=0.3)

#Plotting both histograms
plt.xticks(bins_val)
plt.xlabel('degree')
plt.ylabel('Prob')
plt.legend()
plt.show()

然后输出给出: