随机种子在提供时不起作用,并且某些函数不接受种子参数 [英] Random seed doesn't work when provided and some functions don't accept the seed parameter
本文介绍了随机种子在提供时不起作用,并且某些函数不接受种子参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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使用random
和numpy.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屋!
查看全文