11 votos

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

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 (a 1, 2,8 y 5).

En particular, quiero reproducir el primer gráfico de la página 546 de The Elements of Statistical Learning. enter image description here

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

Gracias.

0 votos

Véase, por ejemplo, Lovisolo, da Silva. Distribución uniforme de puntos en una hiperesfera con aplicaciones a la codificación vectorial de planos de bits . No hay ningún código listo en el artículo, sino el algoritmo. Si no puedes encontrar el pdf, envíame un correo electrónico.

1 votos

La generación de puntos uniformes en una esfera se describe en stats.stackexchange.com/questions/7977/ el método se 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 en sí, que pide una distribución uniforme en el círculo junto con el "ruido gaussiano" aditivo en la dirección radial. Por eso he editado el título para cambiar "hiperesfera" por "círculo".

12voto

AdamSane Puntos 1825

En el caso de un círculo, basta con generar un ángulo uniforme, $\theta$ , en $[0,2\pi)$ y luego hacer el radio, $r$ , lo que se desee. Si quiere coordenadas cartesianas, en lugar de polares, $x=r\cos\theta$ y $y=r\sin\theta$ .

Una forma realmente fácil de generar puntos aleatorios a partir de una distribución uniforme una d-esfera (una hiperesfera en un espacio de dimensión arbitraria $d+1$ con superficie de dimensión $d$ ), es generar normales estándar multivariadas $X_i\sim N_{d+1}(0,I)$ y luego escalar por su distancia al origen:

$$Y_i=X_i/||X_i||\,,$$

donde $||.||$ es el Norma euclidiana .

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

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:

3d plots of uniform distributed data on sphere

Luego puedes escalar a cualquier otro radio que desees.

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

Existen varios paquetes en CRAN para las estadísticas circulares, entre ellos CircStats y circular . Probablemente haya algo en CRAN que genere distribuciones uniformes en n-esferas para n>1, pero no lo conozco.

0 votos

Este es el primer paso del enfoque que se utiliza en el artículo al que me refiero en mi comentario anterior. Los autores utilizan 3 etapas: 1) generan muchos puntos de datos normales y los reescalan a un radio unitario; 2) usan el clustering de k-means para reemplazar los muchos puntos a los k puntos que se necesitan para embaldosar la hiperesfera, el embaldosado es casi uniforme hasta ahora; 3) aplican el desplazamiento especial a cada punto para llegar a la uniformidad casi exacta. Una vez codifiqué ese algoritmo, pero en SPSS, no en R.

0 votos

Creo que los pasos 2 y 3 son útiles cuando se quiere generar una buena malla en la esfera, pero no para la generación de puntos aleatorios... [ @Glen_b ¡buena respuesta! ]

0 votos

@ttnphns Tomé la pregunta para preguntar acerca de los puntos que tienen un distribución uniforme sobre la superficie, en lugar de algo en lo que los puntos están casi uniformemente espaciados.

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