7
votes

Est-il possible de reproduire RANDN () de MATLAB avec NUMPY?

Je me demande s'il est possible de reproduire exactement toute la séquence de randn () de matlab avec numpy. J'ai codé ma propre routine avec Python / Numpy, et cela me donne un peu de résultats différents du code MATLAB Quelqu'un d'autre a fait et je suis en train de trouver du mal à trouver où elle vient à cause de dessins aléatoires différents.

J'ai trouvé la valeur numpy.random.seed qui produit le même numéro pour le premier tirage au sort, mais à partir du deuxième tirage au sort et sur, il est complètement différent. Je fais des tirages normaux multivariés pendant environ 20 000 fois, je ne veux donc pas simplement enregistrer les dessins Matlab et le lire en Python.


7 commentaires

Quel est le problème avec numpy.random.randn (...) ? Il devrait faire exactement ce dont vous avez besoin, à moins que vous ne vous inquiéties de générer exactement la même séquence de nombres avec une graine donnée ... (NEWMIND, évidemment c'est ce que vous essayez de faire, maintenant que J'ai relu la question. Sortie de la vague curiosité, pourquoi avez-vous besoin de la séquence exacte pour être la même?)


Que voulez-vous dire "Code MATLAB Quelqu'un d'autre a fait"? Randn est une fonction standard MATLAB. J'espère sincèrement que vous n'utilisez pas une fonction «personnalisée» de la corbeille de la corbeille qui est FEX.


Rien de mal à cela, j'ai besoin de générer exactement la même séquence de nombres avec une graine donnée. Comme je l'ai dit, ma routine avec numpy me donne un résultat différent d'un code MATLAB et je ne peux pas le déboguer en raison de la différence de nombres aléatoires. Je ne peux pas identifier où ça s'est mal passé.


@Nict t bien sûr pas. Je gère un modèle bayésien et mon code me donne des estimations différentes du code MATLAB. Je suis sûr que le code MATLAB est correct, alors j'essaie de déboguer mon code, mais à cause de dessins aléatoires différents, je ne peux pas identifier où les calculs diffèrent.


Ne répond toujours pas à votre question, mais économiser / charger n'est pas que mauvais. Scipey a un traducteur de fichier .mat . Pour que vous puissiez jeter votre espace de travail MATLAB dans un fichier et l'amener facilement facilement avec Scipy.IO.Mio SCIPY.ORG/DOC/API_DOCS/SCIPY.IO.MIO.HTML


Oui, je suppose que je dois le faire. Pour tout résultat, j'ai besoin d'environ 10 000 000 tirages, mais je suppose que pour le test, je peux simplement économiser de petites attractions et pourra voir où le calcul diffère. Merci!


Heureux de signaler que j'ai réussi à reproduire les résultats. A fini par sauver / charger 100 milks mil. Merci.


3 Réponses :


5
votes

Si vous définissez le générateur de nombres aléatoires sur la même graine, il créera théoriquement les mêmes numéros, c'est-à-dire dans MATLAB. Je ne suis pas tout à fait sûr de la meilleure façon de le faire, mais cela semble fonctionner, dans Matlab faire:

np.random.seed(5489)


1 commentaires

Merci beaucoup pour votre réponse. Je vais certainement l'essayer.



2
votes

Je voulais juste préciser davantage à l'aide de la méthode Twister / Semise: MATLAB et NUMPLY génèrent la même séquence en utilisant ce semoir mais les remplira dans des matrices différemment.

matlab strong> remplit une matrice bas colonnes strong>, tandis que python fort> va down down strong>. Donc, afin d'obtenir les mêmes matrices dans les deux, vous devez transposer: P>

MATLAB: P>

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


0 commentaires

7
votes

L'utilisateur a demandé s'il était possible de reproduire la sortie de Randn () de Matlab, pas de rand. Je n'ai pas pu définir l'algorithme ou la graine pour reproduire le nombre exact pour Randn (), mais la solution ci-dessous fonctionne pour moi.

dans MATLAB: Générez vos nombres aléatoires distribués normaux comme suit: P>

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


0 commentaires