Wie kann ich gleichmäßig verteilte Punkte auf einem Kreis erzeugen?

8

Ich möchte 450 Datenpunkte in R erzeugen. Es gibt drei verschiedene Sätze von jeweils 150, die in einem kreisförmigen Band mit unterschiedlichen Radien (bei 1, 2,8 und 5) verteilt sind.

Insbesondere möchte ich die erste Grafik auf Seite 546 der Elemente des statistischen Lernens reproduzieren. Geben Sie hier die Bildbeschreibung ein

Ich wäre sehr dankbar für die Unterstützung im R-Code, der diese Daten generieren könnte.

Vielen Dank!

Carl
quelle
Siehe zB Lovisolo, da Silva. Gleichmäßige Verteilung von Punkten auf einer Hyperkugel mit Anwendungen zur Vektor-Bitebenencodierung . Der Artikel enthält keinen fertigen Code, sondern den Algorithmus. Wenn Sie das PDF nicht finden können, schreiben Sie mir eine E-Mail.
ttnphns
Das einheitliche Generieren von Punkten auf einer Kugel wird unter stats.stackexchange.com/questions/7977/… beschrieben . Die Methode verallgemeinert direkt auf alle anderen Dimensionen. Der Titel dieser Frage scheint jedoch wenig oder gar nichts mit der Frage selbst zu tun zu haben, die eine gleichmäßige Verteilung auf dem Kreis zusammen mit dem additiven "Gaußschen Rauschen" in radialer Richtung erfordert . Ich habe daher den Titel bearbeitet, um "Hypersphäre" in "Kreis" zu ändern.
whuber

Antworten:

11

Im Fall eines Kreises reicht es aus, einen gleichmäßigen Winkel auf zu erzeugen und dann den Radius bestimmen, was auch immer gewünscht wird. Wenn Sie kartesische statt polare Koordinaten möchten, ist und .θ[0,2π)rx=rcosθy=rsinθ

Eine wirklich einfache Möglichkeit, zufällige Punkte aus einer gleichmäßigen Verteilung einer d-Kugel (einer Hypersphäre in einem Raum beliebiger Dimension mit Oberfläche der Dimension ) zu erzeugen, besteht darin, multivariate Standardnormalen zu erzeugen und skalieren Sie dann nach ihrem Abstand vom Ursprung:d+1dXiNd+1(0,I)

Yi=Xi/||Xi||,

woist die euklidische Norm .||.||

In R erzeugen wir auf der Oberfläche einer (2-) Kugel:

x <- matrix(rnorm(300),nc=3)
y <- x/sqrt(rowSums(x^2))
head(y)
           [,1]        [,2]       [,3]
[1,]  0.9989826 -0.03752732 0.02500752
[2,] -0.1740810  0.08668104 0.98090887
[3,] -0.7121632 -0.70011994 0.05153283
[4,] -0.5843537 -0.49940138 0.63963192
[5,] -0.7059208  0.20506946 0.67795451
[6,] -0.6244425 -0.70917197 0.32733262

head(rowSums(y^2))
[1] 1 1 1 1 1 1

Hier sind diese Daten aus zwei leicht unterschiedlichen Blickwinkeln:

3D-Diagramme gleichmäßig verteilter Daten auf der Kugel

Sie können dann auf einen beliebigen anderen Radius skalieren.

In niedrigen Dimensionen gibt es schnellere Möglichkeiten, aber wenn Ihr normaler Zufallszahlengenerator relativ schnell ist, ist er in höheren Dimensionen ziemlich gut.

Auf CRAN gibt es mehrere Pakete für zirkuläre Statistiken, einschließlich CircStatsund circular. Es gibt wahrscheinlich etwas auf CRAN, das gleichmäßige Verteilungen auf n-Kugeln für n> 1 erzeugt, aber ich weiß es nicht.

Glen_b -Reinstate Monica
quelle
Dies ist der erste Schritt des Ansatzes, der in dem Artikel verwendet wird, auf den ich in meinem obigen Kommentar verweise. Die Autoren verwenden 3 Stufen: 1) Generieren Sie sehr viele normale Datenpunkte und skalieren Sie sie auf einen Einheitsradius neu. 2) Verwenden Sie k-means Clustering, um die vielen Punkte durch die k Poins zu ersetzen, die Sie zum Kacheln der Hypersphäre benötigen. Die Kacheln sind bisher nahezu einheitlich. 3) Wenden Sie die spezielle Verschiebung auf jeden Punkt an, um eine nahezu exakte Gleichmäßigkeit zu erzielen. Ich habe diesen Algorithmus einmal codiert, aber in SPSS, nicht in R.
ttnphns
Ich denke, die Schritte 2 und 3 sind nützlich, wenn Sie ein gutes Netz auf der Kugel erzeugen möchten , aber nicht für die Erzeugung zufälliger Punkte ... [@Glen_b nette Antwort! ]
Elvis
@ttnphns Ich habe die Frage gestellt, ob es sich um Punkte handelt, die eine gleichmäßige Verteilung über die Oberfläche haben, und nicht um Punkte, bei denen die Punkte nahezu gleichmäßig verteilt sind.
Glen_b -State Monica
Aber ich habe verstanden, dass das OP darum gebeten hat: wirklich einheitliche, regelmäßige, gleichmäßig verteilte Fliesen. Zufällige Daten sind alles andere als einheitlich.
ttnphns
1
Ja natürlich. Zur Disambiguierung ist es immer ratsam zu sagen, "von einer gleichmäßigen / normalen" Verteilung zu kommen, anstatt zweifelhaft "eine gleichmäßige / normale" Verteilung zu haben.
ttnphns