Bagaimana cara menghasilkan poin yang terdistribusi secara merata dalam bola unit 3-d?


11

Saya telah memposting pertanyaan sebelumnya , ini terkait tetapi saya pikir lebih baik memulai utas lainnya. Kali ini, saya bertanya-tanya bagaimana cara menghasilkan titik yang terdistribusi secara merata di dalam unit sphere 3-d dan bagaimana memeriksa distribusi secara visual dan statistik juga? Saya tidak melihat strategi yang diposting di sana secara langsung dapat ditransfer ke situasi ini.


4
Teknik-teknik dalam pertanyaan sebelumnya berlaku langsung setelah Anda mengamati bahwa jumlah titik dalam jarak asal harus sebanding dengan . Jadi jika Anda menghasilkan seragam variate independen di bersama dengan titik pada permukaan bola, skala oleh melakukan trik. r 3 u [ 0 , 1 ] w w u 1 / 3rr3u[0,1]wwu1/3
whuber

@whuber: mungkin saya hanya tidak mendapatkan esensi dari teknik sebelumnya. Biarkan saya mencoba apa yang Anda gambarkan. Selain itu, apa cara untuk memeriksa keseragaman di sini lagi?
Qiang Li

2
Fungsi @Qiang Ripley's K dan uji chi-squared. Anda juga dapat memeriksa keseragaman proyeksi radial dari titik-titik pada permukaan bola, keseragaman kubus dengan panjang titik, dan kemandirian keduanya.
whuber

Bagi saya, tidak begitu jelas apa arti "terdistribusi secara seragam" ... Dan mungkin upaya untuk mendefinisikannya secara otomatis akan membuat algoritma pembuatan (=

@ MBB, saya pikir untuk mendefinisikan istilah, kita perlu memiliki pdf dari . fR,Θ,Φ(r,θ,ϕ)=r2
Qiang Li

Jawaban:


14

Cara termudah adalah dengan mengambil titik sampel secara seragam dalam hypercube yang sesuai dan membuang yang tidak terletak di dalam bola. Dalam 3D, ini seharusnya tidak terjadi sesering itu, sekitar 50% dari waktu. (Volume hypercube adalah 1, volume bola adalah )43πr3=0.523...


+1. Ini adalah salah satu teknik yang direkomendasikan oleh FAQ comp.graphics.algorithms "Uniform random points on sphere".
David Cary

1
Bagaimana jika kita ingin melakukan itu untuk ? n>100
ares

2
Ini disebut "metode penolakan." Sementara bekerja dengan baik dalam tiga dimensi, dengan dua puluh tujuh dimensi, hanya satu dalam satu triliun poin terletak pada 27-bola dan bukan pada sisa 27-kubus, sehingga metode penolakan tidak menggeneralisasi dengan baik. Saya menyebutkan ini karena saya saat ini membutuhkan sampel secara seragam dalam sebuah bola berukuran 2.440 dimensi.
Reb.Cabin

13

Anda juga dapat melakukan ini dalam koordinat bola, dalam hal ini tidak ada penolakan. Pertama Anda menghasilkan jari-jari dan dua sudut secara acak, kemudian Anda menggunakan rumus transisi untuk memulihkan , dan ( , , ).y z x = r sin θ cos ϕ y = r dosa θ sin ϕ z = r cos θxyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

Anda menghasilkan tunggal antara dan . Jari-jari dan kemiringan tidak seragam. Probabilitas bahwa suatu titik berada di dalam bola jari-jari adalah sehingga fungsi kerapatan probabilitas adalah . Anda dapat dengan mudah memeriksa bahwa akar kubik dari variabel seragam memiliki distribusi yang persis sama, jadi ini adalah bagaimana Anda dapat menghasilkan . Probabilitas bahwa suatu titik terletak dalam kerucut bola yang didefinisikan oleh kecenderungan adalah atau jika0 2 π r θ r r 3 r 3 r 2 rϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2 . Jadi kepadatan adalah . Anda dapat memeriksa bahwa minus arccosine dari variabel seragam memiliki kepadatan yang tepat.θsin(θ)/2

Atau lebih sederhana, kita dapat mensimulasikan kosinus dari secara seragam antara dan .θ11

Dalam R ini akan terlihat seperti yang ditunjukkan di bawah ini.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

Dalam proses menulis dan mengedit jawaban ini, saya menyadari bahwa solusinya kurang sepele daripada yang saya kira.

Saya berpikir bahwa metode termudah dan paling efisien secara komputasi adalah mengikuti metode @ whuber untuk menghasilkan pada unit sphere seperti yang ditunjukkan pada posting ini dan skala mereka dengan .r(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
Ini adalah jawaban yang jauh lebih baik karena kurangnya penolakan. Dalam ruang berdimensi tinggi, sampel penolakan bisa sangat mahal karena probabilitas penerimaan yang rendah.
kingledion

2
Bit kode terakhir dapat diadaptasi ke dimensi yang lebih tinggi, katakanlah d. Untuk ini, ganti semua instance 3oleh d.
gui11aume

0

Menurut pendapat saya, opsi termudah yang juga menggeneralisasi ke bola dimensi yang lebih tinggi (yang bukan kasus koordinat bola dan apalagi kasus sampel penolakan) adalah untuk menghasilkan titik acak yang merupakan produk dari dua variabel acak mana adalah variabel acak Gaussian (yaitu isotropik, yaitu menunjuk ke segala arah secara seragam) dinormalisasi sehingga terletak pada bola dan yang merupakan variabel acak seragam dalam terhadap kekuatan , menjadi dimensi data, menjaga radius.P = N / | | N | | U 1 / n N U [ 0 , 1 ] 1 / n nPP=N/||N||U1/nNU[0,1]1/nn

Dan lagi!


2
Radius yang terdistribusi secara merata tidak akan memberikan titik seragam di bola ...
kjetil b halvorsen

1
Benar. Anda harus menyesuaikan sedikit distribusi variabel untuk memperhitungkan daerah kepadatan lebih rendah / lebih tinggi. U
Jean-Luc Bouchot
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.