Simulieren Sie eine gleichmäßige Verteilung auf einer Disc

24

Ich habe versucht, die Injektion von zufälligen Punkten innerhalb eines Kreises so zu simulieren, dass jeder Teil des Kreises die gleiche Wahrscheinlichkeit hat, einen Defekt zu haben. Ich habe erwartet, dass die Anzahl pro Fläche der resultierenden Verteilung einer Poisson-Verteilung folgt, wenn ich den Kreis in Rechtecke gleicher Fläche aufteile.

Da es nur erforderlich ist, Punkte innerhalb einer kreisförmigen Fläche zu platzieren, habe ich zwei gleichmäßige Zufallsverteilungen in Polarkoordinaten injiziert: (Radius) und (Polarwinkel).θRθ

Aber nach dieser Injektion bekomme ich deutlich mehr Punkte in der Mitte des Kreises als am Rand.

Bildbeschreibung hier eingeben

Was wäre der richtige Weg, um diese Injektion so über den Kreis zu führen, dass die Punkte zufällig über den Kreis verteilt sind?

Jonjilla
quelle
Diese Frage hat eine genaue Entsprechung
Aksakal

Antworten:

35

Sie möchten, dass der Anteil der Punkte gleichmäßig proportional zur Fläche und nicht zum Abstand zum Ursprung ist. Da die Fläche proportional zum Quadratabstand ist, erzeugen Sie gleichmäßige Zufallsradien und nehmen Sie deren Quadratwurzeln. Kombiniere das mit einem gleichmäßigen Polarwinkel.

Dies ist schnell und einfach zu codieren, effizient auszuführen (insbesondere auf einer parallelen Plattform) und generiert genau die vorgeschriebene Anzahl von Punkten.

Beispiel

Dies ist der RArbeitscode zur Veranschaulichung des Algorithmus.

n <- 1e4
rho <- sqrt(runif(n))
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

Bildbeschreibung hier eingeben

whuber
quelle
3

Ablehnungsabtastung kann verwendet werden. Dies bedeutet, dass wir Proben aus der 2D-Gleichverteilung nehmen und Proben auswählen können, die den Disc-Bedingungen entsprechen.

Hier ist ein Beispiel.

x=runif(1e4,-1,1)
y=runif(1e4,-1,1)

d=data.frame(x=x,y=y)
disc_sample=d[d$x^2+d$y^2<1,]
plot(disc_sample)

Bildbeschreibung hier eingeben

Haitao Du
quelle
3
Dies ist eine gute Alternative zum Ansatz des OP. Einfach und effizient. Es geht jedoch nicht wirklich um die Frage, wie die Polarkoordinatenmethode geändert werden kann, um gleichmäßig verteilte Variablen zu erzeugen. Warum interessiert es uns vielleicht? Aufgrund der Implikationen: Sobald Sie wissen, wie gleichmäßig verteilte Punkte in Polarkoordinaten erzeugt werden, können Sie mit der Ablehnungsabtastung (und anderen bekannten Methoden) in Polarkoordinaten Proben aus Regionen entnehmen, deren Abtastung in kartesischen Koordinaten möglicherweise zu kompliziert ist (denken Sie an Hypozykloiden) , zum Beispiel).
Whuber
1
π/4
@whuber danke, dass du mich aufgeklärt hast, indem du meine Antwort kommentierst!
Haitao Du
3

Ich gebe Ihnen eine allgemeine n-dimensionale Antwort, die natürlich auch für zweidimensionale Fälle funktioniert. In drei Dimensionen ist ein Analogon einer Scheibe ein Volumen einer festen Kugel (Kugel).

Es gibt zwei Ansätze, die ich diskutieren werde. Eine davon würde ich als "präzise" bezeichnen , und in R erhalten Sie eine vollständige Lösung. Die zweite, die ich als heuristisch bezeichne , ist nur die Idee, es wird keine vollständige Lösung bereitgestellt.

"Präzise" Lösung

Meine Lösung basiert auf den Arbeiten von Marsaglia und Müller . Grundsätzlich geschieht dies so, dass der auf seine Norm normierte Gaußsche Vektor die gleichmäßig verteilten Punkte auf einer d-dimensionalen Hypersphäre liefert:

Bildbeschreibung hier eingeben

d1/d

n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")

Bildbeschreibung hier eingeben

Hier ist ein Code-Snippet für eine 3D-Hülle, dh eine feste Kugel:

library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk

d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)

scatterplot3d(x[,1], x[,2], x[,3])

Bildbeschreibung hier eingeben

Heuristischer Ansatz

Vn(R)=πn2Γ(n2+1)Rn
Rn

ich=1dxich2<R2

Die Lösung, die ich vorschlage, besteht darin, die Zurückweisungsabtastung mit einer Überabtastung der Punkte in der Nähe des Zentrums zu verwenden. Es stellt sich heraus, dass, wenn Sie eine der kartesischen Koordinaten der zufälligen einheitlichen Stichprobe aus dem Inneren des Balls beobachten, dessen Verteilung zu einem Gaußschen Wert mit der Varianz konvergiert1d+2

Aksakal
quelle
@Silverfish, du hast recht, ich habe die Sprache
korrigiert
@Silverfish, aufgrund der Verwendung von Gaußschen Variablen ist es langsam, kann aber im hochdimensionalen Fall schneller sein als eine einfache Rückweisungsabtastung, was für viele nicht offensichtlich ist, obwohl es sich um ein anderes Thema handelt
Aksakal,
1/d,d
@whuber, ich war Copy-Paste, korrigierte einen Tippfehler auf Cube-Power. Wenn wir Gauß'sches verwenden, ist die Stichprobenentnahme zur Zurückweisung nicht besser. Wir müssten also etwas Glockenförmiges verwenden, das schneller als Gauß'sches ist. Sie haben Recht
Aksakal,
0

Hier ist eine alternative Lösung in R:

n <- 1e4
## r <- seq(0, 1, by=1/1000)
r <- runif(n)
rho <- sample(r, size=n, replace=T, prob=r)
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

Bildbeschreibung hier eingeben

Q_Li
quelle
4
Können Sie diese Antwort in einfachem Englisch erklären? Wir sind keine echte Code-Hilfeseite. Von Code-Antworten sollte abgeraten werden.
gung - Wiedereinsetzung von Monica
5
01r <- seq(0, 1, by=1/10)
1
@whuber Danke für den Hinweis. Es ist eigentlich meine Hauptidee der Lösung. Mein Ansatz war es, viele gleichmäßige Kreise mit unterschiedlichen Radien zu erzeugen, und für jeden Kreis ist die Anzahl der Punkte proportional zur Länge seines Radius. Daher ist bei einer Einheitslänge von Kreisen mit unterschiedlichen Radien die Anzahl der Punkte gleich. Um die diskrete Natur zu vermeiden, könnten wir eine Probe rvon Uniform (0,1) nehmen.
Q_Li