我想模拟并重现我的结果。因此,我发现使用随机种子数很有用,可以重新生成相同的图形。
然而,在这种情况下,我会得到不同的结果:
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)如何使这些图类考虑种子参数
谢谢
答案 0 :(得分: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)
有关正在进行的操作的说明
无论如何,这是一个简单的例子,显示种子被考虑用于像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对两个随机库有一些描述。