¿Cómo generar puntos distribuidos uniformemente en la bola unitaria 3-d?


11

He publicado una pregunta anterior , esto está relacionado, pero creo que es mejor comenzar otro hilo. Esta vez, me pregunto cómo generar puntos distribuidos uniformemente dentro de la esfera de la unidad tridimensional y cómo verificar la distribución visual y estadísticamente también. No veo las estrategias publicadas allí directamente transferibles a esta situación.


44
Las técnicas en la pregunta anterior se aplican directamente una vez que observa que el número de puntos dentro de la distancia del origen debe ser proporcional a . Por lo tanto, si genera una variante uniforme independiente en junto con un punto en la superficie de la esfera, la escala por hace el truco. rr3u[0,1]wwu1/3
whuber

@whuber: tal vez simplemente no obtuve la esencia de las técnicas anteriores. Déjame probar lo que describiste. Además, ¿cuáles son las formas de verificar la uniformidad aquí nuevamente?
Qiang Li

2
Función K de @Qiang Ripley y pruebas de chi-cuadrado. También puede verificar la uniformidad de la proyección radial de los puntos en la superficie de la esfera, la uniformidad del cubo de las longitudes de los puntos y la independencia de esos dos.
whuber

Para mí, no es tan obvio lo que significa "distribuido uniformemente" ... Y probablemente un intento de definirlo creará automáticamente un algoritmo generador (=

@mbq, creo que para definir el término, necesitamos tener un pdf de . fR,Θ,Φ(r,θ,ϕ)=r2
Qiang Li

Respuestas:


14

La forma más fácil es muestrear puntos uniformemente en el hipercubo correspondiente y descartar aquellos que no se encuentran dentro de la esfera. En 3D, esto no debería suceder tan a menudo, aproximadamente el 50% del tiempo. (El volumen del hipercubo es 1, el volumen de la esfera es )43πr3=0.523...


+1. Esta es una de las técnicas recomendadas por las preguntas frecuentes de comp.graphics.algorithms "Puntos aleatorios uniformes en la esfera".
David Cary

1
¿Qué pasa si queremos hacer eso para ? n>100
ares

2
Esto se llama el "método de rechazo". Mientras trabaja bien en tres dimensiones, en veintisiete dimensiones, solo uno en un billón de puntos se encuentra en la bola 27 y no en el resto del cubo 27, por lo que el método de rechazo no se generaliza bien. Menciono esto porque actualmente necesito muestras uniformemente en una bola de 2.440 dimensiones.
Reb.Cabin

13

También puede hacer esto en coordenadas esféricas, en cuyo caso no hay rechazo. Primero genera el radio y los dos ángulos al azar, luego usa la fórmula de transición para recuperar , y ( , , ).xyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

Generas unifomly entre y . Sin embargo, el radio y la inclinación no son uniformes. La probabilidad de que un punto esté dentro de la bola de radio es por lo que la función de densidad de probabilidad de es . Puede verificar fácilmente que la raíz cúbica de una variable uniforme tiene exactamente la misma distribución, por lo que así es como puede generar . La probabilidad de que un punto se encuentre dentro de un cono esférico definido por la inclinación es o siϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2 . Entonces la densidad es . Puede verificar que menos el arcocoseno de una variable uniforme tenga la densidad adecuada.θsin(θ)/2

O más simplemente, podemos simular el coseno de uniformemente entre y .θ11

En R esto se vería como se muestra a continuación.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

Al escribir y editar esta respuesta, me di cuenta de que la solución es menos trivial de lo que pensaba.

Creo que el método más fácil y computacionalmente más eficiente es seguir el método de @ whuber para generar en la esfera de la unidad como se muestra en esta publicación y escalarlos con .(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
Esta es una respuesta mucho mejor debido a la falta de rechazo. En espacios de alta dimensión, el muestreo de rechazo puede ser muy costoso debido a la baja probabilidad de aceptación.
kingledion 01 de

2
El último bit de código se puede adaptar a una dimensión superior, por ejemplo d. Para esto, reemplace todas las instancias de 3by d.
gui11aume

0

En mi opinión, la opción más fácil que también se generaliza a bolas de dimensiones superiores (que no es el caso de las coordenadas esféricas y aún menos el caso del muestreo de rechazo) es generar puntos aleatorios que son productos de dos variables aleatorias donde es una variable aleatoria gaussiana (es decir, isotrópica, es decir, apunta uniformemente en cualquier dirección) normalizada de modo que se encuentra en la esfera y que es una variable aleatoria uniforme en a la potencia , siendo la dimensionalidad de los datos, cuidando el radio.P = N / | El | N | El | U 1 / n N U [ 0 , 1 ] 1 / n nPP=N/||N||U1/nNU[0,1]1/nn

Et voilà!


2
Un radio uniformemente distribuido no dará un punto uniforme en la pelota ...
kjetil b halvorsen

1
Cierto. Tendría que adaptar un poco la distribución de la variable para tener en cuenta las regiones de menor / mayor densidad. U
Jean-Luc Bouchot
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.