Bir disk üzerinde düzgün bir dağılım simüle edin


24

Bir dairenin içine rastgele noktaların enjeksiyonunu simüle etmeye çalışıyordum, öyle ki dairenin herhangi bir kısmı aynı kusura sahip olma olasılığına sahip. Çemberi eşit alanlı dikdörtgenlere böldüğümde ortaya çıkan dağılımın alan sayısının Poisson dağılımını takip etmesini beklerdim.

Sadece dairesel bir alana yerleştirme noktaları gerektirdiğinden, kutupsal koordinatlara iki düzgün rasgele dağılım enjekte ettim: (yarıçap) ve θ (kutup açısı).Rθ

Ancak bu enjeksiyondan sonra, dairenin merkezinde kenara kıyasla daha fazla puan alıyorum.

görüntü tanımını buraya girin

Noktaları rastgele olarak dağıtılacak şekilde daire boyunca bu enjeksiyonu gerçekleştirmenin doğru yolu ne olurdu?


Bu sorunun Geometri forumunda tam bir benzerliği var: math.stackexchange.com/questions/87230/…
Aksakal

Yanıtlar:


35

Noktaların oranının menşe mesafesinden ziyade alanla eşit orantılı olmasını istersiniz . Alan kare kareyle orantılı olduğundan, düzgün rastgele yarıçaplar üret ve kareköklerini al. Bunu düzgün bir kutup açısı ile birleştir.

Bu, kodlamanın hızlı ve basittir, yürütmede verimli (özellikle paralel bir platformda) ve tam olarak öngörülen puan sayısını oluşturur.

Örnek

Bu Ralgoritmayı göstermek için çalışan koddur.

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")

görüntü tanımını buraya girin


3

Reddetme Örneklemesi kullanılabilir. Bunun anlamı 2B düzgün dağılımdan örnekleme yapabilir ve disk koşulunu sağlayan örnekleri seçebiliriz.

İşte bir örnek.

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)

görüntü tanımını buraya girin


3
Bu OP tarafından uygulanan yaklaşıma iyi bir alternatiftir. Basit ve verimli. Bununla birlikte, düzgün bir şekilde dağıtılmış değişkenler üretmek için kutupsal koordinat yönteminin nasıl değiştirileceği ile ilgili olan soruyu gerçekten ele almıyor. Neden umursayalım ki? Bunun nedeni, kutupsal koordinatlarda eşit dağılımlı noktalar oluşturmayı öğrendiğinizde , kartezyen koordinatlarda (hiposikloidleri düşünmek için numune olarak yasaklanmış olabilecek bölgelerden örnek almak için ) kutup koordinatlarında reddetme örneklemesini (ve diğer bilinen yöntemleri) kullanabilirsiniz. , Örneğin).
whuber

1
π/4

@whuber cevabımı yorum yaparak beni eğitmek için teşekkürler!
Haitao Du

3

Elbette, iki boyutlu bir durumda da işe yarayan genel bir n-boyutlu cevap vereceğim. Üç boyutta bir diskin analoğu, bir katı topun (küre) hacmidir.

Tartışacağım iki yaklaşım var. Onlardan birine "kesin" diyeceğim ve R'de bununla birlikte tam bir çözüm elde edeceğim. İkincisi buluşsal olarak adlandırıyorum ve bu sadece bir fikir, tam bir çözüm bulunmuyor.

"Hassas" çözüm

Benim çözümüm Marsaglia ve Muller'ın çalışmalarına dayanıyor . Temel olarak, Gaussian vektörünün normuna göre normalize olması, size d boyutlu bir hiper kürede eşit olarak dağılmış noktaları vermesi için gerçekleşir:

görüntü tanımını buraya girin

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")

görüntü tanımını buraya girin

İşte 3d durum için bir kod pasajı, yani sağlam bir top:

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])

görüntü tanımını buraya girin

Sezgisel yaklaşım

Vn(R,)=πn2Γ(n2+1)R,n
R,n

Σben=1dxben2<R,2

1d+2


@ Silverfish, haklısın, dili düzelttim
Aksakal

@Silverfish, Gauss değişkenlerinin kullanımı nedeniyle yavaştır, ancak yüksek boyutta bir durumda basit bir reddetme örneklemesinden daha hızlı olabilir, fakat farklı bir konu olmasına rağmen, çoğu kişi için açık değildir
Aksakal,

1/d,d

@whuber, kopya yapıştırıyordum, küp gücündeki yazım hatası düzeltildi. Gaussian kullanırsak reddetme örneklemesi daha iyi olmaz, bu yüzden Gaussian'dan daha hızlı bir çan şeklini kullanmak zorundayız, haklısınız
Aksakal

0

İşte alternatif bir çözümdür 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")

görüntü tanımını buraya girin


4
Bu cevabı basit İngilizce olarak açıklayabilir misiniz? Gerçekten bir kod yardım sitesi değiliz ve yalnızca kod yanıtları önerilmemelidir.
gung - Reinstate Monica

5
Bu çözüm merak uyandırıyor. Arsa iyi görünmesine rağmen maalesef pek doğru değil. Bunun nedeni, numunedeki yarıçapları, ile 1 arasında eşit aralıklarla ayrılmış bir değerler dizisi ile sınırlandırmasıdır.01 . Bu amaçlanan dağıtımla aynı değildir. Özellikle, tekil : bir PDF bile yok! İkna olmadıysanız r <- seq(0, 1, by=1/10), ayrık doğasını daha net görmek için onunla tekrar test edin .
whuber

1
@whuber Buna dikkat çektiğiniz için teşekkürler. Aslında çözüm benim ana fikrim. Benim yaklaşımım, değişen yarıçaplarda birçok tek biçimli daire oluşturmaktı ve her daire için nokta sayısı yarıçapının uzunluğuyla orantılıydı. Bu nedenle, farklı yarıçaplara sahip olan bir birimler uzunluğunda, noktaların sayısı aynıdır. Ayrık doğayı önlemek için r, Üniforma'dan (0,1) örnek alabiliriz .
Q_Li
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.