Saya bertanya-tanya bagaimana cara menghasilkan titik yang terdistribusi secara merata di permukaan unit sphere 3-d? Juga setelah menghasilkan poin-poin itu, apa cara terbaik untuk memvisualisasikan dan memeriksa apakah mereka benar-benar seragam di permukaan ?
random-generation
Qiang Li
sumber
sumber
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
dan kemudianv = v/v.norm(10000)
Jawaban:
Metode standar adalah untuk menghasilkan tiga standar normal dan membangun vektor satuan dari mereka. Yaitu, ketika dan λ 2 = X 2 1 + X 2 2 + X 2 3 , maka ( X 1 / λ , X 2 / λ , X 3 / λ ) didistribusikan secara seragam pada bola. Metode ini juga berfungsi dengan baik untuk bidang d- dimensi.Xsaya∼ N( 0 , 1 ) λ2= X21+ X22+ X23 (X1/λ,X2/λ,X3/λ) d
Dalam 3D, Anda dapat menggunakan sampel penolakan: gambar dari distribusi seragam [ - 1 , 1 ] hingga panjang ( X 1 , X 2 , X 3 ) kurang dari atau sama dengan 1, lalu - sama seperti dengan metode sebelumnya - menormalkan vektor ke satuan panjang. Jumlah percobaan yang diharapkan per titik bola sama dengan 2 3 / ( 4 π / 3 ) = 1,91. Dalam dimensi yang lebih tinggi, jumlah uji coba yang diharapkan menjadi begitu besar sehingga dengan cepat menjadi tidak praktis.Xi [−1,1] (X1,X2,X3) 23/(4π/3)
Ada banyak cara untuk memeriksa keseragaman . Cara yang rapi, meskipun agak intensif secara komputasi, adalah dengan fungsi K Ripley . Jumlah titik yang diharapkan dalam (3D Euclidean) jarak dari setiap lokasi di bola sebanding dengan luas bola dalam jarak ρ , yang sama dengan π ρ 2 . Dengan menghitung semua jarak antar titik, Anda dapat membandingkan data dengan yang ideal ini.ρ ρ πρ2
Prinsip umum pembuatan grafik statistik menyarankan cara yang baik untuk membuat perbandingan adalah dengan memplot residual yang distabilkan varians terhadap i = 1 , 2 , … , n ( n - 1 ) / 2 = m di mana d [ i ] adalah i th terkecil dari saling jarak dan e i = 2 √ei(d[i]−ei) i=1,2,…,n(n−1)/2=m d[i] ith . Plot harus mendekati nol. (Pendekatan ini tidak konvensional.)ei=2i/m−−−√
Berikut adalah gambar dari 100 undian independen dari distribusi bola seragam yang diperoleh dengan metode pertama:
Berikut adalah plot diagnostik jarak:
Skala y menunjukkan bahwa nilai-nilai ini semuanya mendekati nol.
Berikut ini adalah akumulasi dari 100 plot seperti itu untuk menyarankan ukuran penyimpangan apa yang sebenarnya merupakan indikator signifikan dari ketidakseragaman:
(Plot-plot ini terlihat sangat mengerikan seperti jembatan Brown) ... mungkin ada beberapa penemuan teoretis yang menarik yang bersembunyi di sini.)
Akhirnya, inilah plot diagnostik untuk satu set 100 titik acak yang seragam ditambah 41 titik yang hanya didistribusikan secara seragam di belahan bumi bagian atas saja:
Relatif terhadap distribusi seragam, ini menunjukkan penurunan yang signifikan dalam jarak antar titik rata-rata ke kisaran satu belahan bumi. Itu sendiri tidak ada artinya, tetapi informasi yang berguna di sini adalah bahwa ada sesuatu yang tidak seragam pada skala satu belahan bumi. Efeknya, plot ini siap mendeteksi bahwa satu belahan memiliki kepadatan yang berbeda dari yang lain. (Tes chi-square yang lebih sederhana akan melakukan ini dengan lebih banyak kekuatan jika Anda tahu sebelumnya belahan mana yang harus diuji dari banyak kemungkinan yang tak terhingga.)
sumber
Berikut adalah beberapa kode R yang agak sederhana
Sangat sederhana untuk melihat dari konstruksi bahwa dan tetapi jika perlu diuji makax 2 + y 2 + z 2 = 1x2+y2=1−z2 x2+y2+z2=1
dan mudah untuk menguji bahwa masing-masing dan terdistribusi secara merata pada ( jelas adalah) dengany [ - 1 , 1 ] zx y [−1,1] z
Jelas, diberi nilai , dan yang terdistribusi secara seragam di sekitar lingkaran jari-jari dan ini dapat diuji dengan melihat distribusi arang penentu rasio mereka. Tetapi karena memiliki distribusi marginal yang sama dengan dan sebagai , pernyataan yang sama berlaku untuk setiap pasangan, dan ini juga dapat diuji. x y √z x y zxy1−z2−−−−−√ z x y
Jika masih tidak yakin, langkah selanjutnya adalah melihat beberapa rotasi 3-D sewenang-wenang atau berapa banyak poin yang jatuh dalam sudut padat yang diberikan, tetapi itu mulai menjadi lebih rumit, dan saya pikir tidak perlu.
sumber
Jika Anda ingin mengambil sampel titik-titik yang terdistribusi secara merata pada bola 3D (yaitu, permukaan bola 3D), gunakan penolakan sederhana, atau metode Marsaglia (Ann. Math. Statist., 43 (1972), hlm. 645– 646). Untuk dimensi rendah, rasio penolakannya cukup rendah.
Jika Anda ingin menghasilkan titik acak dari bola dan bola dimensi tinggi, maka itu tergantung pada tujuan dan skala simulasi. Jika Anda tidak ingin melakukan simulasi besar, gunakan metode Muller (Commun. ACM, 2 (1959), hlm. 19-20) atau versi "bola" -nya (lihat kertas Harman & Lacko yang dikutip di atas). Itu adalah:
untuk mendapatkan sampel yang terdistribusi secara merata pada n-sphere (permukaan) 1) menghasilkan X dari distribusi normal standar n-dimensi 2) bagi setiap komponen X dengan norma Euclidean X
untuk mendapatkan sampel yang terdistribusi secara merata pada bola-n (interior) 1) menghasilkan X dari (n + 2) -distribusi normal standar berdimensi 2) bagi setiap komponen X dengan norma Euclidean X dan ambil hanya komponen n pertama
Jika Anda ingin melakukan simulasi besar, maka Anda harus menyelidiki metode yang lebih khusus. Atas permintaan, saya dapat mengirimkan kepada Anda makalah Harman dan Lacko tentang metode distribusi bersyarat, yang menyediakan klasifikasi dan generalisasi dari beberapa algoritma yang disebutkan dalam diskusi ini. Kontak tersedia di situs web saya (http://www.iam.fmph.uniba.sk/ospm/Lacko)
Jika Anda ingin memeriksa, apakah poin Anda benar-benar seragam di permukaan atau bagian dalam bola, lihat marginalnya (semua harus sama, karena invarian rotasi, norma kuadrat dari sampel yang diproyeksikan adalah terdistribusi beta).
sumber
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
dan kemudianv = v/v.norm(10000)
Saya memiliki masalah yang sama (n-bola) selama PhD saya dan salah satu 'ahli' lokal menyarankan sampel penolakan dari n-cube! Ini, tentu saja, akan mengambil usia alam semesta ketika saya melihat n dalam urutan hunderds.
Algoritma yang saya gunakan akhirnya sangat sederhana dan diterbitkan dalam:
WP Petersen dan A. Bernasconic Uniform pengambilan sampel dari n-sphere: Metode Teknis isotropik, TR-97-06, Pusat Swiss untuk Komputasi Ilmiah
Saya juga memiliki makalah ini di bibliografi yang belum pernah saya lihat. Anda mungkin menemukan itu berguna.
Harman, R. & Lacko, V. Pada algoritma dekomposisi untuk pengambilan sampel yang seragam dari bola dan bola Journal of Multivariate Analysis, 2010n n
sumber
Saya pernah mengalami masalah ini sebelumnya, dan inilah alternatif yang saya temukan,
Sedangkan untuk distribusinya sendiri, rumus yang saya temukan yang berfungsi dengan baik adalah dengan menggunakan koordinat polar (saya sebenarnya menggunakan variasi koordinat poler yang dikembangkan), kemudian dikonversi ke koordinat Cartesius.
Jari-jari tentu saja adalah jari-jari bola tempat Anda merencanakan. Kemudian Anda memiliki nilai kedua untuk sudut pada bidang datar, diikuti oleh nilai ketiga yaitu sudut di atas atau di bawah bidang itu.
Untuk mendapatkan distribusi yang layak, asumsikan bahwa U adalah bilangan acak yang terdistribusi seragam, r adalah jari-jari, a adalah koordinat polar kedua, dan b adalah koordinat polar ketiga,
a = U * 360 b = U + U-1 kemudian dikonversi ke kartesius melalui x = r * sin (b) dosa (a) z = r dosa (b) cos (a) y = r dosa (b)
Saya baru-baru ini menemukan yang berikut yang secara matematis lebih baik, a = 2 (pi) * Ub = cos ^ -1 (2U-1)
Tidak jauh berbeda dari formula asli saya, meskipun saya adalah derajat vs radian.
Versi terbaru ini konon dapat digunakan untuk hyperspheres, meskipun tidak disebutkan bagaimana mencapainya.
Meskipun saya memeriksa keseragaman secara visual dengan metode yang agak murah untuk membuat peta untuk Homeworld 2 dan kemudian "memainkan" peta itu. Faktanya, karena peta dibuat dengan skrip lua, Anda dapat membuat rumus tepat di peta dan dengan demikian memeriksa beberapa sampel tanpa harus meninggalkan permainan. Mungkin tidak ilmiah, tetapi merupakan metode yang baik untuk melihat hasilnya secara visual.
sumber
Inilah kodesemu:
Di pytorch:
Saya tidak mengerti ini cukup baik tetapi saya telah diberitahu oleh whuber bahwa:
juga benar yaitu pengambilan sampel dari normal univariat untuk setiap koordinat.
sumber
Tebakan terbaik saya adalah pertama-tama menghasilkan satu set titik yang terdistribusi secara seragam dalam ruang 2 dimensi dan kemudian memproyeksikan titik-titik tersebut ke permukaan bola menggunakan semacam proyeksi.
Anda mungkin harus mencampur dan mencocokkan cara Anda menghasilkan poin dengan cara Anda memetakannya. Dalam hal generasi titik 2D, saya pikir bahwa urutan perbedaan rendah yang diacak akan menjadi tempat yang baik untuk memulai (yaitu urutan Sobol yang diacak) karena biasanya menghasilkan poin yang tidak "digumpal bersama". Saya tidak yakin tentang jenis pemetaan yang akan digunakan, tetapi Woflram muncul proyeksi Gnonomis ... jadi mungkin itu bisa berhasil?
MATLAB memiliki implementasi yang layak dari urutan perbedaan rendah yang dapat Anda hasilkan menggunakan
q = sobolset(2)
dan mengacak menggunakanq = scramble(q)
. Ada juga kotak alat pemetaan di MATLAB dengan banyak fungsi proyeksi berbeda yang dapat Anda gunakan seandainya Anda tidak ingin membuat kode pemetaan dan gambar sendiri.sumber