[英]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.