Wie werden gleichmäßig verteilte Punkte in der 3-D-Einheitskugel erzeugt?


11

Ich habe eine vorherige Frage gestellt , dies ist verwandt, aber ich denke, es ist besser, einen anderen Thread zu starten. Dieses Mal frage ich mich, wie man gleichmäßig verteilte Punkte innerhalb der 3D-Einheitskugel erzeugt und wie man die Verteilung auch visuell und statistisch überprüft. Ich sehe die dort veröffentlichten Strategien nicht direkt auf diese Situation übertragbar.


4
Die Techniken in der vorherigen Frage gelten direkt, wenn Sie feststellen, dass die Anzahl der Punkte innerhalb des Abstands r des Ursprungs proportional zu r3 . Wenn Sie also ein unabhängiges einheitliches erzeugen variate u in [0,1] zusammen mit einem Punkt w auf der Oberfläche der Kugel, Skalierung w von u1/3 den Trick.
whuber

@whuber: Vielleicht habe ich einfach nicht die Essenz der vorherigen Techniken verstanden. Lassen Sie mich versuchen, was Sie beschrieben haben. Wie kann man hier die Einheitlichkeit noch einmal überprüfen?
Qiang Li

2
@ Qiang Ripleys K-Funktion und Chi-Quadrat-Tests. Sie können auch die Gleichmäßigkeit der radialen Projektion der Punkte auf der Kugeloberfläche, die Gleichmäßigkeit des Würfels der Länge der Punkte und die Unabhängigkeit dieser beiden Punkte überprüfen.
whuber

Für mich ist es nicht so offensichtlich, was "gleichmäßig verteilt" bedeutet ... Und wahrscheinlich wird ein Versuch, es zu definieren, automatisch einen generierenden Algorithmus erzeugen (=

@mbq, ich denke, um den Begriff zu definieren, brauchen wir ein PDF von . fR,Θ,Φ(r,θ,ϕ)=r2
Qiang Li

Antworten:


14

Am einfachsten ist es, Punkte im entsprechenden Hyperwürfel gleichmäßig abzutasten und diejenigen zu verwerfen, die nicht in der Kugel liegen. In 3D sollte dies in etwa 50% der Fälle nicht so häufig vorkommen. (Das Volumen des Hyperwürfels beträgt 1, das Volumen der Kugel beträgt )43πr3=0.523...


+1. Dies ist eine der Techniken, die in den häufig gestellten Fragen zu comp.graphics.algorithms "Einheitliche zufällige Punkte auf der Kugel"
David Cary

1
Was ist, wenn wir das für ? n>100
Ares

2
Dies wird als "Ablehnungsmethode" bezeichnet. Während in drei Dimensionen gut gearbeitet wird, liegt in 27 Dimensionen nur einer von einer Billion Punkten in der 27-Kugel und nicht im Rest des 27-Würfels, sodass die Ablehnungsmethode nicht gut verallgemeinert wird. Ich erwähne dies, weil ich derzeit Proben in einer Kugel mit 2.440 Abmessungen einheitlich benötige.
Reb.Cabin

13

Sie können dies auch in sphärischen Koordinaten tun. In diesem Fall erfolgt keine Zurückweisung. Zuerst erzeugen Sie den Radius und die beiden Winkel zufällig, dann verwenden Sie die Übergangsformel, um , y und z wiederherzustellen ( x = r sin θ cos ϕ , y = r sin θ sin ϕ , z = r cos θ ).xyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

You generate ϕ unifomly between 0 and 2π. The radius r and the inclination θ are not uniform though. The probability that a point is inside the ball of radius r is r3 so the probability density function of r is 3r2. You can easily check that the cubic root of a uniform variable has exactly the same distribution, so this is how you can generate r. The probability that a point lies within a spherical cone defined by inclination θ is (1cosθ)/2 or 1(1cos(θ))/2 if θ>π/2. So the density θ is sin(θ)/2. You can check that minus the arccosine of a uniform variable has the proper density.

Or more simply, we can simulate the cosine of θ uniformly beteen 1 and 1.

In R this would look as shown below.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

In the course of writing and editing this answer, I realized that the solution is less trivial than I thought.

I think that the easiest and computationally most efficient method is to follow @whuber's method to generate (x,y,z) on the unit sphere as shown on this post and scale them with r.

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
This is a much better answer due to the lack of rejection. In high dimensional spaces, rejection sampling can be very costly due to the low probability of acceptance.
kingledion

2
The last bit of code can be adapted to higher dimension, say d. For this, replace all instances of 3 by d.
gui11aume

0

In my opinion, the easiest option which also generalizes to higher dimensional balls (which is not the case of spherical coordinates and even less the case of rejection sampling) is to generate random points P that are products of two random variables P=N/||N||U1/n where N is a Gaussian random variable (i.e. isotropic, i.e. pointing in any direction uniformly) normalized so that it lies on the sphere and U which is a uniform random variable in [0,1] to the power 1/n, n being the dimensionality of the data, taking care of the radius.

Et voilà!


2
A uniformly distributed radius will not give a uniform point in the ball ...
kjetil b halvorsen

1
True. You'd need to adapt a little bit the distribution of the U variable to take into account for lower / higher density regions.
Jean-Luc Bouchot
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.