Bagaimana saya bisa menghasilkan poin yang terdistribusi secara merata di lingkaran?


11

Saya mencari untuk menghasilkan 450 titik data dalam R. Ada tiga set yang berbeda 150 masing-masing didistribusikan dalam sebuah band lingkaran dengan jari-jari yang berbeda (pada 1, 2,8 dan 5).

Secara khusus, saya ingin mereproduksi grafik pertama pada hal. 466 dari The Elements of Statistics Learning. masukkan deskripsi gambar di sini

Saya akan sangat berterima kasih atas bantuan dalam kode R yang dapat menghasilkan data ini.

Terima kasih!


Lihat misalnya Lovisolo, da Silva. Distribusi titik-titik yang seragam pada hyper-sphere dengan aplikasi ke vektor bit-plane encoding . Tidak ada kode yang siap dalam artikel, tetapi algoritma. Jika Anda tidak dapat menemukan pdf, kirimkan saya email.
ttnphns

1
Menghasilkan titik secara seragam pada bola dijelaskan di stats.stackexchange.com/questions/7977/… ; metode ini menggeneralisasi langsung ke semua dimensi lain. Tetapi judul pertanyaan ini tampaknya tidak ada hubungannya sama sekali dengan pertanyaan itu sendiri, yang meminta distribusi seragam pada lingkaran bersama dengan aditif "Gaussian noise" dalam arah radial. Karena itu saya telah mengedit judul untuk mengubah "hypersphere" menjadi "lingkaran."
whuber

Jawaban:


12

Dalam kasus lingkaran, cukup untuk menghasilkan sudut yang seragam, , pada dan kemudian buat jari-jari, , apa pun yang diinginkan. Jika Anda menginginkan Cartesian, daripada koordinat polar, dan .θ[0,2π)rx=rcosθy=rsinθ

Salah satu cara yang sangat mudah untuk menghasilkan titik acak dari distribusi seragam a-d-sphere (a hypersphere dalam ruang dimensi sewenang-wenang , dengan permukaan dimensi ), adalah untuk menghasilkan normals standar multivariat , lalu skala menurut jaraknya dari titik asal:d+1dXiNd+1(0,I)

Yi=Xi/||Xi||,

dimanaadalah norma Euclidean .||.||

Dalam R, mari kita hasilkan pada permukaan bola (2-):

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

Inilah data dari dua sudut yang sedikit berbeda:

Plot 3d dari data yang terdistribusi seragam di sphere

Anda kemudian dapat skala ke radius lain apa pun yang Anda suka.

Dalam dimensi rendah, ada cara yang lebih cepat, tetapi jika generator angka acak normal Anda cukup cepat, itu cukup baik dalam dimensi yang lebih tinggi.

Ada beberapa paket pada CRAN untuk statistik sirkuler, termasuk CircStatsdan circular. Mungkin ada sesuatu di CRAN yang menghasilkan distribusi seragam di n-bola untuk n> 1, tapi saya tidak tahu itu.


Ini adalah langkah pertama dari pendekatan yang digunakan dalam artikel yang saya rujuk dalam komentar saya di atas. Para penulis menggunakan 3 tahap: 1) menghasilkan sangat banyak titik data normal dan skala ulang menjadi radius unit; 2) menggunakan pengelompokan k-means untuk mengganti banyak poin ke po k yang Anda butuhkan untuk memasang hypersphere, ubin dekat dengan seragam sejauh ini; 3) menerapkan pergeseran khusus ke setiap titik untuk mencapai keseragaman yang hampir pasti. Saya pernah mengkodekan algoritma itu, tetapi dalam SPSS, bukan di R.
ttnphns

Saya pikir langkah 2 dan 3 berguna ketika Anda ingin menghasilkan mesh yang baik di bola, tetapi tidak untuk generasi poin acak ... [@Glen_b jawaban yang bagus! ]
Elvis

@ttnphns Saya mengambil pertanyaan untuk bertanya tentang poin yang memiliki distribusi seragam di permukaan, daripada sesuatu di mana poin dekat dengan jarak yang sama.
Glen_b -Reinstate Monica

Tetapi saya mengerti bahwa OP menanyakan hal ini: ubin yang benar-benar seragam, teratur, dan berjarak sama. Data acak jauh dari benar-benar seragam.
ttnphns

1
Ya tentu saja. Untuk disambiguasi, selalu bijaksana untuk mengatakan distribusi "datang dari seragam / normal" bukannya meragukan "memiliki distribusi seragam / normal".
ttnphns
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.