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:
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:
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 )
fuente
Respuestas:
Puedes transformarte deU(0,1) variables aleatorias a cualquier otra distribución usando el inverso del CDF, también llamada función de punto porcentual. Se implementa
scipy
como scipy.stats.norm.ppf .fuente
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_dev
para 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
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):
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.
fuente
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.
fuente
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, como−3σ (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.
fuente