Можно ли воспроизвести randn () из MATLAB с помощью NumPy? - PullRequest
6 голосов
/ 16 сентября 2010

Интересно, можно ли точно воспроизвести всю последовательность randn () из MATLAB с помощью NumPy.Я кодировал свою собственную подпрограмму с помощью Python / Numpy, и она дает мне немного отличающиеся результаты от кода MATLAB, который сделал кто-то другой, и мне трудно выяснить, откуда он исходит из-за различных случайных операций.

Я нашел значение numy random.seed, которое выдает такое же число для первого розыгрыша, но со второго розыгрыша и далее оно совершенно другое.Я рисую многовариантное нормальное изображение примерно 20 000 раз, поэтому я не хочу просто сохранять отрисовки Matlab и читать их на Python.Если есть какой-то другой способ, я думаю, я должен это сделать.Пожалуйста, дайте мне знать.

-Joon

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

Если вы установите для генератора случайных чисел одинаковое начальное число, он теоретически создаст те же числа, то есть в matlab. Я не совсем уверен, как лучше всего это сделать, но, похоже, это работает, в Matlab сделать:

rand('twister', 5489)

и соответствующий в numy:

np.random.seed(5489)

Чтобы (ре) инициализировать генераторы случайных чисел. Это дает мне одинаковые числа для rand () и np.random.random (), но не для randn, я не уверен, существует ли простой способ для этого.

В более новых версиях matlab вы, вероятно, можете настроить RandStream с теми же свойствами, что и numpy, для более старых вы можете воспроизвести randn numpy в matlab (или наоборот). Numpy использует полярную форму для создания равномерных чисел из np.random.random () (второй алгоритм, приведенный здесь: http://www.taygeta.com/random/gaussian.html). Вы можете просто написать этот алгоритм в Matlab, чтобы создать те же числа RANDN, что и NUMPY из функция ранда в Matlab.

Если вам не нужно огромное количество случайных чисел, просто сохраните их в формате .mat и прочитайте их из scipy.io, хотя ...

4 голосов
/ 24 апреля 2016

Пользователь спросил, возможно ли воспроизвести вывод randn () из Matlab, а не 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 голосов
/ 15 мая 2014

Просто хотелось бы уточнить использование метода скручивания / заполнения: 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]])

Примечание: я также поместил этот ответ на аналогичный вопрос: Сравнение кода Matlab и Numpy, использующего генерацию случайных чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...