2012-04-09 15 views
6

I han establecido de los datos (de 5000 puntos con 4 dimensiones) que he agruparon utilizando kmeans en R.pedidos puntos agruparon utilizando Kmeans y R

Quiero ordenar los puntos de cada grupo por su distancia a el centro de ese grupo.

Muy simplemente, los datos se parece a esto (estoy usando un subconjunto de poner a prueba diversos enfoques):

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 

En primer lugar, he utilizado el siguiente método para agrupar el conjunto de datos en 2 grupos:

(result <- kmeans(data, 2)) 

Esto devuelve un objeto kmeans que tiene la siguiente methods: cluster, centers etc.

Pero Canno t averiguar cómo comparar cada punto y producir una lista ordenada.

En segundo lugar, he intentado el enfoque seriación como se sugiere por otro usuario SO here

que utilizan estos comandos:

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]), ] 

que parece producir una lista ordenada pero si me ato a la etiqueta grupos (utilizando el siguiente comando cbind):

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

me sale el siguiente resultado, que no parece ser el fin ed correctamente:

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 

No quiero escribir comandos de todas maneras, pero entiendo cómo funciona el enfoque. Si alguien pudiera ayudar o difundir algo de luz sobre esto, sería realmente grandioso.

EDITAR :::::::::::

A medida que los grupos se pueden trazar fácilmente, me imagino que hay una manera más fácil de obtener y clasificar las distancias entre puntos y el centro.

Los centros para los clústeres anteriores (cuando se usa k = 2) son los siguientes. Pero no sé cómo obtener y comparar esto con cada punto individual.

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

NB ::::::::

no necesito superiores kmeans uso pero quiero especificar el número de racimos y recuperar una lista ordenada de puntos de esos grupos.

+0

Esta es una buena pregunta ... y comprueba que no está utilizando el ID a agruparse (supongo que hay casos en que es posible que desee, pero es poco probable) – Seth

+0

fresca, yo no quiero agrupar los identificadores, supervisión en mi nombre. Enmendaré la pregunta. gracias ... – slotishtype

+2

Creo que 'kmeans()' también devuelve los centros de clúster finales.A partir de ahí, no debería ser demasiado difícil calcular la distancia desde cada punto hasta el centro de su grupo. –

Respuesta

6

Aquí hay un ejemplo que hace lo que pregunta, usando el primer ejemplo de ?kmeans. Probablemente no sea terriblemente eficiente, pero es algo sobre lo que construir.

#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

Gracias @joran, te subí de categoría y aceptaré mañana una vez que lo haya entendido mejor. Quiero entender completamente el enfoque. ¿Puedo hacerte una pregunta rápida? ¿Este enfoque funciona con conjuntos de datos multidimensionales? Solo quiero asegurarme de que mi enfoque sea correcto y de que no tenga que usar alguna forma de MDS, etc. Gracias de nuevo. – slotishtype

+0

@slotishtype Sí, las principales cosas que querrá ajustar son el número específico de dimensiones (he codificado esto en varios lugares para datos con solo 2 columnas) y la elección de la métrica de distancia; He usado la distancia euclidiana aquí, que debería ser apropiada para kmeans. – joran

+0

Brill. Gracias por su ayuda, lo aceptaré mañana cuando juegue con él – slotishtype

Cuestiones relacionadas