python - matriz - Comparando el código Matlab y Numpy que usa generación de números aleatorios
shape en python (4)
¿Hay alguna manera de hacer que el generador de números aleatorios en numpy genere los mismos números aleatorios que en Matlab, dada la misma semilla?
Intenté lo siguiente en Matlab:
>> rng(1);
>> randn(2, 2)
ans =
0.9794 -0.5484
-0.2656 -0.0963
Y lo siguiente en iPython con Numpy:
In [21]: import numpy as np
In [22]: np.random.seed(1)
In [23]: np.random.randn(2, 2)
Out[23]:
array([[ 1.624, -0.612],
[-0.528, -1.073]])
Los valores en ambas matrices son diferentes.
O alguien podría sugerir una buena idea para comparar dos implementaciones del mismo algoritmo en Matlab y Python que usa generación de números aleatorios.
¡Gracias!
Una forma de garantizar que los mismos números se alimenten en su proceso es generarlos en uno de los dos languges, guardarlos e importarlos al otro idioma. Esto es bastante fácil, podrías escribirlos en un archivo de texto simple.
Si esto no es posible o deseable, también puede asegurarse de que los números sean los mismos haciendo usted mismo la generación de los números pseudoaleatorios. Aquí hay un sitio que muestra un ejemplo muy simple de un algoritmo fácil de implementar: crea tus propios números aleatorios simples
Si la calidad de su generador aleatorio casero no es suficiente, puede crear una función de generación aleatoria en un idioma y llamarla desde el otro. El camino más fácil es, probablemente, llamar a matlab desde python.
Si te sientes con suerte, intenta jugar con la configuración. Por ejemplo, intente utilizar la entrada de
seed
(desactualizada) para las funciones aleatorias de matlabs. O intente usar diferentes tipos de generadores. Creo que el valor predeterminado en ambos idiomas es mersenne twister, pero si esta implementación no es la misma, quizás una más simple.
¿Qué le parece si ejecuta un script de matlab para obtener los números aleatorios basados en una semilla, dentro de su código python?
Como Bakuriu sugiere que funciona usando el tornado de MATLAB:
MATLAB:
>> rand(''twister'', 1337)
>> rand()
ans =
0.2620
Python (Numpy):
>>> import numpy as np
>>> np.random.seed(1337)
>>> np.random.random()
0.2620246750155817
Solo quería aclarar más sobre el uso del método twister / siembra: MATLAB y numpy generan la misma secuencia usando esta siembra pero los completarán en matrices de forma diferente.
MATLAB rellena una matriz en columnas abajo , mientras que python baja filas . Entonces, para obtener las mismas matrices en ambos, debes 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
pitón:
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]])