Возможно ли воспроизвести randn () MATLAB с NumPy?

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

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

-Joon

  • расширяя (добавляя строку или столбец) матрицу scipy.sparse
  • Использование модуля stats.kstest от Scipy для проверки пригодности
  • Сопоставьте каждое значение списка с соответствующим процентили
  • Python для MATLAB: экспорт списка строк с использованием scipy.io
  • Эффективный способ нормализации Scipy Sparse Matrix
  • Создайте CSR-матрицу из x_index, y_index, value
  • преобразование списка строк python в их тип
  • построение результатов иерархической кластеризации ontop матрицы данных в python
  • 3 Solutions collect form web for “Возможно ли воспроизвести randn () MATLAB с NumPy?”

    Пользователь спросил, можно ли воспроизвести вывод 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 или наоборот.

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

     rand('twister', 5489) 

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

     np.random.seed(5489) 

    Чтобы (re) инициализировать генераторы случайных чисел. Это дает мне одинаковые числа для 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, из функции rand в matlab.

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

    Просто хотел уточнить, используя метод 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)) AT 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, в котором используется генерация случайных чисел

    Python - лучший язык программирования в мире.