【问题标题】:Is it possible to reproduce randn() of MATLAB with NumPy?是否可以使用 NumPy 重现 MATLAB 的 randn()?
【发布时间】:2011-04-12 22:28:32
【问题描述】:

我想知道是否可以用 NumPy 精确地重现 MATLAB 的randn() 的整个序列。我用 Python/Numpy 编写了自己的例程,它给我的结果与其他人所做的 MATLAB 代码略有不同,而且由于随机抽取的不同,我很难找出它的来源。

我发现numpy.random.seed 值在第一次抽奖时产生相同的数字,但从第二次抽奖开始,它就完全不同了。我正在制作大约 20,000 次的多元法线绘图,所以我不想只保存 matlab 绘图并在 Python 中读取它。

【问题讨论】:

  • numpy.random.randn(...) 有什么问题?它应该完全满足您的需要,除非您担心使用给定的种子生成完全相同的数字序列......(没关系,显然这就是你想要做的,现在我重新阅读了这个问题。出于模糊的好奇心,为什么你需要完全相同的顺序?)
  • 你是什么意思“MATLAB代码别人做了”? randn 是一个标准的 MATLAB 函数。我真诚地希望您不要使用 FEX 垃圾堆中的某些“自定义”功能。
  • 没什么问题,我需要用给定的种子生成完全相同的数字序列。正如我所说,我使用 NumPy 的例程给了我与 MATLAB 代码不同的结果,我无法调试它,因为随机数不同。我无法确定哪里出了问题。
  • @Nict T 当然不是。我正在运行一些贝叶斯模型,我的代码给出了与 MATLAB 代码不同的估计值。我很确定 MATLAB 代码是正确的,所以我正在尝试调试我的代码,但由于不同的随机抽取,我无法确定计算的不同之处。
  • 仍然没有回答您的问题,但保存/加载并不是那么不好。 SciPy 有一个 MATLAB .mat 文件翻译器,因此您可以将您的 MATLAB 工作区转储到一个文件中,并使用 SciPy.io.mio scipy.org/doc/api_docs/SciPy.io.mio.html 轻松导入

标签: python matlab numpy scipy


【解决方案1】:

用户询问是否可以重现 Matlab 的 randn() 的输出,而不是 rand。我无法设置算法或种子来重现 randn() 的确切数字,但下面的解决方案对我有用。

在 Matlab 中:生成正态分布的随机数如下:

rng(1);
norminv(rand(1,5),0,1)
ans = 
   -0.2095    0.5838   -3.6849   -0.5177   -1.0504

在 Python 中:按如下方式生成正态分布的随机数:

import numpy as np
from scipy.stats import norm
np.random.seed(1)
norm.ppf(np.random.rand(1,5))
array([[-0.2095,  0.5838, -3.6849, -0.5177,-1.0504]])

当从 Matlab 迁移到 Python 或反之亦然时,拥有可以重现相等随机数的函数非常方便。

【讨论】:

    【解决方案2】:

    只是想进一步澄清使用捻线器/播种方法:MATLAB 和 numpy 使用这种播种生成相同的序列,但会以不同的方式将它们填充到矩阵中。

    MATLAB向下列填充矩阵,而python向下行。因此,为了在两者中获得相同的矩阵,您必须转置:

    MATLAB:

    rand('twister', 1337);
    A = rand(3,5)
    A = 
     Columns 1 through 2
       0.262024675015582   0.459316887214567
       0.158683972154466   0.321000540520167
       0.278126519494360   0.518392820597537
      Columns 3 through 4
       0.261942925565145   0.115274226683149
       0.976085284877434   0.386275068634359
       0.732814552690482   0.628501179539712
      Column 5
       0.125057926335599
       0.983548605143641
       0.443224868645128
    

    蟒蛇:

    import numpy as np
    np.random.seed(1337)
    A = np.random.random((5,3))
    A.T
    array([[ 0.26202468,  0.45931689,  0.26194293,  0.11527423,  0.12505793],
           [ 0.15868397,  0.32100054,  0.97608528,  0.38627507,  0.98354861],
           [ 0.27812652,  0.51839282,  0.73281455,  0.62850118,  0.44322487]])
    

    注意:我也将这个答案放在了类似的问题上:Comparing Matlab and Numpy code that uses random number generation

    【讨论】:

      【解决方案3】:

      如果您将随机数生成器设置为相同的种子,理论上它将创建相同的数字,即在 matlab 中。我不太确定如何最好地做到这一点,但这似乎可行,在 matlab 中这样做:

      rand('twister', 5489)
      

      在numy中对应:

      np.random.seed(5489)
      

      (重新)初始化您的随机数生成器。这为我提供了 rand() 和 np.random.random() 相同的数字,但不是 randn,我不确定是否有一个简单的方法。

      使用较新的 matlab 版本,您可能可以设置具有与 numpy 相同属性的 RandStream,对于旧版本,您可以在 matlab 中重现 numpy 的 randn(反之亦然)。 Numpy 使用极坐标形式从 np.random.random() 创建统一数字(此处给出的第二种算法:http://www.taygeta.com/random/gaussian.html)。您可以在 matlab 中编写该算法来创建与 numpy 在 matlab 中的 rand 函数中创建的相同的 randn 数。

      如果您不需要大量随机数,只需将它们保存在 .mat 中并从 scipy.io 读取它们...

      【讨论】:

      • 非常感谢您的回答。我一定会尝试的。
      猜你喜欢
      • 2015-12-08
      • 1970-01-01
      • 2022-01-04
      • 2020-05-26
      • 2012-07-14
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多