¿Cómo puedo generar puntos distribuidos uniformemente en un círculo?

11

Estoy buscando generar 450 puntos de datos en R. Hay tres conjuntos distintos 150 de cada uno distribuidos en una banda circular con diferentes radios (en 1, 2.8 y 5).

En particular, estoy buscando reproducir el primer gráfico en p546 de Los elementos del aprendizaje estadístico. ingrese la descripción de la imagen aquí

Estaría muy agradecido por alguna ayuda en el código R que podría generar estos datos.

¡Gracias!

Carl
fuente
Ver, por ejemplo, Lovisolo, da Silva. Distribución uniforme de puntos en una hiperesfera con aplicaciones para codificación de plano de bits de vector . No hay un código listo en el artículo, sino el algoritmo. Si no puede encontrar el pdf, envíeme un correo electrónico.
ttnphns
1
La generación de puntos de manera uniforme en una esfera se describe en stats.stackexchange.com/questions/7977/… ; El método generaliza directamente a todas las demás dimensiones. Pero el título de esta pregunta parece tener poco o nada que ver con la pregunta misma, que pide una distribución uniforme en el círculo junto con el aditivo "ruido gaussiano" en la dirección radial. Por lo tanto, edité el título para cambiar "hiperesfera" a "círculo".
whuber

Respuestas:

12

En el caso de un círculo, es suficiente generar un ángulo uniforme, θ, en [0,2π) y luego hacer el radio, r, lo que se desee. Si quieres cartesiano, en lugar de coordenadas polares,x=rcosθ y y=rsinθ.

Una forma realmente fácil de generar puntos aleatorios a partir de una distribución uniforme, una esfera d (una hiperesfera en un espacio de dimensión arbitraria d+1, con superficie de dimensión d), es generar normales estándar multivariantes XiNd+1(0,I), y luego escalar por su distancia desde el origen:

Yi=Xi/||Xi||,

dónde ||.||es la norma euclidiana .

En R, generemos en la superficie de una esfera (2-):

x <- matrix(rnorm(300),nc=3)
y <- x/sqrt(rowSums(x^2))
head(y)
           [,1]        [,2]       [,3]
[1,]  0.9989826 -0.03752732 0.02500752
[2,] -0.1740810  0.08668104 0.98090887
[3,] -0.7121632 -0.70011994 0.05153283
[4,] -0.5843537 -0.49940138 0.63963192
[5,] -0.7059208  0.20506946 0.67795451
[6,] -0.6244425 -0.70917197 0.32733262

head(rowSums(y^2))
[1] 1 1 1 1 1 1

Aquí están esos datos desde dos ángulos ligeramente diferentes:

Gráficos 3D de datos distribuidos uniformes en la esfera

Luego puede escalar a cualquier otro radio que desee.

En dimensiones bajas, hay formas más rápidas, pero si su generador normal de números aleatorios es razonablemente rápido, es bastante bueno en dimensiones más altas.

Hay varios paquetes en CRAN para estadísticas circulares, incluidos CircStatsy circular. Probablemente haya algo en CRAN que genere distribuciones uniformes en n-esferas para n> 1, pero no lo sé.

Glen_b -Reinstate a Monica
fuente
Este es el primer paso del enfoque que se utiliza en el artículo al que me refiero en mi comentario anterior. Los autores usan 3 etapas: 1) generar muchos puntos de datos normales y reescalarlos a un radio unitario; 2) use la agrupación k-means para reemplazar los muchos puntos a los k poins que necesita para enlosar la hiperesfera, hasta ahora el mosaico es casi uniforme; 3) aplique el turno especial a cada punto para llegar a una uniformidad casi exacta. Una vez codifiqué ese algoritmo, pero en SPSS, no en R.
ttnphns
Creo que los pasos 2 y 3 son útiles cuando quieres generar una buena malla en la esfera, pero no para generar puntos aleatorios ... [@Glen_b ¡buena respuesta! ]
Elvis
@ttnphns Tomé la pregunta de preguntar acerca de los puntos que tienen una distribución uniforme sobre la superficie, en lugar de algo donde los puntos están casi espaciados uniformemente.
Glen_b -Reinstate Monica
Pero entendí que el OP pidió esto: mosaico realmente uniforme, regular y uniformemente espaciado. Los datos aleatorios están lejos de ser realmente uniformes.
ttnphns
1
Sí, por supuesto. Para la desambiguación, siempre es prudente decir "viniendo de una distribución uniforme / normal" en lugar de dudosa distribución "tener una distribución uniforme / normal".
ttnphns