Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to reproduce randn() of MATLAB with NumPy?

I wonder if it is possible to exactly reproduce the whole sequence of randn() of MATLAB with NumPy. I coded my own routine with Python/Numpy, and it is giving me a little bit different results from the MATLAB code somebody else did, and I am having hard time finding out where it is coming from because of different random draws.

I have found the numpy.random.seed value which produces the same number for the first draw, but from the second draw and on, it is completely different. I'm making multivariate normal draws for about 20,000 times so I don't want to just save the matlab draws and read it in Python.

like image 476
joon Avatar asked Sep 15 '10 21:09

joon


People also ask

How do you use randn NumPy?

Usage of NumPy random. randn() is a numpy library function that returns an array of random samples from the standard normal distribution. It allows specified dimensions as an argument and returns an array of specified dimensions. If we don't provide any argument, it will return the float value.

How do you declare randn in Python?

randn() function creates an array of specified shape and fills it with random values as per standard normal distribution.

What is the difference between randn and Rand in NumPy?

randn generates samples from the normal distribution, while numpy. random. rand from a uniform distribution (in the range [0,1)).

How do you generate a random integer matrix in NumPy?

To create a matrix of random integers in Python, randint() function of the numpy module is used. This function is used for random sampling i.e. all the numbers generated will be at random and cannot be predicted at hand. Parameters : low : [int] Lowest (signed) integer to be drawn from the distribution.


2 Answers

The user asked if it was possible to reproduce the output of randn() of Matlab, not rand. I have not been able to set the algorithm or seed to reproduce the exact number for randn(), but the solution below works for me.

In Matlab: Generate your normal distributed random numbers as follows:

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

In Python: Generate your normal distributed random numbers as follows:

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

It is quite convenient to have functions, which can reproduce equal random numbers, when moving from Matlab to Python or vice versa.

like image 92
Jens Munk Avatar answered Oct 03 '22 01:10

Jens Munk


If you set the random number generator to the same seed, it will theoretically create the same numbers, ie in matlab. I am not quite sure how to best do it, but this seems to work, in matlab do:

rand('twister', 5489)

and corresponding in numy:

np.random.seed(5489)

To (re)initalize your random number generators. This gives for me the same numbers for rand() and np.random.random(), however not for randn, I am not sure if there is an easy method for that.

With newer matlab versions you can probably set up a RandStream with the same properties as numpy, for older you can reproduce numpy's randn in matlab (or vice versa). Numpy uses the polar form to create the uniform numbers from np.random.random() (the second algorithm given here: http://www.taygeta.com/random/gaussian.html). You could just write that algorithm in matlab to create the same randn numbers as numpy does from the rand function in matlab.

If you don't need a huge amount of random numbers, just save them in a .mat and read them from scipy.io though...

like image 31
seberg Avatar answered Oct 03 '22 02:10

seberg