Individuazione di un numero noto di centri circolari che massimizzano il numero di punti entro una distanza fissa


10

Ho una serie di dati 2D in cui voglio trovare i centri di un determinato numero di centri di cerchi ( ) che massimizzano il numero totale di punti entro una distanza specificata ( ).NR

ad es. ho 10.000 punti dati e voglio trovare i centri di cerchi che catturano il maggior numero possibile di punti entro un raggio di . I 5 centri e il raggio di 10 sono indicati in precedenza, non derivati ​​dai dati.(Xio,Yio)N=5R=10

La presenza di un punto dati all'interno di un cerchio è una / o proposizione binaria. Se , non vi è alcuna differenza di valore in un punto a 11 unità di distanza rispetto a 100 unità di distanza, poiché sono entrambi> 10. Analogamente per essere all'interno del cerchio, non vi è alcun valore aggiuntivo per essere vicino al centro rispetto al bordo . Un punto dati è in uno dei cerchi o fuori.R=10

Esiste un buon algoritmo che può essere utilizzato per risolvere questo problema? Questi sembrano correlati alle tecniche di raggruppamento, ma piuttosto che ridurre al minimo la distanza media, la funzione "distanza" è 0 se il punto si trova all'interno di di uno qualsiasi degli punti e 1 altrimenti.RN

La mia preferenza sarebbe quella di trovare un modo per farlo in R, ma qualsiasi approccio sarebbe apprezzato.


È consentita la sovrapposizione dei cerchi?
curious_cat l'

1
Si tratta essenzialmente di un'operazione di vicinato (o focale) su un set di dati raster. Sarebbe bene controllare il sito GIS per vedere se è stato risposto, ed esaminare i pacchetti R per condurre analisi Raster.
Andy W

1
La sovrapposizione dei cerchi è consentita, ma i punti dati coperti da entrambi i cerchi non verranno conteggiati due volte. Grazie per il puntatore all'operazione di vicinato / focale su set di dati raster. Cercherò qualcosa in tal senso.
colonel.triq,

@Andy W Sebbene le operazioni focali siano naturalmente coinvolte in una soluzione, questa domanda va oltre le competenze della comunità GIS, IMHO, perché è davvero un problema di ottimizzazione (piuttosto difficile). Non è una griglia semplice per trovare la media massima di una focale. Consiglierei di tenerlo qui per un po 'e poi, se non emerge una soluzione soddisfacente, migrare verso un sito orientato alla programmazione.
whuber

.... o la migrazione a math.overflow? Potrebbero anche avere alcuni spunti su questo.
curious_cat

Risposte:


1

Questo è un problema di variazione di k-medie. Il raggio dei centri non ha importanza, purché siano considerati uguali.

link:

Metterà i centri dei cerchi nelle posizioni con la più alta probabilità dei punti.

Procedura classica K-significa:

  1. imposta il conteggio dei cluster su 5
  2. mettere ogni punto in un cluster casuale
  3. per ciascun cluster, calcolare la posizione media
  4. per ogni punto, calcola la distanza per ogni nuova posizione media
  5. associare l'appartenenza al cluster più vicino
  6. ripetere fino al termine (iterazioni, cambio di posizione o altra metrica di errore)

Opzioni:

  • Puoi usare un po 'di rilassamento dopo 3, in cui traduci lentamente la posizione media verso la nuova posizione.
  • questo è un sistema discreto, quindi non converge perfettamente. A volte lo fa e puoi finire quando i punti smettono di cambiare appartenenza, ma a volte si muovono un po '.
  • Se stai creando il tuo codice (come dovrebbe fare la maggior parte delle persone), puoi usare i k POR di cui sopra come punto di partenza e fare una variazione su EM informata dalla percentuale di punti esclusivamente e completamente racchiusa dai cerchi.

Perché K-mean attacca il problema:

  • È l'equivalente del montaggio di un modello di miscela gaussiana in cui le covarianze dei componenti sono uguali. I centri dei componenti della miscela saranno posizionati nelle posizioni di massima aspettativa dei punti. Le curve di probabilità costante saranno cerchi. Questo è l'algoritmo EM, quindi ha la convergenza asintotica. Le iscrizioni sono difficili, non morbide.
  • Penso che se il presupposto fondamentale del modello di miscela di componenti di varianza uguale è ragionevolmente "vicino", qualunque cosa significhi, allora questo metodo si adatterà. Se si distribuiscono casualmente punti, è meno probabile che si adattino bene.

Dovrebbe esserci un analogo di un "Poisson gonfiato zero" in cui vi è un componente non gaussiano che raccoglie la distribuzione uniforme.

Se volevi "sintonizzare" il tuo modello ed eri sicuro che ci fossero abbastanza punti di campionamento, allora potresti inizializzare con i mezzi k, e quindi creare un regolatore aumentato dei mezzi k che rimuova dalla competizione i punti al di fuori dei raggi dei cerchi. Avrebbe disturbato leggermente i cerchi che hai, ma potrebbe avere prestazioni leggermente migliorate dati i dati.


Potresti per favore essere un po 'più esplicito su come K-mean risolve questo problema?
whuber

Grazie per il suggerimento Non è ancora chiaro per me che l'approccio K-medie risolve il problema? Si consideri l'esempio di tre gruppi di dati generati normali (0,1), in cui i centri sono sfalsati di circa 5 unità. I centri dei mezzi K darebbero la massima densità. Ora tagliare alcuni dei punti con "buchi" in modo tale che i dati più vicini di 0,5 ai centri vengano rimossi. K-significa mostrerà comunque gli stessi centri, ma se stai cercando di ottenere la massima copertura per N = 3, R = 0,5 questa non è chiaramente la risposta giusta (perché i fori per le ciambelle non contengono dati). Sto fraintendendo qualcosa?
Colonel.triq,

Esaminerò più la tua domanda per una risposta migliore quando avrò tempo. Mi piace consentire pesi negativi. Talvolta può gestire ciambelle di dati e polinomi razionali radiali.
EngrStudent,

0

Qualcuno probabilmente ha un algoritmo formale migliore, ma ecco un approccio a forza bruta (un hack?). Userei uno degli algoritmi di binning esagonale per calcolare un istogramma 2D. Come hexbinin R.

Userei una dimensione esagonale che circoscriverebbe all'incirca il tuo cerchio di raggio R e poi ordinerebbe sui N bidoni superiori. Se hai Nbidoni distinti distanti, fantastico. Ora un modo è spostarsi localmente attorno al cerchio su una scala 2 * R (nelle direzioni xey) dal centro degli esagoni di densità superiore. Le densità di calcolo possono approssimativamente ottimizzare la posizione a livello locale. Ciò spiegherà il fatto che gli esagoni non erano una finestra mobile rispetto a un'origine fissa.

Se tutti i contenitori principali sono vicini, dovresti avere un modo più intelligente di spostare le tue cerchie in quella zona.

Nota che posso pensare a diversi casi angolari in cui una strategia così ingenua fallirà in modo spettacolare. Eppure, solo un punto di partenza.

Nel frattempo, spero che qualcuno abbia un algoritmo migliore.


1
Qualcosa del genere potrebbe risolvere il problema, almeno approssimativamente, per un cerchio. (Questo può essere fatto facilmente usando i conteggi focali con un GIS.) Ma non risolverà il problema del cerchio multiplo.
whuber

@whuber: Che ne dici di risolvere un cerchio, quindi di eliminare tutti i punti che si trovano all'interno di quel cerchio e quindi ripetere l'algoritmo originale? Riesci a vedere situazioni in cui ciò fallirebbe?
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: True. Hai ragione. Anche se a seconda della struttura dei punti di input in alcuni (molti?) Casi le soluzioni avide e non avide potrebbero essere identiche o vicine? Non lo so.
curious_cat

@whuber: il problema sembra principalmente ai limiti. Che cosa succede se (un po 'come ho detto nella mia risposta) ci si muove la finestra +Re -Rpoi mette tutte le soluzioni possibili su una pila e di selezionare tra di loro. ad esempio, nel tuo 1Desempio di colpire 28,29,30,31,32, faresti scorrere la finestra 18-28e 38-48cercare tutte le soluzioni possibili. Quindi all'interno di questi si possono cercare combinazioni di rendimento massimo in punti. Non sei sicuro che possa aiutare? Sto cercando di vedere se il mio ingenuo algoritmo può essere recuperato? :)
curious_cat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.