Menemukan sejumlah pusat lingkaran yang diketahui yang memaksimalkan jumlah titik dalam jarak yang tetap


10

Saya memiliki satu set data 2-D di mana saya ingin menemukan pusat dari sejumlah pusat lingkaran ( ) yang memaksimalkan jumlah total poin dalam jarak yang ditentukan ( R ).NR

misalnya saya memiliki 10.000 titik data dan saya ingin menemukan pusat-pusat N = 5 lingkaran yang menangkap poin sebanyak mungkin dalam radius R = 10 . 5 pusat dan jari-jari 10 diberikan sebelumnya, bukan berasal dari data.(Xi,Yi)N=5R=10

Kehadiran titik data dalam lingkaran adalah biner baik / atau proposisi. Jika , tidak ada perbedaan nilai ke titik 11 unit jauhnya vs 100 unit jauhnya, karena keduanya> 10. Demikian pula untuk berada di dalam lingkaran, tidak ada nilai tambahan untuk berada di dekat pusat vs dekat tepi . Titik data berada di salah satu lingkaran atau keluar.R=10

Apakah ada algoritma yang baik yang dapat digunakan untuk menyelesaikan masalah ini? Ini tampaknya terkait dengan teknik pengelompokan, tetapi alih-alih meminimalkan jarak rata-rata, fungsi "jarak" adalah 0 jika titik berada dalam dari salah satu titik N , dan 1 sebaliknya.RN

Preferensi saya adalah menemukan cara untuk melakukan ini di R, tetapi pendekatan apa pun akan dihargai.


Apakah lingkaran tumpang tindih diperbolehkan?
curious_cat

1
Ini pada dasarnya adalah operasi lingkungan (atau fokus) pada dataset raster. Akan lebih baik untuk memeriksa situs GIS untuk melihat apakah sudah dijawab, dan memeriksa paket R untuk melakukan analisis Raster.
Andy W

1
Tumpang tindih lingkaran diizinkan, tetapi titik data yang dicakup oleh kedua lingkaran tidak akan dihitung ganda. Terima kasih atas penunjuk ke operasi lingkungan / fokus pada dataset raster. Saya akan mencari sesuatu di sepanjang garis itu.
colonel.triq

@Andy W Meskipun operasi fokus secara alami akan terlibat dalam solusi, pertanyaan ini berada di luar keahlian komunitas GIS, IMHO, karena itu benar-benar masalah optimasi (sangat sulit). Ini bukan pencarian langsung-the-max-of-a-focal-mean-grid. Saya akan merekomendasikan menyimpannya di sini untuk sementara waktu dan kemudian, jika tidak ada solusi yang memuaskan muncul, bermigrasi ke situs yang berorientasi pemrograman.
whuber

.... atau bermigrasi ke math.overflow? Mereka mungkin memiliki beberapa wawasan tentang ini juga.
curious_cat

Jawaban:


1

Ini adalah variasi masalah k-means. Jari-jari pusat tidak masalah, asalkan diasumsikan sama.

Tautan:

Ini akan menempatkan pusat-pusat lingkaran di lokasi-lokasi dengan probabilitas poin tertinggi.

Prosedur K-means Klasik:

  1. set jumlah cluster menjadi 5
  2. letakkan setiap titik dalam cluster acak
  3. untuk setiap cluster, hitung posisi rata-rata
  4. untuk setiap titik, hitung jarak ke setiap posisi rata-rata baru
  5. kaitkan keanggotaan dengan kluster terdekat
  6. ulangi sampai selesai (iterasi, perubahan posisi, atau metrik kesalahan lainnya)

Pilihan:

  • Anda dapat menggunakan beberapa relaksasi di bawah 3, di mana Anda menerjemahkan posisi rata-rata perlahan ke posisi baru.
  • ini adalah sistem diskrit sehingga tidak konvergen sempurna. Kadang-kadang itu terjadi dan Anda bisa berakhir ketika poin berhenti mengubah keanggotaan, tetapi kadang-kadang mereka hanya sedikit goyah.
  • Jika Anda membuat kode Anda sendiri (seperti yang seharusnya dilakukan kebanyakan orang) maka Anda dapat menggunakan POR k-means di atas sebagai titik awal, dan melakukan beberapa variasi EM yang diinformasikan oleh persentase poin secara eksklusif dan sepenuhnya dicakup oleh lingkaran.

Mengapa K-means menyerang masalah:

  • Ini setara dengan pemasangan Model Campuran Gaussian di mana kovarian komponen sama. Pusat-pusat komponen campuran akan ditempatkan pada posisi titik harapan tertinggi. Kurva probabilitas konstan akan menjadi lingkaran. Ini adalah algoritma EM sehingga memiliki konvergensi asimptotik. Keanggotaannya sulit, tidak lunak.
  • Saya pikir jika asumsi mendasar dari model campuran komponen varians yang sama cukup "dekat", apa pun artinya, maka metode ini akan cocok. Jika Anda hanya mendistribusikan poin secara acak, kemungkinannya kurang cocok.

Seharusnya ada beberapa analog dari "Zero Inflated Poisson" di mana ada komponen yang non-gaussian yang mengambil distribusi seragam.

Jika Anda ingin "menyetel" model Anda dan yakin bahwa ada cukup banyak titik sampel maka Anda dapat menginisialisasi dengan k-means, dan kemudian membuat adjuster k-means tambahan yang menghilangkan poin di luar jari-jari lingkaran dari kompetisi. Ini akan sedikit mengganggu lingkaran yang Anda miliki, tetapi mungkin sedikit meningkatkan kinerja mengingat data.


Bisakah Anda menjadi sedikit lebih eksplisit tentang bagaimana K-means menyelesaikan masalah ini?
whuber

Terima kasih untuk sarannya. Masih belum jelas bagi saya bahwa pendekatan K-means menyelesaikan masalah? Perhatikan contoh tiga kelompok data yang dihasilkan normal (0,1), di mana pusat diimbangi oleh sekitar 5 unit. Pusat K-means akan memberikan kepadatan maksimal. Sekarang hilangkan beberapa titik dengan "lubang" sehingga data yang lebih dekat dari 0,5 ke pusat dihapus. K-means masih akan menunjukkan tentang pusat yang sama, tetapi jika Anda mencoba untuk mendapatkan cakupan maksimal untuk N = 3, R = 0,5 itu jelas bukan jawaban yang tepat (karena lubang donat tidak mengandung data). Apakah saya salah mengerti sesuatu?
colonel.triq

Akan melihat pertanyaan Anda lebih untuk jawaban yang lebih baik ketika saya punya waktu. Saya suka membiarkan bobot negatif. Kadang-kadang dapat menangani donat data serta polinomial rasional radial.
EngrStudent

0

Seseorang mungkin memiliki algoritma formal yang lebih baik, tetapi inilah satu pendekatan brute force (sebuah hack?). Saya akan menggunakan salah satu algoritma binning heksagonal untuk menghitung histogram 2D. Seperti hexbindi R.

Saya akan menggunakan ukuran segi enam yang kira-kira akan membatasi lingkaran jari-jari Anda R dan kemudian mengurutkan di atas N bin. Jika Anda punya Ntempat sampah yang jauh, bagus. Sekarang salah satu cara adalah untuk bergerak di sekitar lingkaran secara lokal pada skala 2 * R (dalam arah x dan y) dari pusat heksagon kepadatan atas. Komputasi kepadatan dapat secara kasar mengoptimalkan posisi secara lokal. Ini akan menjelaskan fakta bahwa segi enam bukan jendela bergerak sehubungan dengan asal yang tetap.

Jika semua tempat sampah teratas dekat, Anda harus memiliki cara yang lebih cerdas untuk menggerakkan lingkaran Anda di sekitarnya.

Perhatikan bahwa saya dapat memikirkan beberapa kasus sudut di mana strategi naif seperti itu akan gagal secara spektakuler. Namun, hanya titik awal.

Sementara itu, saya berharap seseorang memiliki algoritma yang lebih baik.


1
Sesuatu seperti ini dapat menyelesaikan masalah, setidaknya sekitar, untuk satu lingkaran. (Ini dapat dengan mudah dilakukan menggunakan penghitungan fokus dengan GIS.) Tetapi itu tidak akan menyelesaikan masalah multi-lingkaran.
whuber

@whuber: Bagaimana memecahkan satu lingkaran kemudian menjatuhkan semua poin yang ada di dalam lingkaran itu dan kemudian mengulangi algoritma yang asli? Bisakah Anda melihat situasi di mana ini akan gagal?
curious_cat

R=10,N=20,1,2,20,21,28,29,30,31,32,39,4028,29,30,31,320,1,220,21,28,29,3030,31,32,39,40

@whuber: Benar. Kamu benar. Meskipun tergantung pada struktur titik input dalam beberapa kasus (banyak?) Solusi serakah dan tidak serakah mungkin identik atau dekat? Saya tidak tahu
curious_cat

@whuber: Masalahnya tampaknya sebagian besar pada batas. Bagaimana jika (agak seperti yang saya sebutkan dalam jawaban saya) salah satu bergerak jendela +Rdan -Rkemudian menempatkan semua solusi layak pada tumpukan dan memilih di antara mereka. misalnya dalam 1Dcontoh Anda tentang memukulnya 28,29,30,31,32akan geser jendela ke atas 18-28dan 38-48mencari semua solusi yang masuk akal. Kemudian dalam satu ini dapat mencari kombinasi menghasilkan titik maksimum. Tidak yakin apakah itu akan membantu? Saya mencoba melihat apakah algoritma naif saya dapat diselamatkan? :)
curious_cat
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.