networkx中的随机图生成器是如何工作的?
我使用了Networkx的源代码来生成一个具有泊松度分布的随机图。
我对代码做了一些修改,具体如下:
import random
import networkx
import math
from networkx.generators.classic import empty_graph
def gnp_random_graph(n, p, seed=None):
"""Return a random graph G_{n,p}.
Parameters
----------
n : int
The number of nodes.
p : float
Probability for edge creation.
possible edges: n[n-1]/2
seed : int, optional
Seed for random number generator (default=None).
"""
#My sample
z = 4 #mean degree
n = 10 #Number of nodes
p = math.exp**(-z)*z**(k)/(math.factorial(k)) ##I add this myself #k is missing
#This part is from the source
G=empty_graph(n)
if not seed is None:
random.seed(seed)
for u in xrange(n):
for v in xrange(u+1,n):
if random.random() < p:
G.add_edge(u,v)
return G
在生成边的最后部分,我不太明白它是如何计算度数并与p(度数的概率分布k)进行比较的?对我来说,它看起来像是生成了一个在0到1之间的随机数。但是,应该如何使用p的范围,并将这个随机数与p(k)进行比较呢?
2 个回答
1
这样做是有效的,因为通过这种方式生成图(使用伯努利抽样),会得到一个具有泊松度分布的图(详细解释可以在这里(pdf)找到)。
3
除非节点或边的数量很大,否则这会产生一个伯努利分布。你可以很简单地让networkx给你一个泊松度分布。
import numpy as np
from scipy.stats import poisson
def poissongraph(n,mu):
z= np.zeros(n) #n is number of nodes
for i in range(n):
z[i]=poisson.rvs(mu) #mu is the expected value
G=expected_degree_graph(z)
return G