【问题标题】:Networkx maximal_independent_set reproducibilityNetworkx 最大独立集重现性
【发布时间】:2021-03-13 07:42:17
【问题描述】:

如何在 Jupyter Notebook (Python3) 中获得可重现的结果?

为主要的随机生成器定义一个种子似乎是不够的,见下面的 MWE:

import numpy as np
import random
import os 

random.seed(0)
np.random.seed(0)
os.environ['PYTHONHASHSEED']=str(0)
import networkx
from networkx.algorithms.mis import maximal_independent_set

G = networkx.Graph()
G.add_edges_from([ ('A', 'B'), ('B', 'C'), ('C', 'D'), ('D','E'), ('E','F'), ('A','E'), ('B','E') ])

for i in range(0,10):
   print( maximal_independent_set(G, seed=0) )

在循环中的每次运行中给出相同的结果。

但是,当重新启动内核并再次运行单元时,结果会更改为另一个子集。

【问题讨论】:

  • 嗨-什么版本的python和什么版本的networkx
  • python 3.5.3 + networkx 2.4
  • 结果可在同一笔记本运行中重现。但是,当我重新启动内核时,第二次运行会发生变化(请参阅更新的问题)

标签: numpy networkx reproducible-research


【解决方案1】:

您的问题的简短回答是:在当前的实现中,它是不可重现的 - 如果考虑到内核的重新启动。

长答案

您需要使用OrderedGraph 并使用OrderedSet(请参阅Does Python have an ordered set?)重新实现函数maximal_independent_set,以确保您正在寻找的可重复性。作为 OrderedSets 的替代方法,您可以通过排序确保从集合到列表的强制转换顺序,请参阅here

调试 - 基于implementation

问题的原因是什么。首先观察,它不是随机生成器。那是正确实例化的,并且在多次运行中具有相同的状态(在开始和结束后 - 检查seed.getstate()maximal_independent_set 中的有问题的调用都是set 操作。对于您的 mwe,例如:

neighbors = set.union(*[set(G.adj[v]) for v in nodes])
# next line added for simple debugging:
print(nodes, neighbors, G.adj["D"])
# Output 1: ['D', 'A', 'F']
# {'D'} {'E', 'C'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])
# ['D', 'F', 'B']
# {'D'} {'C', 'E'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])

如您所见,多次运行会产生不同的集合(就顺序而言)。其他种子也是如此,尤其是available_nodes。因此,通过固定随机数生成器来固定选定的列表 id 并不能确保可重复性,因为列表中元素的排序可能不同。

【讨论】:

  • 谢谢 Sparky05。实际上,通过在源代码中从集合转换为列表时保留顺序,可以实现可重复性。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2021-01-23
  • 2019-05-23
  • 1970-01-01
  • 2015-08-31
  • 2013-01-23
  • 2012-09-27
  • 2013-02-24
相关资源
最近更新 更多