使用 numpy.random.seed 在潜在狄利克雷分配中的可重复性
Posted
技术标签:
【中文标题】使用 numpy.random.seed 在潜在狄利克雷分配中的可重复性【英文标题】:Reproducibility in Latent Dirichlet Allocation using numpy.random.seed 【发布时间】:2021-07-03 13:01:29 【问题描述】:我正在使用 LDA 为大型软件项目执行主题建模。首次初始化应用程序时,我们会运行多个测试以确保一切正常。其中一项测试涉及将 LDA 的输出与玩具数据集与 LDA 的已知结果与同一数据集进行对比。问题在于 LDA 本质上是随机的,如果我只是针对数据集运行 LDA,存储结果,然后将这些结果与稍后针对数据集运行的 LDA 进行比较,结果将大不相同。
所以,在初始阶段和测试阶段运行 LDA 之前,我尝试使用 np.random.seed(111)
。这给了我完全一致的结果,这意味着我可以检查结果是否严格相等(这使得事情更加更容易)。也就是说,我注意到这不是最佳实践,因为它会影响全局随机数生成器,这会影响应用程序中的各种其他结果。我想做的是在测试期间设置种子,然后在测试完成后重置。在这一点上,我宁愿不必传递rng = np.random.default_rng(111)
对象,因为所有导航都是通过路由进行的,这可能是一个超级痛苦的事情。
我正在寻找有关如何最好地完成我想要的工作的建议。就像我说的,我认为最简单的方法是 np.random.seed(111)
,然后是 np.random.reset_seed
(虽然这不是一个实际的功能,只是我所希望的)。
【问题讨论】:
安排代码以便您可以传入 RNG 通常是推荐的方式。不确定您所说的“导航正在通过路线进行”是什么意思,也许您可以澄清一下? 【参考方案1】:此时我的解决方案是在进行任何测试之前保存随机状态,然后在测试后恢复随机状态。
state_0 = np.random.get_state()
np.random.seed(111)
# DO SOME STUFF #
np.random.set_state(state_0)
我不知道这是否是最好的方法,但到目前为止它似乎正在工作......
【讨论】:
以上是关于使用 numpy.random.seed 在潜在狄利克雷分配中的可重复性的主要内容,如果未能解决你的问题,请参考以下文章