¿El mejor método para transformar la secuencia de baja discrepancia en distribución normal?


9

He estado usando secuencias de baja discrepancia durante un tiempo para Distribuciones uniformes, ya que he encontrado que sus propiedades son útiles (principalmente en gráficos de computadora por su apariencia aleatoria y su capacidad para cubrir densamente [0,1] de manera incremental).

Por ejemplo, valores aleatorios arriba, valores de secuencia Halton abajo:

http://i.stack.imgur.com/gCXrh.png

Estaba considerando usarlos para la planificación de algunos análisis financieros, pero necesito distribuciones diferentes que solo uniformes. Comencé tratando de generar una distribución normal a partir de mis distribuciones uniformes a través del algoritmo polar Marsaglia, pero los resultados no parecen tan buenos como con la distribución uniforme.

Otro ejemplo, nuevamente al azar arriba, Halton abajo:

http://i.stack.imgur.com/NNcdH.png

Mi pregunta es: ¿Cuál es el mejor método para obtener una distribución normal con las propiedades que obtengo de una secuencia uniforme de baja discrepancia: cobertura, relleno incremental, no correlación en múltiples dimensiones? ¿Estoy en el camino correcto, o debería tomar un enfoque completamente diferente?

(Código de Python para distribuciones uniformes y normales que uso arriba: Gist 2566569 )


3
Seguramente has visto la respuesta natural y obvia, que es aplicar la transformación de probabilidad a los valores uniformes. ¿En qué aspectos este enfoque no satisface sus necesidades?
whuber

Eso fue lo que supuse que era la forma normal de crear tales distribuciones a partir de una entrada uniforme, pero tuve problemas para encontrar dichos algoritmos (soy un programador, no un estadístico, por lo que comencé desde cero en mi búsqueda). Los métodos que encontré fueron Box Muller, Marsaglia Polar, Ziggarat y Ratio of Uniforms, todos los cuales requieren mezclar más de una muestra de entrada que parece destruir las características que estaba tratando de preservar en las secuencias de Baja Discrepancia. Acabo de encontrar la siguiente página: home.online.no/~pjacklam/notes/invnorm que me ha dado la información que quiero.
Edouard Pobre

3
Sí, ese sitio implementa la transformación de probabilidad para la distribución Normal. Es posible que haya tenido problemas para investigar esto porque es tan conocido que prácticamente cualquier método alternativo para generar valores aleatorios supone implícitamente que podría usar este método y luego busca formas más eficientes en casos especiales (incluidos los cuatro métodos que enumera).
whuber

3
¡La inversión será el único método válido para este caso!
kjetil b halvorsen

Me pregunto si también podemos obtener los valores cuasialeatorios de otra distribución, por ejemplo, el valor cuasialeatorio de la distribución beta.
user315648

Respuestas:


5

Puedes transformarte de U(0,1)variables aleatorias a cualquier otra distribución usando el inverso del CDF, también llamada función de punto porcentual. Se implementa scipycomo scipy.stats.norm.ppf .


6

Recientemente me topé con este problema. Ingenuamente pensé que cualquier transformación del uniforme funcionaría, así que conecté una secuencia 1D Sobol (y Halton) como si la secuencia fuera un generador de números aleatorios en una std::normal_distribution<>variante. Para mi sorpresa, no funcionó, obviamente generó una distribución no normal.

Ok, entonces tomé la función Numerical Recipes Third Edition Chapter 7.3.9 Normal_devpara generar números normales de las secuencias de Sobol o Halton por el método de "Ratio-of-Uniforms" y falló de la misma manera. Entonces pensé, bueno, si miras el código, se necesitan dos números aleatorios uniformes para generar dos números aleatorios normalmente distribuidos. Quizás si utilizo una secuencia 2D Sobol (o Halton) funcionará. Bueno, falló nuevamente.

Recordé el "método Box-Muller" (mencionado en los comentarios) y dado que tiene una interpretación más geométrica, pensé que podría funcionar. Bueno, funcionó! Estaba muy emocionado de comenzar a hacer otra prueba, la distribución parece normal.

El problema que vi fue que la distribución no era mejor que aleatoria, se trataba de llenar, así que estaba un poco decepcionado, pero listo para publicar el resultado.

Luego hice una búsqueda más profunda (ahora que sabía qué buscar), y resultó que ya hay un documento sobre este tema: http://www.sciencedirect.com/science/article/pii/S0895717710005935

En este documento se afirma realmente

Dos métodos bien conocidos utilizados con números pseudoaleatorios son los métodos de Box-Muller y de transformación inversa. Algunos investigadores e ingenieros financieros han afirmado que es incorrecto usar el método Box-Muller con secuencias de baja discrepancia, y en su lugar, debe usarse el método de transformación inversa. En este artículo demostramos que el método Box-Muller puede usarse con secuencias de baja discrepancia, y discutimos cuándo su uso podría ser realmente ventajoso.

Entonces la conclusión general es esta:

1) Puede usar Box-Muller en secuencias 2D de baja discrepancia para obtener secuencias distribuidas normalmente. Pero mis pocos experimentos parecen mostrar que la baja discrepancia / espacio, por ejemplo, las propiedades de llenado se pierden en la secuencia transformada normal.

2) Puede usar el método inverso, presumiblemente se conservarán las propiedades de baja discrepancia / relleno de espacio.

3) La proporción de uniformes no se puede usar.

EDITAR : Este https://mathoverflow.net/a/144234 apunta a las mismas conclusiones.

Hice una ilustración (la primera figura (Proporción de uniformes en Sobol) muestra que la distribución obtenida no es normal, pero los ohters (Box-Muller y aleatorio para comparación) son):

cifras

EDIT2:

El punto principal es que, incluso si encuentra un método que pueda transformar la "distribución" de una secuencia de baja discrepancia, no es obvio que conserve las buenas propiedades de relleno. Entonces no eres mejor que con una distribución normal verdaderamente aleatoria (estándar). Todavía tengo que encontrar un método que tenga poca discrepancia y, sin embargo, se llene muy bien con una distribución no uniforme. Apuesto a que tal método es muy poco obvio y quizás un problema abierto.


En el documento mencionado anteriormente ( sciencedirect.com/science/article/pii/S0895717710005935 ) la última oración dice: "Con base en estos resultados, concluimos que Box – Muller es una buena alternativa al método de transformación inversa para generar secuencias de baja discrepancia de la distribución normal ". ¿No contradice esto el punto 1 de las conclusiones declaradas?
ngiann

@ngiann, no es contradictorio. El artículo llega a mi misma conclusión de que la distribución se obtiene correctamente por la transformación de BM pero no por los otros métodos. La segunda parte de la oración ("Pero parece que se pierden las propiedades de baja discrepancia / relleno de espacio") está relacionada con una propiedad secundaria que se busca en las secuencias de baja discrepancia, como el relleno eficiente del espacio. Mi experimento no mostró esa propiedad traducida a la secuencia transformada normal. Si no recuerdo mal, el documento no entra en ese problema específico. Creo que esto necesita más estudio para ser concluyente.
AlfC

1

Hay dos buenos métodos. Primero, como se señaló anteriormente, se puede utilizar una aproximación precisa a la inversa de la distribución gaussiana. Entonces uno puede transformar cualquier secuencia de baja discrepancia en una gaussiana.

El segundo método es el Box-Muller. Este método requiere dos números de entrada (R y A) y genera dos salidas. Se necesita una secuencia bidimensional de baja discrepancia. Uno toma (por ejemplo, en la secuencia de Halton), se utilizan pares de números primos, uno para el componente radial (R) y otro para el componente angular (A). Uno obtiene Sqrt (-2 * Log (R)) para el componente radial y Sin (2 * Pi * A) y Cos (2 * Pi * A) para los componentes angulares. Multiplicar el radial por los dos componentes angulares (por separado) da dos gaussianos. La eficiencia es la misma que la anterior; dos entradas casi aleatorias y dos salidas gaussianas.

Se puede usar cualquier secuencia multidimensional de baja discrepancia, dependiendo de la dimensionalidad del problema.


0

El método más nativo sería usar el CDF inverso para transformarse en gaussiano normal, pero también hay problemas con esto. Si tiene, por ejemplo, un conjunto de puntos SUD creado por redes de rango 1, entonces sería que el punto de partida es siempre (0,0), por lo que para transformarlo necesita un pequeño cambio, lo mejor es tener el mismo espacio que para el esquina (1,1).

Hasta ahora no hay problema todavía, pero para una distribución gaussiana ideal, N (0,1) + N (0,1) debería dar la misma distribución que la diferencia. Sin embargo, este no sería el caso utilizando LDS de celosía de rango 1 e iCDF en cada variable, porque el punto de partida en cada variable daría un cierto iCDF, como3σ (dependiendo de N), entonces la diferencia sería 6σ.

Y ese es un valor demasiado extremo, que conduce realmente a un error sistemático (por ejemplo, no obtendrá +6σal otro lado). Inspeccione mejor su LDS transformado también para obtener sumas y diferencias, verifique estos puntos extremos y también para sesgos y curtosis.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.