【问题标题】:How does random graph generator work in networkx?随机图生成器如何在 networkx 中工作?
【发布时间】:2011-09-22 20:34:09
【问题描述】:

我使用source code of 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)的概率分布)进行比较的?对我来说,它看起来像是生成一个随机数 btw (0,1)。但是应该如何使用 p 的域并将随机数与 p(k) 进行比较?

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    除非节点/边的数量很大,否则这会给出伯努利分布。您可以让 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
    

    【讨论】:

    • 这不会满足您的要求。期望度图是一个图,它的节点被分配一个期望度,然后边被随机放置,使得分配的值是期望度。要查看这一点,请将所有节点设置为具有相同的预期度数,您将得到一个 Erdos-Renyi 图(具有近似泊松度分布)。
    • 你应该改用nx.configuration_model(z),如果度数之和不等于偶数,它可能会拒绝运行,并且可能会产生自循环和重复边。
    【解决方案2】:

    这是可行的,因为以这种方式(使用 Brenoulli 采样)生成图将产生具有泊松度分布的图(详细解释 here (pdf))。

    【讨论】:

    • 我解释得不好。 p(泊松分布),我手动添加的,在原始代码中没有提到p(k)和k,这让我很困惑:(
    猜你喜欢
    • 2010-12-15
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多