我想知道是否可以用NumPy精确地再现MATLAB的randn()的整个序列。我使用Python / Numpy编写了自己的例程,并且它给了我一些与其他人所做的MATLAB代码不同的结果,并且由于不同的随机抽取,我很难找到它的来源。
我找到了numpy random.seed值,它为第一次绘制产生相同的数字,但是从第二次绘制开始,它完全不同。我正在绘制多变量法则达20,000次,所以我不想只保存matlab绘制并用Python读取它。如果有任何其他方式,我想我必须这样做。请告诉我。
-Joon
答案 0 :(得分:5)
如果将随机数生成器设置为相同的种子,理论上它将创建相同的数字,即在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中编写该算法,以便在matlab中使用rand函数创建与numpy相同的randn数。
如果你不需要大量的随机数,只需将它们保存在.mat中,然后从scipy.io中读取它们......
答案 1 :(得分:3)
用户询问是否可以重现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 :(得分:2)
只是想进一步澄清使用twister / seeding方法: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