2011-11-04 13 views
6

Tengo un conjunto de datos bidimensional simple que deseo agrupar de forma aglomerativa (sin saber la cantidad óptima de conglomerados para usar). La única forma en que pude agrupar mis datos de manera exitosa es otorgando a la función un valor 'maxclust'.Agrupamiento Aglomerativo en Matlab

Para simplificar, digamos que esta es mi conjunto de datos:

X=[ 1,1; 
    1,2; 
    2,2; 
    2,1; 
    5,4; 
    5,5; 
    6,5; 
    6,4 ]; 

Naturalmente, me gustaría que estos datos para formar 2 grupos. Yo entiendo que si hubiera sabido esto, sólo pude decir:

T = clusterdata(X,'maxclust',2); 

y para encontrar lo que apunta caen en cada grupo que pudiera decir:

cluster_1 = X(T==1, :); 

y

cluster_2 = X(T==2, :); 

pero sin sabiendo que 2 clústeres serían óptimos para este conjunto de datos, ¿cómo puedo agrupar estos datos?

Gracias

+0

pregunta similar: [¿Qué criterios de detención para la agrupación jerárquica aglomerativa se utilizan en la práctica?] (Http://stats.stackexchange.com/q/2597) – Amro

+0

@Amro ¡Enlaces agradables! –

Respuesta

5

El objetivo de este método es que representa los grupos que se encuentran en una jerarquía, y es a usted para determinar la cantidad de datos que desea obtener ..

agglomerative dendogram

Piense en esto como si tuviera una línea horizontal que se cruza con el dendrograma, que se mueve desde 0 (cada punto es su propio grupo) hasta el valor máximo (todos los puntos en un grupo). Usted podría:

  • parada cuando se llega a un número predeterminado de grupos (example)
  • manualmente la posición se da un cierto valor de la altura (example)
  • elegir a colocarlo donde los grupos están demasiado separados de acuerdo al criterio de la distancia (es decir, hay un gran salto al siguiente nivel) (example)

Esto se puede hacer ya sea usando los 'maxclust' o 'cutoff' argumentos de la Funciones CLUSTER/CLUSTERDATA

+0

Gran explicación, Amro. Me di cuenta de que este es un tema con el que parece tener amplia experiencia. Esos enlaces fueron muy útiles para mi aplicación. ¡Gracias! –

5

para elegir el número óptimo de las agrupaciones, un enfoque común es para hacer una gráfica similar a un gráfico de sedimentación. Luego busca el "codo" en la trama, y ​​esa es la cantidad de conglomerados que elige. Para el criterio aquí, vamos a utilizar las plazas de suma de dentro de la agrupación:

function wss = plotScree(X, n) 

wss = zeros(1, n); 
wss(1) = (size(X, 1)-1) * sum(var(X, [], 1)); 
for i=2:n 
    T = clusterdata(X,'maxclust',i); 
    wss(i) = sum((grpstats(T, T, 'numel')-1) .* sum(grpstats(X, T, 'var'), 2)); 
end 
hold on 
plot(wss) 
plot(wss, '.') 
xlabel('Number of clusters') 
ylabel('Within-cluster sum-of-squares') 
>> plotScree(X, 5) 

ans = 

    54.0000 4.0000 3.3333 2.5000 2.0000 

enter image description here

+0

la suma del cuadrado dentro del clúster puede no ser siempre un buen criterio, especialmente dado que el clúster jerárquico utiliza de manera predeterminada el método de vinculación única, que por definición solo quiere separación (entre clústeres) y no le importa la compacidad o balance (dentro del clúster) – Amro

+0

Gracias por este código. Fue particularmente útil cuando se combina con el método utilizado en el tercer enlace compartido por Amro. –

-1

Puede usar el paquete NbClust en R que usa 30 índices para determinar la cantidad óptima de clústeres en un conjunto de datos.