2010-10-14 14 views
16

Dato: Dato un insieme di N punti nel piano 2D (coordinate xey) e un set di N raggi corrispondenti a ciascun punto. Faremo riferimento al disco di un punto come il disco centrato nel punto con il suo raggio.Raggruppamento in 2 punti

Problema: Raggruppa i punti. Un gruppo di punti è tale che ogni punto cade all'interno del disco di almeno un altro punto nel cluster OPPURE almeno un altro punto nel cluster cade nel suo disco. I cluster di punti singoli non contano come cluster.

Ho bisogno di un algoritmo per calcolare questo in modo efficiente (preferibilmente senza ricorrere a complicate tecniche di hashing spaziale come kd-tree). Posso accontentarmi del tempo di esecuzione O (N^2) ma sicuramente non più di O (N^3). Credo che questo dovrebbe essere semplice, ma mi sto facendo prendere dalla natura non reciproca della mia condizione di clustering.

In sostanza, sto cercando di compilare il prototipo di funzione C:

int cluster_points(
    size_t n, 
    point_t *pt, // length n list of points 
    double *radius, // length n list of radii for each point 
    int *cluster, // length n list of cluster indexes; -1 if not clustered 
    size_t *ncluster // number of clusters (number of distinct non -1 entries in cluster) 
); 

Questo non è lavoro. Ho bisogno di questo come parte di un algoritmo a matrice per il clustering di numeri complessi.

risposta

10

La soluzione forza bruta è solo O (N), quindi dovrebbe funzionare per voi.

1) Iniziare con tutti i punti nel gruppo non assegnato.

2) Seleziona un punto e guarda tutti gli altri nel gruppo non assegnato e verifica se soddisfa il criterio dei raggi che descrivi.

  • 2a) Se sì, avviare un gruppo, e continuare con tutti gli altri punti per vedere se si adattano a questo gruppo (in base al punto corrente), e se si inseriscono in, spostarli da il gruppo non assegnato a questo nuovo.
  • 2ab) Al termine del punto corrente, passare a ciascun punto aggiunto al gruppo e controllare tutti i punti nel gruppo non assegnato.
  • 2b) Tuttavia, se nessun punto corrisponde ai criteri di raggio per il punto corrente, scartarlo.

3) Alla fine avrete raggruppato i punti dai vostri criteri, e avrà fatto altro che N * (N/2) ispezioni.

Btw, quello che descrivi non è quello che normalmente si intende per "clustering", quindi penso che stia buttando qui le persone. Ciò che rende il clustering un problema difficile è che la questione se due punti vicini saranno assegnati allo stesso cluster è determinata da tutti gli altri punti nel set di dati. Nel tuo caso, è (fondamentalmente) determinato solo dalle proprietà dei due punti, in modo che nel tuo caso, puoi semplicemente controllarli tutti.

+1

Nel passaggio 2ab, non è necessario andare avanti a tutti i punti aggiunti e guardare attraverso il resto dei punti non assegnati fino a quando non viene assegnato nulla di nuovo? –

+0

@VictorLiu: io non la penso così. Con questo metodo, una volta stabilito il gruppo 1 (e spostato sul gruppo 2), il gruppo 1 contiene tutti i punti che soddisfano i criteri e si troveranno mai in questo gruppo. Quando definisci il gruppo 1, ogni volta che aggiungi un punto ad esso, spazzi tutti gli altri punti per vedere se ora potrebbero essere nel gruppo. Non c'è alcuna possibilità che, ad esempio, tu debba unirti al gruppo 1 e al gruppo 2, una volta stabilito il gruppo 1. – tom10

2

clustering è un problema NP-hard, anche se si è data il numero di cluster a priori, quindi si può probabilmente rinunciare a ottenere un tempo di esecuzione polinomiale. Esistono molte tecniche per fare ciò e la letteratura si trova principalmente nella comunità di apprendimento automatico, k-means è probabilmente l'algoritmo più semplice da comprendere e implementare.

+0

Allora non penso di voler dire clustering. Si può immaginare che se tutti i raggi sono uguali, è possibile ripetere il ciclo su tutte le coppie e determinare se le coppie dovrebbero essere in un singolo cluster. Questo definisce una matrice di incidenza del grafico delle relazioni del cluster. Dopodiché hai solo bisogno di trovare i componenti collegati del grafico (non sto cercando le cricche). Credo che tutto questo sia tempo polinomiale. –

+0

Ok, questo aiuta un po 'ma non sono ancora al 100% chiaro su ciò che stai cercando. Mi sto principalmente chiedendo come si desidera limitare la dimensione o il numero di cluster, ovvero ciò che impedisce a me di dichiarare sempre che tutti i punti si trovano nello stesso cluster (supponendo che sia completamente connesso). – fairidox

+0

Ok, immagina questo geometricamente. Ho un sacco di punti nell'aereo, e ogni punto ha un raggio designato, quindi in realtà sto mettendo un mucchio di dischi nell'aereo. Voglio trovare tutti i gruppi di dischi che stanno toccando; i cluster sono punti per i quali i loro dischi si sovrappongono per formare una regione non circolare più grande nel piano (possibilmente con i fori). Non c'è limite alle dimensioni o al numero di cluster; se i raggi sono tutti zero, allora non ci sono cluster. Se i raggi sono tutti enormi, allora c'è solo un cluster. –

2

Sembra che l'ovvio algoritmo di O (n^2) sia quello di creare un grafico con i punti come vertici e quindi collegare due punti se le condizioni che si danno sono soddisfatte. E poi leggi i componenti collegati del grafico, scartando i singleton. Inoltre, la condizione che hai dato per il clustering mi sembra simmetrica. Mi sto perdendo qualcosa?

+0

Speravo di farlo nello spazio O (1), ma fare la cosa ovvia potrebbe essere più semplice. La condizione del cluster è simmetrica, ma per un'implementazione a doppio ciclo, non lo è. –

2

Hai una collezione U di coppie (p, R) dove p è un punto e R il suo raggio.

La relazione ~ su U: (p, R) ~ (q, S) < => p si trova nel disco di q o q si trova nel disco di p < => | p-q | < = max (R, S)

è chiaramente riflessivo e simmetrico e quindi la sua chiusura transitiva (~ , ad esempio) è una relazione di equivalenza. Le classi di equivalenza sotto ~ saranno (singletons o) cluster.

Credo ci siano algoritmi standard per calcolare le classi di equivalenza della chiusura transitiva di una relazione come ~ sopra. Ad esempio questo è discusso in Numerical Recipes nel capitolo sull'ordinamento, e dicono che la loro routine è basata su Knuth.

(Mi spiace non fornire un collegamento, ma una breve ricerca non ha prodotto esattamente la cosa giusta).