4 votos

¿Cómo puedo determinar la distribución normal más adecuada a partir de esta información?

Estoy tratando de tomar una distribución normal de puntos, y forzarlos a convertirse en una distribución uniforme. He tenido poco éxito en S.O. Así que pensé en preguntar aquí.

Básicamente, tengo una función hash que toma un X , Y y el valor de la semilla y genera números en una distribución normal con una media de 0. Estos números varían sólo ligeramente de los números en todos los lados de ellos. Cuando se mapea con el X y Y y que el valor hash sea Z crea un mapa del terreno. El mapa tiene algunos picos grandes más allá de 1 y -1, pero el 50% de los valores se encuentran entre (-0,4,0,4). Estoy tratando de suavizar este mapa para que conserve su forma, pero tenga una distribución más o menos uniforme (en lugar de normal).

Como he dicho, el 50% de los valores se encuentran entre (-0,4,0,4). El límite teórico de la función hash es (-2,25,2,25), aunque después de generar mil millones de muestras, el rango de números encontrados fue de aproximadamente (-1,75,1,75).

Creo que tengo que tomar la información anterior para determinar la distribución normal mejor ajustada, y luego utilizarla para transformar cada valor. Como descubrí en S.O., es un problema realmente difícil de explicar. Espero que alguien aquí pueda al menos indicarme la dirección correcta para explicarlo, o que entienda lo que estoy tratando de hacer.


Las densidades de probabilidad de mi distribución, en azul, y Normal(0,.72) En rojo: [-3.8,3.8]

alt text


Sus probabilidades acumuladas: [-3.8,3.8]

alt text


La densidad de probabilidad después de la transformación de probabilidad inversa: [0,1]

alt text


Y la probabilidad acumulada en comparación con Uniform : [0,1] alt text

55voto

Iain Holder Puntos 7930

¿Por qué su transformación tiene que ser una deformación suave? Basta con tomar la representación binaria de cada número en coma fija de complemento a dos de 64 bits, o en coma flotante IEEE de 64 bits, y meterla en SHA-1. Boom, hash instantáneo con una distribución uniforme de los resultados (asumiendo que no hay duplicados).

15voto

Omar Kooheji Puntos 384

El Transformación inversa de la probabilidad parece ser lo que quieres.

Para obtener un mejor ajuste uniforme, la FCD $F(x)$ en la transformada de probabilidad inversa debe ser la distribución real que genera los datos. Si ésta no es realmente normal, entonces eso podría explicar el ajuste relativamente pobre. Puede probar con una Gráfico Q-Q o prueba de normalidad primero. O bien sus datos pueden ser perfectamente normales, sólo con algo de ruido, en cuyo caso puede obtener el mejor ajuste. Yo sugeriría probar en orden:

  1. Normalizar sus datos a N(0, 1) y ver si la transformación mejora.
  2. Después de una prueba de normalidad, ajustar una distribución normal a sus datos, y luego aplicar la transformación.

4voto

jldugger Puntos 7490

Interpretando su pregunta como si pidiera la "transformada de probabilidad inversa", como ha indicado ars y usted ha confirmado en los comentarios a la pregunta, da una solución sencilla: realizar una ordenación para clasificar todas las $z$ valores en orden ascendente desde $1$ a $N$ (la cantidad de datos), y luego convertir cada $z$ en $2 Rank(z)/(N+1) - 1$ . Si quieres ser realmente cuidadoso, escudriña sobre la clasificación $z$ para buscar empates y asignar a cada valor dentro de un grupo de valores empatados la media de sus rangos.

3voto

kyle Puntos 274

Bien, tu función hash está generando números según alguna distribución. Estás pensando que es normal, pero en realidad no lo es.

Hay una forma sencilla de convertir entre cualquier distribución univariante y una distribución uniforme. Se trata de utilizar la función de distribución acumulativa FCD, que es una función monótona simple, en forma de S, que va de y = 0 a y = 1.

Así que para convertir un número x de su distribución hash en un número uniforme y, simplemente tome y = CDF(x). Para convertir un número uniforme y en un número hash x, basta con invertir la función CDF.

Para obtener la función CDF, basta con hacer una búsqueda en la tabla. Genera un gran número N de números de tu función hash, ponlos en un gran array, y ordénalos en orden ascendente. Esa es tu tabla. Luego, para calcular CDF(x), simplemente busque x en la tabla, por búsqueda binaria. Entonces su índice i en la tabla dice lo que es y, por y = i/N. (En realidad, estoy haciendo un poco de trampa. Serás más preciso si haces una interpolación entre dos entradas adyacentes).

Si quieres invertir la función CDF, simplemente toma tu número uniforme y, y obtén i = N*y. Eso le da un índice en la tabla, donde se encuentra x. Por supuesto, usted debe interpolar, pero si N es lo suficientemente grande, y usted no es realmente exigente con la precisión, usted realmente no necesita.

P.D. Estoy pasando por alto algunos detalles, como lo que hay que hacer en los extremos de la tabla, o lo que hay que hacer si la tabla contiene valores duplicados, pero esto debería servirte para empezar.

1voto

Akira Puntos 1061

Recapitulando, tienes una función $f(x,y)$ que es continua, y pseudo-aleatoria uniforme en el número entero $(x,y)$ pero casi normal sobre el plano. Usted desea hacer $f$ pseudo-aleatorio uniforme sobre todo el plano. Supongamos que se puede hacer de alguna manera $f$ parametrizado por algún parámetro $\lambda$ , digamos que utilizando $\theta$ para hacer girar el número uniforme pseudo-aleatorio generado en los puntos de la red. Entonces, si se toma $g(x,y) = \sum_{i} f(x,y,\lambda_i)$ para un montón de $\lambda_i$ valores, $g(x,y)$ se vería mucho más normal, a través del Teorema Central del Límite. Entonces se podría invertir la normal para obtener un campo uniforme. (Me inspiré en el comentario de Mike Dunlavey sobre la adición de 12 uniformes para obtener una normal).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X