簡體   English   中英

是否可以使用 NumPy 重現 MATLAB 的 randn()?

[英]Is it possible to reproduce randn() of MATLAB with NumPy?

我想知道是否有可能用 NumPy 精確地重現 MATLAB 的randn()的整個序列。 我用 Python/Numpy 編寫了自己的例程,它給我的結果與其他人所做的 MATLAB 代碼略有不同,而且由於不同的隨機抽取,我很難找出它的來源。

我發現numpy.random.seed值在第一次抽獎時產生相同的數字,但從第二次抽獎開始,它就完全不同了。 我進行了大約 20,000 次多元正常繪圖,所以我不想只保存 matlab 繪圖並在 Python 中讀取它。

用戶詢問是否可以重現 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 或從 Matlab 移動到 Python 時,擁有可以重現相等隨機數的函數非常方便。

如果將隨機數生成器設置為相同的種子,理論上它會創建相同的數字,即在 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 讀取它們...

只是想進一步澄清使用扭曲器/播種方法: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

Python:

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]])

注意:我也把這個答案放在了這個類似的問題上: 比較使用隨機數生成的 Matlab 和 Numpy 代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM