2012-04-09 11 views
6

ho set di dati (di 5000 punti con 4 dimensioni) che ho cluster utilizzando Kmeans in R.ordinazione punti cluster utilizzando Kmeans e R

voglio ordinare i punti in ogni cluster in base alla distanza di il centro di quel gruppo.

Molto semplicemente, i dati assomiglia a questo (sto usando un sottoinsieme di testare diversi approcci):

id Ans Acc Que Kudos 
1 100 100 100 100 
2 85 83 80 75 
3 69 65 30 29 
4 41 45 30 22 
5 10 12 18 16 
6 10 13 10 9 
7 10 16 16 19 
8 65 68 100 100 
9 36 30 35 29 
10 36 30 26 22 

In primo luogo, ho usato il seguente metodo per raggruppare l'insieme di dati in 2 gruppi:

(result <- kmeans(data, 2)) 

Questo restituisce un oggetto Kmeans che ha il seguente methods: cluster, centers etc.

Ma io Canno t capire come confrontare ciascun punto e produrre una lista ordinata.

In secondo luogo, ho provato l'approccio seriazione, come suggerito da un altro SO utente here

io uso questi comandi:

clus <- kmeans(scale(x, scale = FALSE), centers = 3, iter.max = 50, nstart = 10) 
mns <- sapply(split(x, clus$cluster), function(x) mean(unlist(x))) 
result <- dat[order(order(mns)[clus$cluster]), ] 

che sembra produrre un elenco ordinato, ma se mi legano al etichettato cluster (utilizzando il seguente comando cbind):

result <- cbind(x[order(order(mns)[clus$cluster]), ],clus$cluster) 

ottengo il seguente risultato, che non sembra essere ordine Ed in modo corretto:

id Ans Acc Que Kudos clus 
1 3 69 65 30 29 1 
2 4 41 45 30 22 1 
3 5 10 12 18 16 2 
4 6 10 13 10 9 2 
5 7 10 16 16 19 2 
6 9 36 30 35 29 2 
7 10 36 30 26 22 2 
8 1 100 100 100 100 1 
9 2 85 83 80 75 2 
10 8 65 68 100 100 2 

non voglio essere iscritto comandi, volenti o nolenti, ma capire come funziona l'approccio. Se qualcuno potesse aiutare o diffondere un po 'di luce su questo, sarebbe davvero grandioso.

EDIT :::::::::::

Come i cluster possono essere facilmente tracciati, immagino ci sia un modo più semplice per ottenere e classificare le distanze tra punti e il centro.

I centri per i cluster di cui sopra (quando si utilizza k = 2) sono i seguenti. Ma non so come ottenere e confrontare questo con ogni singolo punto.

 Ans Accep  Que  Kudos 
1 83.33333 83.66667 93.33333 91.66667 
2 30.28571 30.14286 23.57143 20.85714 

NB ::::::::

non ho bisogno di top uso Kmeans ma voglio specificare il numero di cluster e recuperare un elenco ordinato di punti da tali cluster.

+0

Questa è una buona domanda ... controllare che non si utilizza l'ID di raggruppare (Credo che ci sono casi in cui può essere utile, ma è improbabile) – Seth

+0

freddo, io non voglio raggruppare gli id, supervisione a mio nome. Correggerò la domanda grazie..j – slotishtype

+2

Credo che 'kmeans()' restituisca anche i centri del cluster finale.Da lì, non dovrebbe essere troppo difficile calcolare la distanza da ciascun punto al centro del suo cluster. –

risposta

6

Ecco un esempio che fa quello che chiedi, utilizzando il primo esempio da ?kmeans. Probabilmente non è terribilmente efficiente, ma è qualcosa su cui basarsi.

#Taken straight from ?kmeans 
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), 
      matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2)) 
colnames(x) <- c("x", "y") 
cl <- kmeans(x, 2) 

x <- cbind(x,cl = cl$cluster) 

#Function to apply to each cluster to 
# do the ordering 
orderCluster <- function(i,data,centers){ 
    #Extract cluster and center 
dt <- data[data[,3] == i,] 
ct <- centers[i,] 

    #Calculate distances 
dt <- cbind(dt,dist = apply((dt[,1:2] - ct)^2,1,sum)) 
    #Sort 
dt[order(dt[,4]),] 
} 

do.call(rbind,lapply(sort(unique(cl$cluster)),orderCluster,data = x,centers = cl$centers)) 
+0

Grazie @joran, ti ho upvoted e accetterò domani una volta che avrò una migliore comprensione di esso. Voglio comprendere appieno l'approccio. Posso farti una domanda veloce? Questo approccio funziona con dataset multidimensionali? Voglio solo assicurarmi che il mio approccio sia corretto e che non debba usare qualche forma di MDS, ecc. Grazie ancora. – slotishtype

+0

@slotishtype Sì, le cose principali che si desidera regolare sono il numero specifico di dimensioni (ho codificato in molti punti questo aspetto per i dati con solo 2 colonne) e la scelta della metrica di distanza; Qui ho usato la distanza euclidea, che dovrebbe essere appropriata per i kmi. – joran

+0

Brill. Grazie per il tuo aiuto, accetterò domani una volta che ci giocherò con esso – slotishtype