Comment générer des points uniformément répartis sur la surface de la sphère unité 3-d?

68

Je me demande comment générer des points uniformément répartis sur la surface de la sphère d'unité 3D? Aussi, après avoir généré ces points, quel est le meilleur moyen de visualiser et de vérifier s’ils sont vraiment uniformes sur la surface ?x2+y2+z2=1

Qiang Li
la source
Si par uniforme vous voulez dire "régulier", il n'y a pas moyen de le faire en dehors de = 2, 4, 6, 8, 12, 20.n
Marcos
1
qu'est-ce qui ne va pas avec un échantillon provenant d'un MultiVariateGaussian et ce vecteur vient de le normaliser: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))et ensuite v = v/v.norm(10000)
Pinocchio

Réponses:

72

Une méthode standard consiste à générer trois normales normales et à en construire un vecteur unitaire. C'est-à-dire que lorsque et , alors est uniforme distribué sur la sphère. Cette méthode fonctionne bien pour sphères de dimension, aussi.XiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

En 3D, vous pouvez utiliser l'échantillonnage de rejet: dessinez partir d'une distribution uniforme jusqu'à ce que la longueur de soit inférieure ou égale à 1, puis - comme avec la méthode précédente - normaliser le vecteur en unité de longueur. Le nombre d'essais prévus par point sphérique est égal à = 1,91. Dans les dimensions supérieures, le nombre d'essais escompté devient si important que cela devient rapidement irréalisable. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) 2 3 / ( 4 π / 3 )Xi[1,1](X1,X2,X3)23/(4π/3)

Il y a plusieurs façons de vérifier l'uniformité . La fonction K de Ripley est un moyen astucieux, même s’il est quelque peu intensif en calcul . Le nombre attendu de points à l'intérieur d'une distance (euclidienne 3D) de n'importe quel emplacement de la sphère est proportionnel à l'aire de la sphère à une distance égale à . En calculant toutes les distances entre points, vous pouvez comparer les données à cet idéal.ρ π ρ 2ρρπρ2

Les principes généraux de construction des graphiques statistiques suggèrent un bon moyen de faire la comparaison: tracer les résidus stabilisés par la variance rapport à où est le plus petit des distances mutuelles et . L'intrigue devrait être proche de zéro. (Cette approche est non conventionnelle.)i = 1 , 2 , ... , n ( n - 1 ) / 2 = m d [ i ] i e e i = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ithei=2i/m

Voici une image de 100 tirages indépendants d'une distribution sphérique uniforme obtenue avec la première méthode:

100 points sphériques uniformes

Voici l'intrigue de diagnostic des distances:

Parcelle de diagnostic

L'échelle y suggère que ces valeurs sont toutes proches de zéro.

Voici l'accumulation de 100 de ces graphiques pour suggérer quels écarts de taille pourraient en réalité être des indicateurs significatifs de non-uniformité:

Valeurs simulées

(Ces parcelles ressemblent énormément à des ponts browniens ... il y a peut-être d'intéressantes découvertes théoriques qui se cachent ici.)

Enfin, voici l’intrigue de diagnostic pour un ensemble de 100 points aléatoires uniformes plus 41 autres points uniformément répartis dans l’hémisphère supérieur uniquement:

Valeurs non uniformes simulées

Par rapport à la distribution uniforme, il montre une diminution significative des distances moyennes entre les points jusqu'à un hémisphère. Cela en soi n'a pas de sens, mais l'information utile ici est que quelque chose n'est pas uniforme à l'échelle d'un hémisphère. En effet, ce graphique détecte facilement qu'un hémisphère a une densité différente de celle de l'autre. (Un test chi-carré plus simple ferait cela avec plus de puissance si vous saviez à l'avance quel hémisphère il faut tester sur une infinité d'infinis.)

whuber
la source
@ Whuber: très sympa! merci beaucoup pour votre post! " est uniformément réparti sur la sphère." Où puis-je trouver des références sur sa preuve, ou est-ce simplement prouvable? (X1/λ,X2/λ,X3/λ)
Qiang Li
23
@ Qiang, voici l'essence de la preuve: Soit où désigne la matrice d'identité . Ensuite, pour toute matrice orthogonale , . Par conséquent, la distribution de est invariante selon les rotations. Laissez et notez que pour tout orthogonale . Puisque est invariant des rotations, est également , et puisque presque sûrement, il doit être uniformément réparti sur la sphère. XN(0,In)Inn×nQQXN(0,In)XY Q = Q X /Q X 2 = Q X /X 2 Q X Y Y 2 = 1Y=X/X2YQ=QX/QX2=QX/X2QXYY2=1
cardinal
3
@ Mike Non, car une distribution uniforme de la latitude ne donne pas une distribution uniforme sur la sphère. (La majeure partie de la surface de la sphère se situe à des latitudes inférieures, près de l'équateur, à l'écart des pôles. Vous avez besoin d'une distribution uniforme de .)cos ( ϕ )ϕcos(ϕ)
whuber
1
@Ahsan Les matrices orthogonales formant un groupe transitif de transformations de la sphère préservant l'aire, la distribution est uniforme sur le sous-ensemble de la sphère de la forme : mais c'est la sphère entière. X/||X||2
whuber
1
@Cesar "Distribution uniforme" (sur la sphère).
whuber
19

Voici un code R assez simple

n     <- 100000                  # large enough for meaningful tests
z     <- 2*runif(n) - 1          # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi      # uniform on [-pi, pi]
x     <- sin(theta)*sqrt(1-z^2)  # based on angle
y     <- cos(theta)*sqrt(1-z^2)     

Il est très simple de voir d'après la construction que et donc mais si cela doit être testé, alorsx2+y2=1z2x2+y2+z2=1

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

et facile à tester que et sont uniformément répartis sur ( est évidemment) avecxy[1,1]z

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

Clairement, étant donné une valeur de , et sont uniformément répartis autour d'un cercle de rayon et ceci peut être testé en regardant la distribution de l'arctangente de leur rapport. Mais puisque a la même distribution marginale que et que , une déclaration similaire est vraie pour toute paire, et cela aussi peut être testé. zxy1z2zxy

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

Si elles ne sont toujours pas convaincues, les prochaines étapes consisteront à examiner une rotation arbitraire à trois dimensions ou le nombre de points correspondant à un angle solide donné, mais cela commence à devenir plus compliqué et, à mon avis, inutile.

Henri
la source
Je me demande simplement si votre méthode de génération de points (x, y, z) est essentiellement la même que la méthode de whuber?
Qiang Li
3
Non, ce n'est pas le cas: Whuber utilise trois nombres aléatoires alors que j'en utilise deux. Le mien est un cas particulier de "générer un point sur avec une densité appropriée [proportionnelle à ]] puis descendre une dimension". Ici, commodément, puisqu'il s'agit formellement d'une 2 sphères . [1,1](1z2)n/21n=2
Henry
3
Ou, plus généralement, générez des points uniformes sur la carte à l'aide de toute projection égale (la vôtre étant cylindrique égale), puis projetez en arrière. (+1)
whuber
@ Whuber: En effet. Offtopic, mais pour toute personne intéressée , j'ai une sélection interactive des projections cartographiques du monde ici , dont certaines sont superficie égale
Henry
2
C'est à peu près l'approche standard utilisée en infographie, basée sur le théorème de Hat-Box d' Archimedes
Edward KMETT le
10

Si vous voulez échantillonner des points uniformément répartis sur la sphère 3D (c'est-à-dire la surface d'une boule 3D), utilisez un simple rejet, ou utilisez la méthode de Marsaglia (Ann. Math. Statist., 43 (1972), p. 645– 646). Pour les petites dimensions, le taux de rejet est assez faible.

Si vous souhaitez générer des points aléatoires à partir de sphères et de billes de dimensions supérieures, cela dépend de l'objectif et de l'échelle de la simulation. Si vous ne souhaitez pas effectuer de grandes simulations, utilisez la méthode de Muller (Commun. ACM, 2 (1959), p. 19–20) ou sa version "à boule" (voir le document de Harman & Lacko cité ci-dessus). C'est:

pour obtenir un échantillon uniformément distribué sur une n-sphère (surface) 1) générer X à partir de la distribution normale standard n-dimensionnelle 2) diviser chaque composant de X par la norme euclidienne de X

pour obtenir un échantillon uniformément réparti sur une n-boule (intérieur) 1) générer X à partir de (n + 2) -dimensional distribution normale standard 2) diviser chaque composant de X par la norme euclidienne de X et ne prendre que les n premiers composants

Si vous souhaitez effectuer de grandes simulations, vous devez alors rechercher des méthodes plus spécialisées. Sur demande, je peux vous envoyer le document de Harman et Lacko sur les méthodes de distribution conditionnelle, qui fournit la classification et les généralisations de certains algorithmes mentionnés dans cette discussion. Le contact est disponible sur mon site Web (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Si vous voulez vérifier si vos points sont vraiment uniformes à la surface ou à l’intérieur d’une balle, regardez les marginaux (tous devraient le même, en raison de l’invariance de rotation, la norme au carré d’un échantillon projeté est distribuée bêta).

V Lacko
la source
qu'est-ce qui ne va pas avec un échantillon provenant d'un MultiVariateGaussian et ce vecteur vient de le normaliser: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))et ensuite v = v/v.norm(10000)
Pinocchio
8

J'ai eu un problème similaire (n-sphère) au cours de ma thèse et l'un des «experts» locaux a suggéré l'échantillonnage de rejet à partir d'un n-cube! Ceci, bien sûr, aurait pris l'âge de l'univers puisque je regardais n dans l'ordre des centaines.

L'algorithme que j'ai fini par utiliser est très simple et publié dans:

WP Petersen et A. Bernasconic Échantillonnage uniforme dans une n-sphère: méthode, méthode isotrope, Rapport technique, TR-97-06, Centre suisse de l'informatique scientifique

J'ai aussi cet article dans ma bibliographie que je n'ai pas encore regardé. Vous pouvez peut-être le trouver utile.

Harman, R. & Lacko, V. Algorithmes de décomposition pour l'échantillonnage uniforme de sphères et de billes Journal of Multivariate Analysis, 2010nn

emakalic
la source
est-il possible d'afficher les liens où je peux trouver le texte intégral de ces références? Merci.
Qiang Li
Je n'ai pas le papier sur moi, mais cette page semble décrire l'algorithme (et plusieurs autres) mlahanas.de/Math/nsphere.htm
emakalic
3
Si je comprends bien, (d'après le document de Petersen et Bernasconic) pour une balle à dimension D, on peut générer le rayon en augmentant une variable U (0,1) à la puissance (1 / d), et le dernier angle en tant que U (0,2 ) variable. Les angles intermédiaires peuvent être obtenus sous la forme , où est . Pour moi, cela semble plutôt simple. La question que je me pose est la suivante: si j’utilise une séquence quasi aléatoire pour mes uniformes, aurai-je également la gentillesse de la balle? C . a s i n ( k πC - 1 C.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit
3

J'ai déjà eu ce problème auparavant, et voici une alternative que j'ai trouvée,

En ce qui concerne la distribution elle-même, la formule que j’ai trouvée qui fonctionne décemment consiste à utiliser des coordonnées polaires (j’utilise en fait une variation des coordonnées de pales développées), puis à les convertir en coordonnées cartésiennes.

Le rayon est bien sûr le rayon de la sphère sur laquelle vous tracez. Ensuite, vous avez la deuxième valeur d'angle sur le plan plat, suivie de la troisième valeur qui est l'angle au-dessus ou au-dessous de ce plan.

Pour obtenir une distribution décente, supposons que U soit un nombre aléatoire uniformément réparti, r représente le rayon, a est la deuxième coordonnée polaire et b est la troisième coordonnée polaire,

a = U * 360 b = U + U-1 puis converti en cartésien via x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

J'ai récemment trouvé ce qui suit qui est meilleur mathématiquement parlant, a = 2 (pi) * U b = cos ^ -1 (2U-1)

Pas très différent de ma formule originale en fait, bien que le mien soit en degrés vs radians.

Cette version récente est censée être utilisée pour les hypersphères, bien qu'aucune mention n'ait été faite sur la manière de l'obtenir.

Bien que je vérifie visuellement l'uniformité par la méthode plutôt peu coûteuse de créer des cartes pour Homeworld 2, puis de "jouer" ces cartes. En fait, comme les cartes sont créées avec des scripts Lua, vous pouvez intégrer votre formule directement dans la carte et ainsi vérifier plusieurs échantillonnages sans jamais quitter la partie. Peut-être pas scientifique, mais est une bonne méthode pour voir visuellement les résultats.

LaDerpieAlicorn
la source
2

Voici le pseudocode:

  1. vMultiVariateGaussian(μ,σI)
  2. v=vv

En pytorch:

v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

Je ne comprends pas assez bien cela, mais Whuber m'a dit ceci:

v = torch.normal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

est également correct, c’est-à-dire que l’échantillonnage d’une normale univariée pour chaque coordonnée.

Pinocchio
la source
0

Ma meilleure hypothèse serait de générer d'abord un ensemble de points uniformément répartis dans un espace à 2 dimensions, puis de projeter ces points sur la surface d'une sphère en utilisant une sorte de projection.

Vous devrez probablement mélanger et faire correspondre la façon dont vous générez les points avec la façon dont vous les mappez. En ce qui concerne la génération de génération de points 2D, je pense que les séquences brouillées à faible divergence seraient un bon point de départ (c’est-à-dire une séquence Sobol brouillée) car elles produisent généralement des points qui ne sont pas "groupés". Je ne suis pas aussi sûr du type de cartographie à utiliser, mais Woflram a fait apparaître la projection Gnonomic ... alors peut-être que cela pourrait fonctionner?

MATLAB a une implémentation décente de séquences à faible discordance que vous pouvez générer en utilisant q = sobolset(2)et brouiller en utilisant q = scramble(q). Il existe également une boîte à outils de mappage dans MATLAB avec un ensemble de fonctions de projection différentes que vous pouvez utiliser si vous ne souhaitez pas coder vous-même le mappage et les graphiques.

Berk U.
la source
1
L'une de ces projections peut-elle encore préserver l'uniformité du caractère aléatoire? Encore une fois, comment puis-je vérifier si la distribution finale de ces points est vraiment uniformément répartie sur la surface de la sphère? Merci.
Qiang Li
Désolé, je ne parlais que de façon hypothétique ... Je pense que les fonctions de cartographie de MATLAB vous permettraient de vérifier cela, car elles contiennent des visualisations. Sinon, j'ai aussi trouvé un site Web intéressant qui explique comment générer en 3D des points uniformément répartis sur une sphère en utilisant des angles tels que des angles aléatoires, etc. Ils contiennent également du code C. Jetez un coup d'oeil
Berk U.
3
Les points aléatoires uniformes sur une projection gnomonique ne seront pas uniformes sur la sphère, car la surface gnomonique n'est pas égale. La projection proposée par Henry, -> (de la longitude-latitude à un rectangle dans ), est égale à la surface. ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber