【问题标题】:Random seed doesn't work when provided and some functions don't accept the seed parameter随机种子在提供时不起作用,并且某些函数不接受种子参数
【发布时间】:2018-08-31 17:26:41
【问题描述】:

我想模拟和重现我的结果。因此,我发现使用随机种子数来重新生成相同的图很有用。

但是在这种情况下,我会得到不同的结果:

seed=1725
my_random = np.random.RandomState(seed)
G = nx.watts_strogatz_graph(30, 3, 0,seed=my_random )
node_positions = nx.spring_layout(G, scale=len(G.nodes()))

我运行这行两次。结果我得到了两个不同的图拓扑,不同的邻接矩阵和节点位置。 1) 我怎样才能让它工作?

其次:

以下图表类不接受种子参数

G=nx.wheel_graph(n)
G=nx.complete_graph(n)
G = nx.balanced_tree(n,tree_depth)
G= nx.star_graph(n) 

2) 如何让这些图类考虑种子参数

谢谢

【问题讨论】:

    标签: python-3.x networkx random-seed


    【解决方案1】:

    2) 这些图的生成没有任何随机方面,因此据我所知,接受种子没有任何意义。

    1) 更棘手。似乎networkx 使用randomnumpy.random 库的组合来生成随机数。图形生成器,例如watts_strogatz_graph 使用前者,而 layout 使用后者。

    简短回答:只需为两个库设置种子:

    import random
    import numpy as np
    seed = 123
    random.seed(seed)
    np.random.seed(seed)
    

    解释发生了什么

    无论如何,这里有一个简单的例子,表明种子被考虑到像watts-strogatz 生成器这样的图(但你必须有p>0 否则没有重新布线,因此没有随机组件!)。 G2 和 G3 的边缘不同,因为它们使用了不同的种子,但 G1 和 G2 是相同的。

    import networkx as nx
    
    seed = 123
    G1 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed)
    G2 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed)
    G3 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed+1)
    
    G1.edge == G2.edge
    >>> True
    G3.edge == G2.edge
    >>> False
    

    为确保每次布局都相同,您可以调用np.random.seed(myseed)。这与使用 np.random.RandomState 不同,后者正在创建随机数流的新实例,并且不会被 nx 布局函数使用。 (尽管在您自己的随机流中它是good practice to use an independent stream)。

    import numpy as np
    np.random.seed(seed)
    pos1 = nx.spring_layout(G1, scale=len(G.nodes()))
    pos1b = nx.spring_layout(G1, scale=len(G.nodes())) 
    # should differ! same graph, but the rng has been called
    np.random.seed(seed) #reset seed
    pos2 = nx.spring_layout(G2, scale=len(G.nodes())) 
    # should be same as p1! G1==G2 (from above), and seed for layout
    # is the same.
    
    diffs = 0
    for node in pos1:
        if np.all(pos1[node] != pos1b[node]):
           diffs += 1
    
    print diffs
    >>> 30
    
    diffs2 = 0
    for node in pos1:
        if np.all(pos1[node] != pos2[node]):
           diffs2 += 1
    
    print diffs2
    >>> 0
    

    这个问题/答案Differences between numpy.random and random.random in Python 有两个随机库的一些描述。

    【讨论】:

    • 感谢您的回答。所以在 2) 中没有办法重现图表?
    • 不,相反:对于相同的输入(例如节点数),您将总是得到相同的图表!深度为 5 且分支为 2 的平衡树将始终具有 64-1 个具有相同组织的节点;完全图在每对节点之间都有边。它们是确定性图。
    • 我的意思是让它们处于相同的位置。例如,如果我生成两棵深度为 5 且分支为 2 的平衡树,我是否总是在同一位置获得相同的节点?
    • 布局和生成是独立的,因此为确定性图重复布局需要与随机图相同的方法:设置 numpy 种子,如图所示。如果不控制种子,每次都会得到不同的布局(至少对于 spring_layout 和 random_layout)。
    • 另见:stackoverflow.com/a/11484144,它使用外部库来处理布局。在这种形式的图表中,它可以更加一致。 (尽管您必须阅读 graphviz 文档以确保随机化)
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2021-03-23
    相关资源
    最近更新 更多