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()
然后输出给出:
我绘制了 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()
然后输出给出: