Wie werden gleichmäßig verteilte Punkte auf der Oberfläche der 3D-Einheitskugel erzeugt?


68

Ich frage mich, wie man gleichmäßig verteilte Punkte auf der Oberfläche der 3D-Einheitskugel erzeugt. Was ist nach dem Erzeugen dieser Punkte der beste Weg, um zu visualisieren und zu überprüfen, ob sie auf der Oberfläche wirklich einheitlich sind ?x2+y2+z2=1


Wenn mit Uniform "normal" gemeint ist, gibt es keine Möglichkeit, dies außerhalb von = 2, 4, 6, 8, 12, 20 zu tun .n
Marcos

1
Was ist los mit der Probe aus einem MultiVariateGaussian und dieser Vektor normalisieren es einfach: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))und dann v = v/v.norm(10000)
Pinocchio

Antworten:


72

Eine Standardmethode besteht darin, drei Standardnormalen zu generieren und daraus einen Einheitsvektor zu konstruieren. Das heißt, wenn und , dann ist gleichmäßig auf der Kugel verteilt. Diese Methode eignet sich auch für dimensionale Kugeln.λ 2 = X 2 1 + X 2 2 + X 2 3 ( X 1 / λ , X 2 / λ , X 3 / λ ) dXiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

In 3D können Sie die Zurückweisungsabtastung verwenden: Zeichnen Sie aus einer gleichmäßigen -Verteilung, bis die Länge von kleiner oder gleich 1 ist. Dann - genau wie bei der vorhergehenden Methode - Normalisieren Sie den Vektor auf Einheitslänge. Die erwartete Anzahl von Versuchen pro Kugelpunkt beträgt = 1,91. In höheren Dimensionen wird die erwartete Anzahl von Versuchen so groß, dass dies schnell undurchführbar wird. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) 2 3 / ( 4 & pgr; / 3 )Xi[1,1](X1,X2,X3)23/(4π/3)

Es gibt viele Möglichkeiten, die Homogenität zu überprüfen . Ein ordentlicher Weg, obwohl er etwas rechenintensiv ist, ist die K-Funktion von Ripley . Die erwartete Anzahl von Punkten innerhalb der (3D-euklidischen) Entfernung eines beliebigen Ortes auf der Kugel ist proportional zur Fläche der Kugel innerhalb der Entfernung , die gleich . Durch Berechnung aller Zwischenpunktabstände können Sie die Daten mit diesem Ideal vergleichen.ρ π ρ 2ρρπρ2

Allgemeine Prinzipien zur Erstellung statistischer Grafiken legen nahe, dass ein guter Weg zum Vergleich darin besteht, varianzstabilisierte Residuen gegen zu zeichnen wo ist der kleinste der gegenseitigen Abstände und . Die Darstellung sollte nahe Null sein. (Dieser Ansatz ist unkonventionell.)i = 1 , 2 , ... , n ( n - 1 ) / 2 = m d [ i ] i th e i = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ithei=2i/m

Hier ist ein Bild von 100 unabhängigen Zügen aus einer gleichmäßigen sphärischen Verteilung, die mit der ersten Methode erhalten wurde:

100 einheitliche Kugelpunkte

Hier ist die diagnostische Darstellung der Entfernungen:

Diagnoseplot

Die y-Skala legt nahe, dass diese Werte alle nahe bei Null liegen.

Hier ist die Anhäufung von 100 solcher Diagramme, um darauf hinzuweisen, welche Größenabweichungen tatsächlich signifikante Indikatoren für eine Uneinheitlichkeit sein könnten:

Simulierte Werte

(Diese Handlungen ähneln sehr den Brownschen Brücken ... vielleicht lauern hier einige interessante theoretische Entdeckungen.)

Schließlich ist hier die Diagnosezeichnung für einen Satz von 100 einheitlichen Zufallspunkten plus weiteren 41 Punkten, die nur auf der oberen Hemisphäre gleichmäßig verteilt sind:

Simulierte uneinheitliche Werte

Bezogen auf die gleichmäßige Verteilung zeigt sich eine signifikante Abnahme der durchschnittlichen Zwischenpunktabstände in einem Bereich von einer Hemisphäre. Das an sich ist bedeutungslos, aber die nützliche Information hier ist, dass etwas auf der Skala einer Hemisphäre ungleichmäßig ist. Tatsächlich erkennt dieses Diagramm leicht, dass eine Hemisphäre eine andere Dichte als die andere hat. (Ein einfacher Chi-Quadrat-Test würde dies mit mehr Kraft tun, wenn Sie im Voraus wüssten, welche Hemisphäre aus den unendlich vielen möglichen zu testen ist.)


@whuber: sehr schön! vielen dank für deinen post! " wird auf der Kugel verteilt." Wo finde ich Hinweise auf den Beweis, oder ist er einfach nachweisbar? (X1/λ,X2/λ,X3/λ)
Qiang Li

23
@ Qiang, hier ist die Essenz des Beweises: Sei wobei die Identitätsmatrix bezeichnet. Dann für jede orthogonale Matrix , . Daher ist die Verteilung von unter Rotationen invariant. Sei und beachte, dass für jedes orthogonale . Da für Rotationen unveränderlich ist, gilt dies auch für , und da , muss es auf der Kugel gleichmäßig verteilt sein. XN(0,In)Inn×nQQXN(0,In)XY Q = Q X /Q X 2 = Q X /X 2 Q X Y Y 2 =Y=X/X2YQ=QX/QX2=QX/X2QXYY2=1
Kardinal

3
@Mike Nein, da eine gleichmäßige Verteilung des Breitengrads keine gleichmäßige Verteilung auf der Kugel ergibt. (Der größte Teil der Kugeloberfläche befindet sich in niedrigeren Breiten nahe dem Äquator, entfernt von den Polen. Stattdessen benötigen Sie eine gleichmäßige Verteilung von .)cos ( ϕ )ϕcos(ϕ)
whuber

1
@Ahsan Da die orthogonalen Matrizen eine transitive Gruppe flächenerhaltender Transformationen der Kugel bilden, ist die Verteilung über die Teilmenge der Kugel der Form gleichmäßig : dies ist jedoch die gesamte Kugel. X/||X||2
Whuber

1
@Cesar "Gleichverteilung" (auf der Kugel).
Whuber

19

Hier ist ein ziemlich einfacher R-Code

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)     

Es ist sehr einfach aus der Konstruktion zu dass und somit aber wenn es dann getestet werden mussx 2 + y 2 + z 2 = 1x2+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

und einfach zu testen, ob und gleich verteilt sind auf ( offensichtlich) mity [ - 1 , 1 ] zxy[1,1]z

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

Wenn ein Wert von , sind und gleichmäßig um einen Kreis mit dem Radius und dies kann getestet werden, indem die Verteilung des Arcustangens ihres Verhältnisses betrachtet wird. Da jedoch die gleiche Randverteilung wie und , gilt eine ähnliche Aussage für jedes Paar, und auch dies kann getestet werden. x y zxy zxy1z2zxy

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

Wenn Sie immer noch nicht überzeugt sind, besteht der nächste Schritt darin, eine willkürliche 3-D-Rotation zu untersuchen oder zu ermitteln, wie viele Punkte in einen bestimmten Raumwinkel fallen.


Ich frage mich nur, ob Ihre Methode zur Erzeugung von Punkten (x, y, z) im Wesentlichen mit der von Whuber identisch ist.
Qiang Li

3
Nein, das ist es nicht: Whuber verwendet drei Zufallszahlen, während ich zwei benutze. Meins ist ein Sonderfall von "Erzeugen eines Punktes auf mit geeigneter Dichte [proportional zu ] und anschließendes Herunterschalten einer Dimension". Hier ist zweckmäßigerweise da dies formal eine 2-Sphäre ist . ( 1 - z 2 ) n / 2 - 1 n = 2[1,1](1z2)n/21n=2
Henry

3
Oder generell einheitliche Punkte auf der Karte mit einer Flächengleichprojektion erzeugen (Ihre ist eine zylindrische Flächengleichprojektion) und dann zurückprojizieren. (+1)
whuber

@whuber: In der Tat. Offtopic, aber für alle Interessierten Ich habe eine interaktive Auswahl von Projektionen Karte Welt hier , von denen einige die gleiche Fläche
Henry

2
Dies ist so ziemlich der Standardansatz, der in der Computergrafik verwendet wird und auf Archimedes ' Hutschachtel
Edward KMETT

10

Wenn Sie gleichmäßig auf der 3D-Kugel (dh der Oberfläche einer 3D-Kugel) verteilte Punkte abtasten möchten, verwenden Sie eine einfache Zurückweisung oder die Methode von Marsaglia (Ann. Math. Statist., 43 (1972), S. 645– 646). Bei geringen Abmessungen ist die Ausschussquote recht niedrig.

Wenn Sie zufällige Punkte aus höherdimensionalen Kugeln und Kugeln erzeugen möchten, hängt dies vom Zweck und Maßstab der Simulation ab. Wenn Sie keine umfangreichen Simulationen durchführen möchten, verwenden Sie die Methode von Müller (Commun. ACM, 2 (1959), S. 19–20) oder die "Ball" -Version (siehe das oben zitierte Dokument von Harman & Lacko). Das ist:

um eine gleichmäßig auf einer n-Kugel (Oberfläche) verteilte Probe zu erhalten 1) erzeuge X aus der n-dimensionalen Normalverteilung 2) dividiere jede Komponente von X durch die euklidische Norm von X

Um eine Probe gleichmäßig auf einer n-Kugel zu verteilen (innen) 1) Erzeuge X aus einer (n + 2) -dimensionalen Normalverteilung 2) Dividiere jede Komponente von X durch die euklidische Norm von X und nimm nur die ersten n Komponenten

Wenn Sie umfangreiche Simulationen durchführen möchten, sollten Sie speziellere Methoden untersuchen. Auf Anfrage kann ich Ihnen die Arbeit von Harman und Lacko über bedingte Verteilungsmethoden zusenden, die die Klassifizierung und Verallgemeinerung einiger in dieser Diskussion erwähnter Algorithmen enthält. Der Kontakt ist auf meiner Website verfügbar (http://www.iam.fmph.uniba.sk/ospm/Lacko).

Wenn Sie überprüfen möchten, ob Ihre Punkte auf der Oberfläche oder im Inneren einer Kugel wirklich gleichmäßig sind, sehen Sie sich die Ränder an (aufgrund der Rotationsinvarianz sollten alle gleich sein, die quadratische Norm einer projizierten Probe ist Beta-verteilt).


Was ist los mit der Probe aus einem MultiVariateGaussian und dieser Vektor normalisieren es einfach: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))und dann v = v/v.norm(10000)
Pinocchio

8

Ich hatte während meiner Promotion ein ähnliches Problem (n-Sphäre) und einer der lokalen "Experten" schlug vor, die Probenahme aus einem n-Würfel abzulehnen! Dies hätte natürlich das Zeitalter des Universums in Anspruch genommen, als ich n in der Größenordnung von Hunderten betrachtete.

Der Algorithmus, den ich verwendet habe, ist sehr einfach und wurde veröffentlicht in:

WP Petersen und A. Bernasconic Einheitliche Probenahme aus einer n-Sphäre: Isotropes Verfahren Technischer Bericht, TR-97-06, Schweizerisches Zentrum für Wissenschaftliches Rechnen

Ich habe auch dieses Papier in meiner Bibliographie, das ich nicht angeschaut habe. Vielleicht finden Sie es nützlich.

Harman, R. & Lacko, V. Über Zerlegungsalgorithmen für die gleichmäßige Probenahme aus Kugeln und Kugeln Journal of Multivariate Analysis, 2010nnn


ist es möglich, die links zu posten, wo ich den vollständigen text dieser referenzen finde? Vielen Dank.
Qiang Li

Ich habe das Papier nicht bei mir, aber diese Seite scheint den Algorithmus (und einige andere) zu beschreiben. Mlahanas.de/Math/nsphere.htm
emakalic

3
Wie ich verstehe (aus der Arbeit von Petersen und Bernasconic), kann man für eine d-dimensionale Kugel den Radius durch Erhöhen einer U (0,1) -Variable auf die (1 / d) -Power und des letzten Winkels als a erzeugen U (0,2 ) variieren. Die Zwischenwinkel kann erhalten werden , wobei ist . Für mich klingt das ziemlich einfach. Was ich mich frage, ist Folgendes: Wenn ich für meine Uniformen eine quasi zufällige Reihenfolge verwende, bekomme ich dann auch die Feinheit im Ball? C . a s i n ( k πC - 1 C.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit

3

Ich hatte dieses Problem schon einmal und hier ist eine Alternative, die ich gefunden habe:

Was die Verteilung selbst anbelangt, so ist die Formel, die ich für anständig befunden habe, Polarkoordinaten zu verwenden (ich verwende tatsächlich eine Variation der Polerkoordinaten, die sich entwickelt hat) und dann in kartesische Koordinaten zu konvertieren.

Der Radius ist natürlich der Radius der Kugel, auf die Sie zeichnen. Dann haben Sie den zweiten Wert für den Winkel auf der flachen Ebene, gefolgt vom dritten Wert, der der Winkel über oder unter dieser Ebene ist.

Um eine anständige Verteilung zu erhalten, wird angenommen, dass U eine gleichmäßig verteilte Zufallszahl ist, r der Radius ist, a die zweite Polarkoordinate ist und b die dritte Polarkoordinate ist.

a = U * 360 b = U + U-1 dann konvertieren in kartesisch über x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

Ich habe kürzlich folgendes gefunden, was mathematisch besser ist: a = 2 (pi) * U b = cos ^ -1 (2U-1)

Eigentlich nicht viel anders als meine ursprüngliche Formel, obwohl meine Grad gegen Bogenmaß ist.

Diese neuere Version kann angeblich für Hypersphären verwendet werden, obwohl nicht erwähnt wurde, wie dies erreicht werden kann.

Ich überprüfe die Einheitlichkeit jedoch visuell anhand der recht billigen Methode, Karten für Homeworld 2 zu erstellen und diese dann zu "spielen". Da die Karten mit Lua-Skripten erstellt wurden, können Sie Ihre Formel direkt in die Karte einbauen und so mehrere Samples prüfen, ohne das Spiel jemals zu verlassen. Vielleicht nicht wissenschaftlich, aber eine gute Methode, um die Ergebnisse visuell zu sehen.


2

Hier ist der Pseudocode:

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

In Pytorch:

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

Ich verstehe das nicht gut genug, aber mir wurde von whuber gesagt, dass:

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

ist auch korrekt, dh Abtastung aus einer univariaten Normalen für jede Koordinate.


0

Meine beste Vermutung wäre, zuerst eine Reihe gleichmäßig verteilter Punkte im zweidimensionalen Raum zu erzeugen und diese Punkte dann mit einer Art Projektion auf die Oberfläche einer Kugel zu projizieren.

Sie müssen wahrscheinlich die Art und Weise, wie Sie die Punkte generieren, mit der Art und Weise, wie Sie sie zuordnen, mischen und anpassen. In Bezug auf die Erzeugung von 2D-Punkten denke ich, dass verwürfelte Sequenzen mit geringer Diskrepanz ein guter Ausgangspunkt sind (dh eine verwürfelte Sobol-Sequenz), da sie normalerweise Punkte erzeugen, die nicht "zusammengeklumpt" sind. Ich bin mir nicht sicher, welche Art von Zuordnung ich verwenden soll, aber Woflram hat die Gnonomic-Projektion aufgerufen ... also könnte das vielleicht funktionieren?

MATLAB verfügt über eine anständige Implementierung von Sequenzen mit geringer Diskrepanz, die Sie mithilfe von generieren q = sobolset(2)und verschlüsseln können q = scramble(q). Es gibt auch eine Mapping-Toolbox in MATLAB mit einer Reihe verschiedener Projektionsfunktionen, die Sie verwenden können, falls Sie das Mapping und die Grafiken nicht selbst codieren möchten.


1
Kann eine dieser Projektionen die Gleichförmigkeit der Zufälligkeit bewahren? Wie kann ich erneut überprüfen, ob die endgültige Verteilung dieser Punkte wirklich gleichmäßig auf der Oberfläche der Kugel verteilt ist? Vielen Dank.
Qiang Li

Es tut mir leid, dass ich nur hypothetisch gesprochen habe ... Ich glaube, mit den Mapping-Funktionen von MATLAB können Sie dies überprüfen, da in ihnen einige Visualisierungen eingebettet sind. Wenn nicht, habe ich auch eine nette Website gefunden, auf der erklärt wird, wie man gleichmäßig verteilte Punkte auf einer Kugel in 3D mit Dingen wie zufälligen Winkeln usw. erzeugt. Sie enthalten auch C-Code.
Berk U.

3
Einheitliche zufällige Punkte auf einer gnomonischen Projektion sind auf der Kugel nicht einheitlich, da die gnomonische Fläche nicht gleich groß ist. Die von Henry vorgeschlagene Projektion -> (von Längengrad-Breitengrad zu einem Rechteck in ) ist flächengleich. ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
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.