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 ?
random-generation
Qiang Li
quelle
quelle
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
und dannv = v/v.norm(10000)
Antworten:
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 / λ ) dXi∼N(0,1) λ2=X21+X22+X23 (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(n−1)/2=m d[i] ith ei=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:
Hier ist die diagnostische Darstellung der Entfernungen:
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:
(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:
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.)
quelle
Hier ist ein ziemlich einfacher R-Code
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=1−z2 x2+y2+z2=1
und einfach zu testen, ob und gleich verteilt sind auf ( offensichtlich) mity [ - 1 , 1 ] zx y [−1,1] 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 √z x y zxy1−z2−−−−−√ z x y
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.
quelle
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).
quelle
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
und dannv = v/v.norm(10000)
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, 2010nn n
quelle
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.
quelle
Hier ist der Pseudocode:
In Pytorch:
Ich verstehe das nicht gut genug, aber mir wurde von whuber gesagt, dass:
ist auch korrekt, dh Abtastung aus einer univariaten Normalen für jede Koordinate.
quelle
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önnenq = 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.quelle