比较使用随机数生成的 Matlab 和 Numpy 代码

Posted

技术标签:

【中文标题】比较使用随机数生成的 Matlab 和 Numpy 代码【英文标题】:Comparing Matlab and Numpy code that uses random number generation 【发布时间】:2013-08-31 10:17:17 【问题描述】:

在给定相同种子的情况下,有什么方法可以让 numpy 中的随机数生成器生成与 Matlab 中相同的随机数?

我在 Matlab 中尝试了以下操作:

>> rng(1);
>> randn(2, 2)

ans =

    0.9794   -0.5484
   -0.2656   -0.0963

在带有 Numpy 的 iPython 中还有以下内容:

In [21]: import numpy as np
In [22]: np.random.seed(1)
In [23]: np.random.randn(2, 2)
Out[23]: 
array([[ 1.624, -0.612],
       [-0.528, -1.073]])

两个数组中的值不同。

或者有人可以建议一个好主意,比较使用随机数生成的 Matlab 和 Python 中相同算法的两个实现。

谢谢!

【问题讨论】:

您可以尝试使用 MATLAB 的 twister 而不是默认生成器,并使用 python 的内置 random.random()。但是,我怀疑您能否重现完全相同的结果。我会说你不应该依赖相同的随机数。对于一个好的随机算法,唯一重要的是这些数字是否足够随机,我假设 MATLAB 和 numpy 实现都足够好。如果您只是想创建随机输入进行测试,那么只需将它们保存到文件中并在 MATLAB 和 python 中加载文件。 【参考方案1】:

只是想进一步澄清使用捻线器/播种方法: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]])

【讨论】:

这真的很有帮助!【参考方案2】:

正如 Bakuriu 建议的那样,它可以使用 MATLABs twister:

MATLAB:

>> rand('twister', 1337)
>> rand()

ans =

    0.2620

Python (Numpy):

>>> import numpy as np
>>> np.random.seed(1337)
>>> np.random.random()
0.2620246750155817

【讨论】:

这适用于 random.random() 但如果您想比较 MATLAB randperm(10)numpy.random.permutation(10) 则不适用。他们给出不同的结果......【参考方案3】:

    确保向您的进程提供相同数字的一种方法是用两种语言中的一种生成它们,保存它们并导入另一种语言。这相当容易,您可以将它们写在一个简单的文本文件中。

    如果这是不可能或不可取的,您还可以通过自己生成伪随机数来确保数字相同。这是一个网站,展示了一个易于实现的算法的非常简单的示例:Build your own simple random numbers

    如果你自制的随机生成器质量不够,你可以用一种语言构建一个随机生成函数,从另一种语言调用。最简单的方法可能是从python调用matlab。

    如果您感到幸运,请尝试使用这些设置。例如尝试使用(过时的)seed 输入到 matlabs 随机函数。或者尝试使用不同类型的生成器。我相信这两种语言的默认值都是 mersenne twister,但如果这个实现不一样,也许更简单的一个。

【讨论】:

【参考方案4】:

如何运行一个 matlab 脚本以从您的 python 代码中获取基于种子的随机数?

【讨论】:

以上是关于比较使用随机数生成的 Matlab 和 Numpy 代码的主要内容,如果未能解决你的问题,请参考以下文章

numpy的简单使用

如何生成随机可逆对称正半定矩阵?

numpy和matploptlib

numpy 随机产生数字

Numpy and Matplotlib

机器学习算法中随机数的生成