4 votos

¿Cómo tratar los casos extremos en la generación de números aleatorios normales?

Para generar números aleatorios normales, se suelen generar números aleatorios siguiendo una distribución uniforme $Z \sim \mathcal{U}(0,1)$ y luego les aplica la función CDF inversa $X=\Phi^{-1}(Z) \sim \mathcal{N}(0,1)$ .

Sin embargo, me encontré con un caso problemático cuando uno de los generados $Z$ resulta dar exactamente 0. Entonces, se tiene $X=\Phi^{-1}(Z)=- \infty$ .

Esto es bastante problemático cuando se generan muestras aleatorias porque normalmente se romperá toda la medida de varianza/covarianza básicamente volviendo nan o inf cuando las muestras contienen un número infinito.

¿Cómo suele manejar esto? ¿Comprueba después de cada número aleatorio generado si el valor es 0 o 1 y lo desplaza ligeramente (o simplemente lo descarta)?

6voto

Kevindra Puntos 118

Esto depende de su método para generar los números aleatorios normales. El problema con la cdf normal es que la inversa directa $\phi^{-1}(Z)$ es difícil de resolver directamente. Existen otros métodos para generar $N(\mu, \sigma^2)$ de $U(0,1)$ . Dos métodos notables son:

  1. Método Box-Muller
  2. Método polar de Marsaglia

Para la mayoría de los propósitos se pueden utilizar los métodos anteriores, pero hay que asegurarse de que los números aleatorios uniformes son buenos. No tendrás el problema de $-\inf$ o $\inf$ . Prefiero Box-Muller ya que no tengo que descartar ningún número generado.

4voto

Simon Gibbs Puntos 206

La mayoría de los RNGs uniformes producen inicialmente enteros en [0,2^32). Cuando dicho valor se convierte a doble, que tiene más de 32 bits de precisión de mantisa, y luego se escala a [0,1), la mejor ruta es simplemente añadir 2^-33 al final para centrar las salidas alrededor de 1/2.

De esta forma no se desperdician valores, no se necesitan comprobaciones y se cubre mejor el intervalo (0,1) llegando más lejos en las colas. Además, en los procesadores y compiladores modernos esto puede salir completamente gratis.

Descartar/desplazar 0 o 1, o escalar a otros intervalos son costosos y producen una salida subóptima.

1voto

Brendan Puntos 150

Estoy de acuerdo con @encor en que no es un problema incluir algo de lógica para evitar errores. Me imagino que la mayoría de los generadores de números aleatorios no uniformes ya lo incluyen.

Creo que no he utilizado un generador de números pseudoaleatorios que reciba un 0. No soy un experto en el tema, pero una implementación común (generador congruente lineal) se basa en la aritmética modular. Por ejemplo, el generador $X_{n+1}=f(X_{n})mod\: m$ puede producir números entre 0 y $m-1$ donde $m$ es un número grande. A continuación, se puede dividir por $m$ y asegúrese de que todos los números están entre 0 y 1. La única forma de obtener un cero es si $f(X_{n})$ es igual a $m$ . Si $m$ es lo suficientemente grande (y la mayoría parece estar usando $2^{31}$ o $2^{32}$ ), entonces eso debería ser muy raro.

La única otra cosa que se me ocurre es un problema con los tipos. Por ejemplo, podrías necesitar un unsigned int o long para generar los enteros aleatorios. La división para obtener entre 0 y 1 sugiere un tipo float o double. Podría estar redondeando las cosas a 0 en lugar de 0.xxx1.

Si no está satisfecho con lo anterior, existen otras técnicas para el muestreo de distribuciones. Por ejemplo, puede representar la distribución como una rejilla, como en las vistas extremas totalmente flexibles de Meucci (aunque sin la parte de la agrupación de la entropía). A continuación, puede utilizar la interpolación lineal como él describe para simular a partir de la distribución de la cuadrícula.

0voto

Andrey Puntos 137

De hecho, a efectos computacionales, lo mejor que se puede hacer es utilizar una distribución uniforme en otro intervalo $[10^{-10},1-10^{-10}]$ o simplemente descartar todas las ocurrencias de $Z=0,1$ .

Descartando $Z=0,1$ está justificado, ya que para distribuciones continuas $P(Z=0)=P(Z=1)=0$ .

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X