¿Es posible reproducir randn () de MATLAB con NumPy?

Me pregunto si es posible reproducir exactamente la secuencia completa de randn () de MATLAB con NumPy. Codifiqué mi propia rutina con Python / Numpy, y me está dando resultados un poco diferentes del código MATLAB que alguien más hizo, y me está costando mucho descubrir de dónde proviene debido a los diferentes sorteos aleatorios.

He encontrado el valor numpy random.seed que produce el mismo número para el primer sorteo, pero a partir del segundo sorteo es completamente diferente. Estoy dibujando multivariado normal como unas 20,000 veces, así que no quiero simplemente guardar los dibujos de matlab y leerlos en Python. Si hay alguna otra forma, supongo que tengo que hacer eso. Por favor hagamelo saber.

-Joon

El usuario preguntó si era posible reproducir la salida de randn () de Matlab, no de rand. No he podido configurar el algoritmo o semilla para reproducir el número exacto para randn (), pero la solución a continuación funciona para mí.

En Matlab: genere sus números aleatorios distribuidos normales de la siguiente manera:

 rng(1); norminv(rand(1,5),0,1) ans = -0.2095 0.5838 -3.6849 -0.5177 -1.0504 

En Python: genere sus números aleatorios distribuidos normales de la siguiente manera:

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

Es muy conveniente tener funciones, que puedan reproducir números aleatorios iguales, al pasar de Matlab a Python o viceversa.

Si configura el generador de números aleatorios para la misma semilla, teóricamente creará los mismos números, es decir, en matlab. No estoy muy seguro de cómo hacerlo mejor, pero esto parece funcionar, en matlab do:

 rand('twister', 5489) 

y correspondiente en cantidad:

 np.random.seed(5489) 

Para (re) inicializar sus generadores de números aleatorios. Esto me da los mismos números para rand () y np.random.random (), pero no para randn, no estoy seguro de que exista un método fácil para eso.

Con las versiones más recientes de matlab, es probable que pueda configurar un RandStream con las mismas propiedades que numpy; para mayores, puede reproducir el comando de numpy en matlab (o viceversa). Numpy usa la forma polar para crear los números uniformes de np.random.random () (el segundo algoritmo que se proporciona aquí: http://www.taygeta.com/random/gaussian.html ). Simplemente puede escribir ese algoritmo en matlab para crear los mismos números de randn que numpy lo hace desde la función de rand en matlab.

Si no necesita una gran cantidad de números aleatorios, simplemente guárdelos en un .mat y léalos desde scipy.io aunque …

Solo quería aclarar más sobre el uso del método twister / seeding: MATLAB y numpy generan la misma secuencia utilizando esta siembra, pero los rellenarán en matrices de manera diferente.

MATLAB completa una matriz en columnas , mientras que Python baja filas . Entonces para obtener las mismas matrices en ambas, tienes que transponer:

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

Nota: También puse esta respuesta en esta pregunta similar: comparando el código de Matlab y Numpy que usa la generación de números aleatorios