J'ai posté une question précédente , c'est lié mais je pense qu'il vaut mieux commencer un autre fil. Cette fois, je me demande comment générer des points uniformément répartis à l'intérieur de la sphère d'unité 3D et comment vérifier la distribution visuellement et statistiquement aussi? Je ne vois pas les stratégies qui y sont affichées directement transférables à cette situation.
random-generation
Qiang Li
la source
la source
Réponses:
Le moyen le plus simple consiste à échantillonner uniformément les points dans l'hypercube correspondant et à éliminer ceux qui ne se trouvent pas dans la sphère. En 3D, cela ne devrait pas se produire si souvent, environ 50% du temps. (Le volume de l'hypercube est 1, le volume de la sphère est )43πr3=0.523...
la source
Vous pouvez également le faire en coordonnées sphériques, auquel cas il n'y a pas de rejet. Vous générez d'abord le rayon et les deux angles au hasard, puis vous utilisez la formule de transition pour récupérer , et ( , , ).x y z x=rsinθcosϕ y=rsinθsinϕ z=rcosθ
Vous générez uniformément entre et . Le rayon et l'inclinaison ne sont cependant pas uniformes. La probabilité qu'un point se trouve à l'intérieur de la boule de rayon est donc la fonction de densité de probabilité de est . Vous pouvez facilement vérifier que la racine cubique d'une variable uniforme a exactement la même distribution, c'est ainsi que vous pouvez générer . La probabilité qu'un point se trouve à l'intérieur d'un cône sphérique défini par l'inclinaison est ou siϕ 0 2π r θ r r3 r 3r2 r θ (1−cosθ)/2 1−(1−cos(−θ))/2 θ>π/2 . La densité est donc . Vous pouvez vérifier que moins l'arc cosinus d'une variable uniforme a la bonne densité.θ sin(θ)/2
Ou plus simplement, nous pouvons simuler le cosinus de uniformément entre et .θ −1 1
Dans R, cela ressemblerait à ce qui suit.
Au cours de l'écriture et de l'édition de cette réponse, j'ai réalisé que la solution est moins triviale que je ne le pensais.
Je pense que la méthode la plus simple et la plus efficace sur le plan informatique est de suivre la méthode de @ whuber pour générer sur la sphère unitaire comme indiqué dans ce post et les mettre à l'échelle avec .(x,y,z) r
la source
d
. Pour cela, remplacez toutes les instances de3
pard
.À mon avis, l'option la plus simple qui se généralise également aux boules de dimensions supérieures (ce qui n'est pas le cas des coordonnées sphériques et encore moins le cas de l'échantillonnage de rejet) est de générer des points aléatoires qui sont le produit de deux variables aléatoires où est une variable aléatoire gaussienne (c'est-à-dire isotrope, c'est-à-dire pointant dans n'importe quelle direction uniformément) normalisée de sorte qu'elle se trouve sur la sphère et qui est une variable aléatoire uniforme dans à la puissance , étant la dimensionnalité des données, en prenant soin du rayon.P = N / | | N | | ∗ U 1 / n N U [ 0 , 1 ] 1 / n nP P=N/||N||∗U1/n N U [0,1] 1/n n
Et voilà!
la source