numpy.random.seed(0) 有什么作用?

2025-02-20 09:23:00
admin
原创
29
摘要:问题描述:做什么np.random.seed?np.random.seed(0) 解决方案 1:np.random.seed(0)使随机数可预测>>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55, 0.72, 0.6 ...

问题描述:

做什么np.random.seed

np.random.seed(0)

解决方案 1:

np.random.seed(0)使随机数可预测

>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])

随着种子每次重置,每次都会出现同一组数字。

如果不重置随机种子,每次调用都会出现不同的数字:

>>> numpy.random.rand(4)
array([ 0.42,  0.65,  0.44,  0.89])
>>> numpy.random.rand(4)
array([ 0.96,  0.38,  0.79,  0.53])

(伪)随机数的工作原理是从一个数字(种子)开始,将其乘以一个大数,添加一个偏移量,然后对该和取模。然后将结果用作种子来生成下一个“随机”数。当您设置种子(每次)时,它每次都会做同样的事情,给您相同的数字。

如果您想要看似随机的数字,请不要设置种子。但是,如果您有使用随机数的代码并想对其进行调试,则在每次运行之前设置种子会非常有帮助,这样每次运行代码时都会执行相同的操作。

要获取每次运行的最多随机数,请调用numpy.random.seed()。 这将导致 numpy 将种子设置为从/dev/urandom或其 Windows 模拟中获得的随机数,或者,如果这两者都不可用,它将使用时钟。

有关使用种子生成伪随机数的更多信息,请参阅维基百科。

解决方案 2:

如果每次调用numpy的其他随机函数时都设置np.random.seed(a_fixed_number),结果将是相同的:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10) 
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]

但是,如果你只调用一次并使用各种随机函数,结果仍然会有所不同:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10)
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> print np.random.permutation(10) 
[3 5 1 2 9 8 0 6 7 4]
>>> print np.random.permutation(10) 
[2 3 8 4 5 1 0 6 9 7]
>>> print np.random.rand(4) 
[0.64817187 0.36824154 0.95715516 0.14035078]
>>> print np.random.rand(4) 
[0.87008726 0.47360805 0.80091075 0.52047748]

解决方案 3:

如上所述,numpy.random.seed(0) 将随机种子设置为 0,因此您从随机获得的伪随机数将从同一点开始。在某些情况下,这可能有利于调试。但是,经过一番阅读,如果您有线程,这似乎是错误的做法,因为它不是线程安全的。

来自numpy随机数和python随机数之间的差异:

对于 numpy.random.seed(),主要的困难在于它不是线程安全的 - 也就是说,如果您有许多不同的执行线程,则使用它并不安全,因为如果两个不同的线程同时执行该函数,则不能保证它能正常工作。如果您不使用线程,并且如果您有理由预期将来不需要以这种方式重写程序,numpy.random.seed() 应该可以用于测试目的。如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照建议进行操作并创建 numpy.random.Random 类的本地实例要安全得多。据我所知,random.random.seed() 是线程安全的(或者至少,我没有发现任何相反的证据)。

如何进行此操作的示例:

from numpy.random import RandomState
prng = RandomState()
print prng.permutation(10)
prng = RandomState()
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)

可能会给出:

[3 0 4 6 8 2 1 9 7 5]

[1 6 9 0 2 7 8 3 5 4]

[8 1 5 0 7 2 9 4 3 6]

[8 1 5 0 7 2 9 4 3 6]

最后,请注意,由于异或的工作方式,在某些情况下,初始化为 0(而不是所有位都为 0 的种子)可能会导致前几次迭代的分布不均匀,但这取决于算法,超出了我目前的担忧和这个问题的范围。

解决方案 4:

我在神经网络中经常使用这种方法。众所周知,当我们开始训练神经网络时,我们会随机初始化权重。模型在特定数据集上根据这些权重进行训练。经过若干个时期后,您将获得一组训练好的权重。

现在假设您想再次从头开始训练,或者您想将模型传递给其他人以重现您的结果,权重将再次初始化为随机数,这些随机数大多与之前的随机数不同。经过相同数量的迭代(保留相同的数据和其他参数)后获得的训练权重与之前的权重将有所不同。问题是您的模型不再具有可重现性,即每次您从头开始训练模型时,它都会为您提供不同的权重集。这是因为每次都由不同的随机数初始化模型。

如果每次从头开始训练时,模型都初始化为同一组随机初始化权重,会怎么样?在这种情况下,您的模型可以变得可重复。这是通过 numpy.random.seed(0) 实现的。通过将 seed() 指定为特定数字,您将始终使用同一组随机数。

解决方案 5:

我希望能给出一个非常简短的答案:

seed使(下一个系列)随机数可预测。你可以想象每次调用后seed,它都会预先定义系列数字,并且 numpy random 会保留它的迭代器,然后每次你得到一个随机数时它都会调用 get next。

例如:

np.random.seed(2)
np.random.randn(2) # array([-0.41675785, -0.05626683])
np.random.randn(1) # array([-1.24528809])

np.random.seed(2)
np.random.randn(1) # array([-0.41675785])
np.random.randn(2) # array([-0.05626683, -1.24528809])

您会注意到,当我设置相同的种子时,无论您每次从 numpy 请求多少个随机数,它总是给出相同的一系列数字,在本例中为array([-0.41675785, -0.05626683, -1.24528809])

解决方案 6:

以上所有答案都显示了代码中的实现np.random.seed()。我会尽力简要解释为什么会发生这种情况。计算机是基于预定义算法设计的机器。计算机的任何输出都是对输入实施算法的结果。因此,当我们要求计算机生成随机数时,它们当然是随机的,但计算机并不是随机产生的!

因此,当我们编写np.random.seed(any_number_here)算法时,它将输出一组特定于参数的数字any_number_here。这几乎就像我们传递正确的参数就可以获得一组特定的随机数。但这需要我们知道算法的工作原理,这相当繁琐。

因此,例如如果我写下np.random.seed(10)我获得的特定数字集,即使我在 10 年后执行同一行,它仍将保持不变,除非算法发生改变。

解决方案 7:

想象一下,您正在向某人展示如何使用一堆“随机”数字来编码。通过使用 numpy 种子,他们可以使用相同的种子号并获得相同的一组“随机”数字。

因此,它并不完全是随机的,因为算法会吐出数字,但它看起来像是随机生成的一堆。

解决方案 8:

随机种子指定计算机生成随机数序列的起点。

例如,假设您想在 Excel 中生成一个随机数(注意:Excel 将种子限制为 9999)。如果您在此过程中在“随机种子”框中输入一个数字,您将能够再次使用同一组随机数。如果您在框中输入“77”,并在下次运行随机数生成器时输入“77”,Excel 将显示同一组随机数。如果您输入“99”,您将得到一组完全不同的数字。但是,如果您将种子恢复为 77,那么您将获得与开始时相同的一组随机数。

例如,“取一个数字 x,加上 900 + x,然后减去 52”。为了启动该过程,您必须指定一个起始数字 x(种子)。我们取起始数字 77:

加 900 + 77 = 977 减 52 = 925 按照同样的算法,第二个“随机”数将是:

900 + 925 = 1825 减去 52 = 1773 这个简单的例子遵循一种模式,但计算机数字生成背后的算法要复杂得多

解决方案 9:

Numpy 文档中有一个很好的解释:
https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html
它指的是Mersenne Twister 伪随机数生成器。有关该算法的更多详细信息,请访问:https://en.wikipedia.org/wiki/Mersenne_Twister

解决方案 10:

numpy.random.seed(0)
numpy.random.randint(10, size=5)

这会产生以下输出:
array([5, 0, 3, 3, 7])
同样,如果我们运行相同的代码,我们将得到相同的结果。

现在,如果我们将种子值 0 更改为 1 或其他值:

numpy.random.seed(1)
numpy.random.randint(10, size=5)

这会产生以下输出:array([5 8 9 5 0])但是现在的输出与上面的输出不一样。

解决方案 11:

它使随机数可预测。所有随机数都以相同的组合开始,并且此后的每次迭代都将相同。示例:

Output A: 0, 1, 2
Output B: 1, 3, 5
Output C: 2, 4, 6
Reset seed to 0
Output A: 0, 1, 2
Output B: 1, 3, 5
Output C: 2, 4, 6
Reset seed to 0
Output A: 0, 1, 2
Reset seed to 0
Output A: 0, 1, 2
.
.
.

我希望这有帮助!

解决方案 12:

设置特定种子值后生成的所有随机数在所有平台/系统上都是相同的。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用