94 votos

¿Cómo generar puntos uniformemente distribuidos en la superficie de la esfera de la unidad 3-D?

Me pregunto cómo generar puntos uniformemente distribuidos en la superficie de la esfera de la unidad 3-D. También después de generar esos puntos, ¿cuál es la mejor manera de visualizar y comprobar si son realmente uniformes en la superficie $x^2+y^2+z^2=1$ ?

0 votos

Si por uniforme te refieres a "regular", no hay manera de hacerlo fuera de $n$ =2, 4, 6, 8, 12, 20.

2 votos

Qué pasa con la muestra de un MultiVariateGaussian y ese vector sólo normalizarlo: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000)) y luego v = v/v.norm(10000)

101voto

jldugger Puntos 7490

Un método estándar consiste en generar tres normales estándar y construir un vector unitario a partir de ellas. Es decir, cuando $X_i \sim N(0,1)$ y $\lambda^2 = X_1^2 + X_2^2 + X_3^2$ entonces $(X_1/\lambda, X_2/\lambda, X_3/\lambda)$ se distribuye uniformemente en la esfera. Este método funciona bien para $d$ -esferas dimensionales, también.

En 3D se puede utilizar el muestreo de rechazo: dibujar $X_i$ de un uniforme $[-1,1]$ distribución hasta que la longitud de $(X_1, X_2, X_3)$ es menor o igual a 1, entonces - al igual que con el método anterior - normalizar el vector a la unidad de longitud. El número esperado de ensayos por punto esférico es igual a $2^3/(4 \pi / 3)$ = 1.91. En dimensiones más altas, el número esperado de ensayos se hace tan grande que esto se vuelve rápidamente impracticable.

Hay muchas maneras de comprobar la uniformidad . Una manera limpia, aunque algo intensiva desde el punto de vista computacional, es con Función K de Ripley . El número esperado de puntos dentro de la distancia (euclidiana 3D) $\rho$ de cualquier lugar de la esfera es proporcional al área de la esfera dentro de la distancia $\rho$ que es igual a $\pi\rho^2$ . Calculando todas las distancias entre puntos se pueden comparar los datos con este ideal.

Los principios generales de la construcción de gráficos estadísticos sugieren que una buena manera de realizar la comparación es trazar los residuos estabilizados por la varianza $e_i(d_{[i]} - e_i)$ contra $i = 1, 2, \ldots, n(n-1)/2=m$ donde $d_{[i]}$ es el $i^\text{th}$ menor de las distancias mutuas y $e_i = 2\sqrt{i/m}$ . El gráfico debe ser cercano a cero. (Este enfoque es poco convencional).

Aquí se muestra una imagen de 100 extracciones independientes de una distribución esférica uniforme obtenida con el primer método:

100 uniform spherical points

Aquí está el gráfico de diagnóstico de las distancias:

Diagnostic plot

La escala y sugiere que estos valores son todos cercanos a cero.

Aquí se acumulan 100 de estos gráficos para sugerir qué desviaciones de tamaño podrían ser realmente indicadores significativos de no uniformidad:

Simulated values

(Estas parcelas se parecen mucho a Puentes brownianos ...puede haber algunos descubrimientos teóricos interesantes al acecho).

Por último, aquí está el gráfico de diagnóstico para un conjunto de 100 puntos aleatorios uniformes más otros 41 puntos distribuidos uniformemente sólo en el hemisferio superior:

Simulated non-uniform values

En relación con la distribución uniforme, muestra una significativa disminuir en las distancias medias entre puntos hasta un rango de un hemisferio. Esto en sí mismo no tiene sentido, pero la información útil aquí es que algo no es uniforme en la escala de un hemisferio. En efecto, este gráfico detecta fácilmente que un hemisferio tiene una densidad diferente a la del otro. (Una prueba de chi-cuadrado más sencilla lo haría con más potencia si se sabe de antemano qué hemisferio se va a probar de entre las infinitas posibles).

2 votos

@whuber: ¡muy bonito! ¡muchas gracias por tu post! " $(X_1/\lambda, X_2/\lambda, X_3/\lambda)$ se distribuye uniformemente en la esfera". ¿Dónde puedo encontrar referencias sobre su demostración, o es simplemente demostrable?

0 votos

@whuber ¿Qué software utilizaste para generar el gráfico de la esfera?

0 votos

Apuesto a que es mathematica... solo hay que decirlo por el color... :)

21voto

Alan Puntos 7273

He aquí un código R bastante sencillo

n     <- 100000                  # large enough for meaningful tests
z     <- 2*runif(n) - 1          # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi      # uniform on [-pi, pi]
x     <- sin(theta)*sqrt(1-z^2)  # based on angle
y     <- cos(theta)*sqrt(1-z^2)     

Es muy sencillo ver en la construcción que $x^2+y^2 = 1- z^2$ y así $x^2+y^2+z^2=1$ pero si hay que probarlo, entonces

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

y fácil de probar que cada uno de $x$ y $y$ se distribuyen uniformemente en $[-1,1]$ ( $z$ obviamente lo es) con

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

Claramente, dado un valor de $z$ , $x$ y $y$ se distribuyen uniformemente alrededor de un círculo de radio $\sqrt{1-z^2}$ y esto se puede comprobar observando la distribución de la arctangente de su ratio. Pero como $z$ tiene la misma distribución marginal que $x$ y como $y$ Una afirmación similar es cierta para cualquier par, y esto también se puede comprobar.

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

Si todavía no estás convencido, los siguientes pasos serían mirar alguna rotación tridimensional arbitraria o cuántos puntos caen dentro de un ángulo sólido dado, pero eso empieza a complicarse, y creo que es innecesario.

0 votos

Me pregunto si su método de generación de puntos (x,y,z) es esencialmente el mismo que el método de Whuber.

3 votos

No lo es: whuber utiliza tres números aleatorios mientras que yo utilizo dos. El mío es un caso especial de "generar un punto en $[-1,1]$ con una densidad adecuada [proporcional a $(1-z^2)^{n/2-1}$ ] y luego bajar una dimensión". Aquí convenientemente $n=2$ ya que esto es formalmente un 2 esferas .

3 votos

O, de forma más general, genere puntos uniformes en el mapa utilizando cualquier proyección de igual área (la suya es una cilíndrica de igual área), y luego proyecte hacia atrás. (+1)

11voto

Mike Fiedler Puntos 1484

Si se quiere muestrear puntos distribuidos uniformemente en la esfera 3D (es decir, la superficie de una bola 3D), se utiliza un rechazo simple, o el método de Marsaglia (Ann. Math. Statist., 43 (1972), pp. 645-646). Para dimensiones bajas, la proporción de rechazo es bastante baja.

Si quieres generar puntos aleatorios a partir de esferas y bolas de mayor dimensión, entonces depende del propósito y la escala de la simulación. Si no quiere realizar grandes simulaciones, utilice el método de Muller (Commun. ACM, 2 (1959), pp. 19-20) o su versión de "bola" (véase el artículo de Harman & Lacko citado anteriormente). Es decir:

para obtener una muestra uniformemente distribuida en una n-esfera (superficie) 1) generar X a partir de una distribución normal estándar de n dimensiones 2) dividir cada componente de X por la norma euclidiana de X

para obtener una muestra uniformemente distribuida en una bola n (interior) 1) generar X a partir de una distribución normal estándar (n+2)-dimensional 2) dividir cada componente de X por la norma euclidiana de X y tomar sólo las primeras n componentes

Si desea realizar grandes simulaciones, deberá investigar métodos más especializados. Si lo solicita, puedo enviarle el documento de Harman y Lacko sobre métodos de distribución condicional, que proporciona la clasificación y las generalizaciones de algunos algoritmos mencionados en esta discusión. El contacto está disponible en mi sitio web (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Si quieres comprobar si los puntos son realmente uniformes en la superficie o en el interior de una bola, mira los marginales (todos deberían ser iguales, debido a la invariancia rotacional, la norma cuadrada de una muestra proyectada está distribuida en beta).

0 votos

Qué pasa con la muestra de un MultiVariateGaussian y ese vector sólo normalizarlo: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000)) y luego v = v/v.norm(10000)

9voto

BradC Puntos 1402

Tuve un problema similar (n-esfera) durante mi doctorado y uno de los "expertos" locales sugirió el muestreo de rechazo de un n-cubo. Esto, por supuesto, habría tomado la edad del universo, ya que estaba buscando n en el orden de las centenas.

El algoritmo que acabé utilizando es muy sencillo y se publicó en:

W.P. Petersen y A. Bernasconic Muestreo uniforme de una n-esfera: Método isotrópico Informe técnico, TR-97-06, Centro Suizo de Computación Científica

También tengo este artículo en mi bibliografía que no he mirado. Puede que lo encuentres útil.

Harman, R. & Lacko, V. On decompositional algorithms for uniform sampling from $n$ -esferas y $n$ -balls Journal of Multivariate Analysis, 2010

0 votos

¿es posible publicar los enlaces donde puedo encontrar el texto completo de estas referencias? gracias.

0 votos

No tengo el documento conmigo, pero esta página parece describir el algoritmo (y varios otros) mlahanas.de/Math/nsphere.htm

3 votos

Según tengo entendido, (del artículo de Petersen y Bernasconic) para una bola d-dimensional, se puede generar el radio elevando una variante U(0,1) a la potencia (1/d), y el último ángulo como una U(0,2 $\pi$ ). Los ángulos intermedios se pueden obtener como $C. asin(\sqrt[k]{u})$ , donde ${C^{-1}}$ es $$\frac{\sqrt{\pi} \Gamma(\frac{k}{2} + 0.5)}{\Gamma(\frac{k}{2} + 1)}$$ . A mí me parece que esto es bastante sencillo. Lo que me pregunto es lo siguiente: si utilizo una secuencia casi aleatoria para mis uniformes, ¿también obtendré la amabilidad en el balón?

0voto

ebryn Puntos 4037

Mi mejor opción sería generar primero un conjunto de puntos distribuidos uniformemente en un espacio bidimensional y luego proyectar esos puntos en la superficie de una esfera utilizando algún tipo de proyección.

Probablemente tendrás que mezclar la forma de generar los puntos con la forma de mapearlos. En cuanto a la generación de puntos 2D, creo que las secuencias revueltas de baja discrepancia serían un buen punto de partida (es decir, una secuencia de Sobol revuelta), ya que suelen producir puntos que no están "agrupados". No estoy tan seguro sobre qué tipo de mapeo utilizar, pero Woflram apareció el Proyección gnonómica ... así que tal vez eso podría funcionar?

MATLAB tiene una implementación decente de secuencias de baja discrepancia que puede generar utilizando q = sobolset(2) y revolver usando q = scramble(q) . También hay una caja de herramientas de mapeo en MATLAB con un montón de diferentes funciones de proyección que podrías utilizar en caso de que no quisieras codificar el mapeo y los gráficos tú mismo.

1 votos

¿puede alguna de estas proyecciones conservar la uniformidad de la aleatoriedad? De nuevo, ¿cómo puedo comprobar si la distribución final de estos puntos está realmente distribuida uniformemente en la superficie de la esfera? Gracias.

0 votos

Lo siento, estaba hablando hipotéticamente... Creo que las funciones de mapeo en MATLAB te permitirían comprobarlo ya que tienen algunas visualizaciones incorporadas. Si no es así, también encontré un buen sitio web que habla de cómo generar puntos distribuidos uniformemente en una esfera en 3D usando cosas como ángulos aleatorios, etc. Tienen algo de código C allí también. Echa un vistazo

3 votos

Los puntos aleatorios uniformes en una proyección gnomónica no serán uniformes en la esfera, porque la gnomónica no es de igual área. La proyección propuesta por Henry $(\lambda, \phi)$ --> $(\lambda, \sin(\phi))$ (de longitud-latitud a un rectángulo en $\mathbb{R}^2$ ), es igual-área.

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