Me pregunto cómo generar puntos uniformemente distribuidos en la superficie de la esfera de la unidad tridimensional. Además, después de generar esos puntos, ¿cuál es la mejor manera de visualizar y verificar si son realmente uniformes en la superficie ?
random-generation
Qiang Li
fuente
fuente
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
y luegov = v/v.norm(10000)
Respuestas:
Un método estándar es generar tres normales estándar y construir un vector unitario a partir de ellas. Es decir, cuando y , entonces es uniforme distribuido en la esfera. Este método también funciona bien para esferas dimensionales.λ 2 = X 2 1 + X 2 2 + X 2 3 ( X 1 / λ , X 2 / λ , X 3 / λ ) dXi∼N(0,1) λ2=X21+X22+X23 (X1/λ,X2/λ,X3/λ) d
En 3D puede usar el muestreo de rechazo: dibuje desde una distribución uniforme hasta que la longitud de sea menor o igual a 1, luego, 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 = 1.91. En dimensiones más altas, el número esperado de ensayos aumenta tanto que rápidamente se vuelve impracticable. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) 2 3 / ( 4 π / 3 )Xi [−1,1] (X1,X2,X3) 23/(4π/3)
Hay muchas formas de verificar la uniformidad . Una forma ordenada, aunque algo computacionalmente intensiva, es con la función K de Ripley . El número esperado de puntos dentro de la distancia (3D Euclidiana) de cualquier ubicación en la esfera es proporcional al área de la esfera dentro de la distancia , que es igual a . Al calcular todas las distancias entre puntos, puede comparar los datos con este ideal.ρ π ρ 2ρ ρ πρ2
Los principios generales de la construcción de gráficos estadísticos sugieren que una buena manera de hacer la comparación es trazar los residuos estabilizados por varianza contra donde es el más pequeño de las distancias mutuas y . La trama debe estar cerca de cero. (Este enfoque no es convencional).i = 1 , 2 , … , n ( n - 1 ) / 2 = m d [ i ] i th e i = 2 √ei(d[i]−ei) i=1,2,…,n(n−1)/2=m d[i] ith ei=2i/m−−−√
Aquí hay una imagen de 100 dibujos independientes de una distribución esférica uniforme obtenida con el primer método:
Aquí está la gráfica de diagnóstico de las distancias:
La escala y sugiere que estos valores están todos cerca de cero.
Aquí está la acumulación de 100 de estos gráficos para sugerir qué desviaciones de tamaño podrían ser indicadores significativos de falta de uniformidad:
(Estas parcelas se parecen mucho a los puentes brownianos ... puede haber algunos descubrimientos teóricos interesantes que acechan aquí).
Finalmente, aquí está el diagrama de diagnóstico para un conjunto de 100 puntos aleatorios uniformes más otros 41 puntos distribuidos uniformemente solo en el hemisferio superior:
En relación con la distribución uniforme, muestra una disminución significativa en las distancias entre puntos promedio a un rango de un hemisferio. Eso 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 que el otro. (Una prueba de chi-cuadrado más simple haría esto con más potencia si supiera de antemano qué hemisferio probar de los infinitos posibles).
fuente
Aquí hay un código R bastante simple
Es muy simple ver en la construcción que y por lo tanto pero si necesita ser probado entoncesx2+y2=1−z2 x2+y2+z2=1
y fácil de probar que cada uno de e están distribuidos uniformemente en ( obviamente es) conx y [−1,1] z
Claramente, dado un valor de , e se distribuyen uniformemente alrededor de un círculo de radio y esto se puede probar observando la distribución del arcotangente de su relación. Pero dado que tiene la misma distribución marginal que y como , una afirmación similar es cierta para cualquier par, y esto también se puede probar.z x y 1−z2−−−−−√ z x y
Si aún no está convencido, los siguientes pasos serían observar una rotación arbitraria en 3-D o cuántos puntos cayeron dentro de un ángulo sólido dado, pero eso comienza a complicarse más, y creo que es innecesario.
fuente
Si desea muestrear puntos distribuidos uniformemente en la esfera 3D (es decir, la superficie de una bola 3D), utilice un rechazo simple o el método de Marsaglia (Ann. Math. Statist., 43 (1972), págs. 645– 646). Para dimensiones bajas, la relación de rechazo es bastante baja.
Si desea generar puntos aleatorios a partir de esferas y bolas de dimensiones superiores, entonces depende del propósito y la escala de la simulación. Si no desea realizar simulaciones grandes, utilice el método de Muller (Commun. ACM, 2 (1959), págs. 19–20) o su versión "ball" (consulte el documento de Harman & Lacko citado anteriormente). Es decir:
para obtener una muestra distribuida uniformemente en una esfera n (superficie) 1) generar X a partir de la distribución normal estándar n-dimensional 2) dividir cada componente de X por la norma euclidiana de X
para obtener una muestra distribuida uniformemente en una bola n (interior) 1) generar X a partir de la distribución normal estándar (n + 2) -dimensional 2) dividir cada componente de X por la norma euclidiana de X y tomar solo los primeros n componentes
Si desea realizar simulaciones grandes, debe 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 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 desea verificar, si sus puntos son verdaderamente uniformes en la superficie o en el interior de una pelota, observe los márgenes (todos deberían ser iguales, debido a la invariancia rotacional, la norma al cuadrado de una muestra proyectada es beta distribuida).
fuente
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
y luegov = v/v.norm(10000)
¡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 viendo n en el orden de los cientos.
El algoritmo que terminé usando es muy simple y publicado en:
WP Petersen y A. Bernasconic Muestreo uniforme de una esfera n: Informe técnico del método isotrópico, TR-97-06, Centro suizo de informática científica
También tengo este artículo en mi bibliografía que no he visto. Lo podrías encontrar útil.
Harman, R. y Lacko, V. Sobre algoritmos de descomposición para muestreo uniforme de esferas y bolas Journal of Multivariate Analysis, 2010n n
fuente
He tenido este problema antes, y aquí hay una alternativa que encontré,
En cuanto a la distribución en sí, la fórmula que encontré que funciona decentemente es usar coordenadas polares (en realidad uso una variación de coordenadas poler que se desarrolló), luego convertir a coordenadas cartesianas.
El radio es, por supuesto, el radio de la esfera en la que está trazando. Luego tiene el segundo valor para el ángulo en el plano, seguido del tercer valor, que es el ángulo por encima o por debajo de ese plano.
Para obtener una distribución decente, suponga que U es un número aleatorio distribuido uniformemente, r es radio, a es la segunda coordenada polar yb es la tercera coordenada polar,
a = U * 360 b = U + U-1 y luego convertir a cartesiano a través de x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)
Recientemente encontré lo siguiente que es mejor matemáticamente hablando, a = 2 (pi) * U b = cos ^ -1 (2U-1)
En realidad, no es muy diferente de mi fórmula original, aunque la mía es en grados frente a radianes.
Esta versión reciente supuestamente puede usarse para hiperesferas, aunque no se mencionó cómo lograrla.
Aunque compruebo visualmente la uniformidad mediante el método bastante barato de hacer mapas para Homeworld 2 y luego "jugar" esos mapas. De hecho, debido a que los mapas están hechos con scripts lua, puedes construir tu fórmula directamente en el mapa y así verificar múltiples muestreos sin salir del juego. Quizás no sea científico, pero es un buen método para ver visualmente los resultados.
fuente
Aquí está el pseudocódigo:
En pytorch:
No entiendo esto lo suficientemente bien, pero Whuber me dijo que:
también es correcto, es decir, el muestreo de una normal univariada para cada coordenada.
fuente
Mi mejor conjetura 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á que mezclar y combinar la forma en que genera los puntos con la forma en que los asigna. En términos de la generación de generación de puntos 2D, creo que las secuencias codificadas de baja discrepancia serían un buen lugar para comenzar (es decir, una secuencia codificada de Sobol) ya que generalmente produce puntos que no están "agrupados". No estoy tan seguro sobre qué tipo de mapeo usar, pero Woflram apareció la proyección gnonómica ... ¿entonces tal vez eso podría funcionar?
MATLAB tiene una implementación decente de secuencias de baja discrepancia que puede generar usando
q = sobolset(2)
y codificar usandoq = scramble(q)
. También hay una caja de herramientas de mapeo en MATLAB con un montón de diferentes funciones de proyección que puede usar en caso de que no quiera codificar el mapeo y los gráficos usted mismo.fuente