随机种子在提供时不起作用,并且某些函数不接受种子参数 [英] Random seed doesn't work when provided and some functions don't accept the seed parameter

查看:24
本文介绍了随机种子在提供时不起作用,并且某些函数不接受种子参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

然而,在这种情况下,l得到不同的结果:

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()))
L将这几行代码运行两次。结果l得到两种不同的图拓扑结构,不同的邻接矩阵和结点位置。 1)l如何使其工作?

其次:

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

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

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

谢谢

推荐答案

2)这些图表的生成没有任何随机性,所以就我所知接受种子没有任何意义。

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

简明答案:只需为两个库设置种子:

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

操作说明

不管怎样,这里有一个简单的示例,它显示了WATS-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不同,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包含对这两个随机库的一些说明。

这篇关于随机种子在提供时不起作用,并且某些函数不接受种子参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆