Comment puis-je générer des points uniformément répartis sur un cercle?

11

Je cherche à générer 450 points de données en R. Il y a trois ensembles distincts 150 chacun répartis dans une bande circulaire avec des rayons différents (à 1, 2,8 et 5).

En particulier, je cherche à reproduire le premier graphique à la p546 de The Elements of Statistical Learning. entrez la description de l'image ici

Je serais très reconnaissant pour une aide dans le code R qui pourrait générer ces données.

Merci!

Carl
la source
Voir par exemple Lovisolo, da Silva. Distribution uniforme des points sur une hyper-sphère avec applications au codage vectoriel sur plan de bits . Il n'y a pas de code prêt dans l'article, mais l'algorithme. Si vous ne trouvez pas le pdf, envoyez-moi un e-mail.
ttnphns
1
La génération uniforme de points sur une sphère est décrite sur stats.stackexchange.com/questions/7977/… ; la méthode se généralise directement à toutes les autres dimensions. Mais le titre de cette question semble avoir peu ou rien à voir avec la question elle-même, qui demande une distribution uniforme sur le cercle ainsi qu'un "bruit gaussien" additif dans la direction radiale. J'ai donc modifié le titre pour changer "hypersphère" en "cercle".
whuber

Réponses:

12

Dans le cas d'un cercle, il suffit de générer un angle uniforme, θ, sur [0,2π) puis faites le rayon, r, tout ce qui est souhaité. Si vous voulez des coordonnées cartésiennes plutôt que polaires,x=rcosθ et y=rsinθ.

Un moyen vraiment simple de générer des points aléatoires à partir d'une distribution uniforme d'une sphère d (une hypersphère dans un espace de dimension arbitraire d+1, avec surface de dimension d), consiste à générer des normales standard multivariées XiNd+1(0,I), puis l'échelle en fonction de leur distance par rapport à l'origine:

Yi=Xi/||Xi||,

||.||est la norme euclidienne .

En R, générons à la surface d'une (2-) sphère:

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

Voici ces données sous deux angles légèrement différents:

Tracés 3D de données distribuées uniformes sur la sphère

Vous pouvez ensuite vous adapter à n'importe quel autre rayon que vous souhaitez.

Dans les petites dimensions, il existe des moyens plus rapides, mais si votre générateur de nombres aléatoires normal est raisonnablement rapide, il est assez bon dans les dimensions supérieures.

Il existe plusieurs packages sur CRAN pour les statistiques circulaires, y compris CircStatset circular. Il y a probablement quelque chose sur CRAN qui génère des distributions uniformes sur n-sphères pour n> 1, mais je ne le sais pas.

Glen_b -Reinstate Monica
la source
Il s'agit de la première étape de l'approche utilisée dans l'article auquel je fais référence dans mon commentaire ci-dessus. Les auteurs utilisent 3 étapes: 1) générer de très nombreux points de données normaux et les redimensionner à un rayon unitaire; 2) utilisez le clustering k-means pour remplacer les nombreux points aux k poins dont vous avez besoin pour paver l'hypersphère, le carrelage est jusqu'à présent presque uniforme; 3) appliquer le décalage spécial à chaque point pour arriver à une uniformité presque exacte. J'ai codé une fois cet algorithme, mais dans SPSS, pas dans R.
ttnphns
Je pense que les étapes 2 et 3 sont utiles lorsque vous souhaitez générer un bon maillage sur la sphère, mais pas pour la génération de points aléatoires ... [@Glen_b belle réponse! ]
Elvis
@ttnphns J'ai pris la question de demander des points ayant une distribution uniforme sur la surface, plutôt que quelque chose où les points sont proches d'un espacement uniforme.
Glen_b -Reinstate Monica
Mais j'ai compris que le PO demandait ceci: un carrelage vraiment uniforme, régulier et régulièrement espacé. Les données aléatoires sont loin d'être vraiment uniformes.
ttnphns
1
Oui bien sûr. Pour la désambiguïsation, il est toujours sage de dire "provenant d'une distribution uniforme / normale" au lieu de douteux "ayant une distribution uniforme / normale".
ttnphns