¿Cómo puedo convertir una distribución uniforme (como la mayoría de los generadores de números aleatorios producen, por ejemplo, entre 0,0 y 1,0) en una distribución normal? ¿Qué pasa si quiero una desviación estándar y media de mi elección?
106
Respuestas:
El algoritmo Ziggurat es bastante eficiente para esto, aunque la transformación Box-Muller es más fácil de implementar desde cero (y no muy lento).
fuente
Hay muchos métodos:
fuente
Cambiar la distribución de cualquier función a otra implica usar la inversa de la función que desea.
En otras palabras, si su objetivo es una función de probabilidad específica p (x), obtiene la distribución integrando sobre ella -> d (x) = integral (p (x)) y usa su inversa: Inv (d (x)) . Ahora use la función de probabilidad aleatoria (que tiene una distribución uniforme) y emita el valor del resultado a través de la función Inv (d (x)). Debería obtener valores aleatorios emitidos con distribución de acuerdo con la función que elija.
Este es el enfoque matemático genérico: al usarlo, ahora puede elegir cualquier función de probabilidad o distribución que tenga siempre que tenga una aproximación inversa o una buena aproximación inversa.
Espero que esto haya ayudado y gracias por el pequeño comentario sobre el uso de la distribución y no la probabilidad en sí.
fuente
Aquí hay una implementación de JavaScript que utiliza la forma polar de la transformación Box-Muller.
fuente
Utilice la entrada mathworld del teorema del límite central de wikipedia para su ventaja.
Genere n de los números distribuidos uniformemente, súmelos, reste n * 0.5 y obtendrá el resultado de una distribución aproximadamente normal con media igual a 0 y varianza igual a
(1/12) * (1/sqrt(N))
(consulte wikipedia sobre distribuciones uniformes para la última)n = 10 te da algo medio decente rápido. Si desea algo más de la mitad decente, opte por la solución de tylers (como se indica en la entrada de wikipedia sobre distribuciones normales )
fuente
Usaría Box-Muller. Dos cosas sobre esto:
Normalmente, almacena en caché un valor y devuelve el otro. En la siguiente llamada para obtener una muestra, devuelve el valor almacenado en caché.
Luego, debe escalar el puntaje Z por la desviación estándar y sumar la media para obtener el valor total en la distribución normal.
fuente
Donde R1, R2 son números uniformes aleatorios:
DISTRIBUCIÓN NORMAL, con SD de 1: sqrt (-2 * log (R1)) * cos (2 * pi * R2)
Esto es exacto ... ¡no es necesario hacer todos esos bucles lentos!
fuente
Parece increíble que pudiera agregar algo a esto después de ocho años, pero para el caso de Java, me gustaría señalar a los lectores el método Random.nextGaussian () , que genera una distribución gaussiana con una media de 0.0 y una desviación estándar de 1.0 para ustedes.
Una simple suma y / o multiplicación cambiará la media y la desviación estándar según sus necesidades.
fuente
El módulo de biblioteca estándar de Python al azar tiene lo que desea:
Para el algoritmo en sí, eche un vistazo a la función en random.py en la biblioteca de Python.
La entrada manual está aquí
fuente
Esta es mi implementación de JavaScript del algoritmo P ( método polar para desviaciones normales ) de la Sección 3.4.1 del libro de Donald Knuth El arte de la programación informática :
fuente
Yo cosa que debe tratar esto en EXCEL:
=norminv(rand();0;1)
. Esto producirá los números aleatorios que deberían distribuirse normalmente con la media cero y unir la varianza. Se puede suministrar "0" con cualquier valor, de modo que los números tengan la media deseada, y al cambiar "1", obtendrá la varianza igual al cuadrado de su entrada.Por ejemplo:
=norminv(rand();50;3)
cederá a los números distribuidos normalmente con MEAN = 50 VARIANCE = 9.fuente
P ¿Cómo puedo convertir una distribución uniforme (como la mayoría de los generadores de números aleatorios producen, por ejemplo, entre 0.0 y 1.0) en una distribución normal?
Para la implementación de software, conozco un par de nombres de generadores aleatorios que le dan una secuencia aleatoria pseudo uniforme en [0,1] (Mersenne Twister, Linear Congruate Generator). Llamémoslo U (x)
Existe un área matemática que se llama teoría de la probabilidad. Primero: si desea modelar rv con distribución integral F, puede intentar evaluar F ^ -1 (U (x)). En teoría pr. Se demostró que tal rv tendrá distribución integral F.
El paso 2 puede aplicarse para generar rv ~ F sin el uso de ningún método de conteo cuando F ^ -1 se puede derivar analíticamente sin problemas. (por ejemplo, distribución exp.)
Para modelar la distribución normal, puede calcular y1 * cos (y2), donde y1 ~ es uniforme en [0,2pi]. e y2 es la distribución relevante.
P: ¿Qué pasa si quiero una desviación estándar y media de mi elección?
Puede calcular sigma * N (0,1) + m.
Se puede demostrar que tales cambios y escalas conducen a N (m, sigma)
fuente
Esta es una implementación de Matlab que utiliza la forma polar de la transformación Box-Muller :
Función
randn_box_muller.m
:E invocar
histfit(randn_box_muller(10000000),100);
este es el resultado:Obviamente, es realmente ineficiente en comparación con el randn incorporado de Matlab .
fuente
Tengo el siguiente código que tal vez podría ayudar:
fuente
También es más fácil usar la función implementada rnorm () ya que es más rápido que escribir un generador de números aleatorios para la distribución normal. Vea el siguiente código como prueba
fuente
fuente