Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Cluster Analysis

En este ejemplo se muestra cómo examinar las similitudes y las diferencias de observaciones u objetos mediante el análisis de clústeres en estadísticas y machine learning Toolbox™. Los datos suelen caer de forma natural en grupos (o clústeres) de observaciones, donde las características de los objetos del mismo clúster son similares y las características de los objetos de distintos clústeres son diferentes.

K-means y clustering jerárquico

El cuadro de herramientas estadísticas y aprendizaje automático incluye funciones para realizar clústeres K-means y clustering jerárquico.

K-means clustering es un método de particionamiento que trata las observaciones en sus datos como objetos que tienen ubicaciones y distancias entre sí. Divide los objetos en K clústeres mutuamente excluyentes, de manera que los objetos dentro de cada clúster están tan cerca entre sí como sea posible, y tan lejos de los objetos de otros clústeres como sea posible. Cada cluster se caracteriza por su centroide, o punto central. Por supuesto, las distancias utilizadas en el clustering a menudo no representan distancias espaciales.

La agrupación jerárquica es una forma de investigar la agrupación en los datos, simultáneamente en una variedad de escalas de distancia, mediante la creación de un árbol de clústeres. El árbol no es un conjunto único de clústeres, como en K-means, sino más bien una jerarquía de varios niveles, donde los clústeres de un nivel se unen como clústeres en el siguiente nivel superior. Esto le permite decidir qué escala o nivel de clustering es más apropiado en su aplicación.

Algunas de las funciones utilizadas en este ejemplo llaman a MATLAB® funciones de generación de números aleatorios integradas. Para duplicar los resultados exactos que se muestran en este ejemplo, debe ejecutar el comando siguiente para establecer el generador de números aleatorios en un estado conocido. Si no establece el estado, los resultados pueden diferir en formas triviales, por ejemplo, puede ver los clústeres numerados en un orden diferente. También existe la posibilidad de que se pueda producir una solución de clúster subóptima (el ejemplo incluye una explicación de las soluciones subóptimas, incluidas las formas de evitarlas).

rng(14,'twister'); 

Los datos de iris de Fisher

En la década de 1920, los botánicos recolectan mediciones en la longitud del sépalo, ancho sépalo, longitud del pétalo, y anchura del pétalo de 150 especímenes de iris, 50 de cada una de las tres especies. Las mediciones se conocían como el conjunto de datos de iris de Fisher.

Cada observación en este conjunto de datos proviene de una especie conocida, por lo que ya existe una forma obvia de agrupar los datos. Por el momento, vamos a ignorar la información de la especie y agrupar los datos utilizando sólo las mediciones en bruto. Cuando hayamos terminado, podemos comparar los racimos resultantes con las especies reales, para ver si los tres tipos de iris poseen características distintivas.

Clustering de los datos de iris de Fisher usando K-means clustering

La función realiza la agrupación en clústeres K-means, utilizando un algoritmo iterativo que asigna objetos a los clústeres para que la suma de las distancias de cada objeto a su centroide de clúster, sobre todos los clústeres, sea un mínimo.kmeans Utilizado en los datos de iris de Fisher, se encuentra las agrupaciones naturales entre los especímenes de iris, basado en sus mediciones sepales y pétalo. Con la agrupación en clústeres K-means, debe especificar el número de clústeres que desea crear.

En primer lugar, cargue los datos y llame con el número deseado de clústeres establecidos en 2 y utilizando la distancia euclidiana cuadrada.kmeans Para tener una idea de cuán bien separados están los clústeres resultantes, puede crear una gráfica de silueta. La gráfica de silueta muestra una medida de la cercanía de cada punto de un clúster con los puntos de los clústeres vecinos.

load fisheriris [cidx2,cmeans2] = kmeans(meas,2,'dist','sqeuclidean'); [silh2,h] = silhouette(meas,cidx2,'sqeuclidean'); 

Desde la gráfica de silueta, puede ver que la mayoría de los puntos de ambos clústeres tienen un valor de silueta grande, mayor que 0,8, lo que indica que esos puntos están bien separados de los clústeres vecinos. Sin embargo, cada clúster también contiene algunos puntos con valores de silueta bajos, lo que indica que están cerca de los puntos de otros clústeres.

Resulta que la cuarta medida en estos datos, la anchura del pétalo, está altamente correlacionada con la tercera medida, la longitud del pétalo, y por lo tanto una gráfica 3D de las tres primeras mediciones da una buena representación de los datos, sin recurrir a cuatro dimensiones. Si traza los datos, utilizando diferentes símbolos para cada clúster creado por, puede identificar los puntos con valores de silueta pequeños como aquellos puntos que están cerca de los puntos de otros clústeres.kmeans

ptsymb = {'bs','r^','md','go','c+'}; for i = 1:2     clust = find(cidx2==i);     plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});     hold on end plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'ko'); plot3(cmeans2(:,1),cmeans2(:,2),cmeans2(:,3),'kx'); hold off xlabel('Sepal Length'); ylabel('Sepal Width'); zlabel('Petal Length'); view(-137,10); grid on 

Los centroides de cada cluster se trazan usando un círculo de X. Tres de los puntos del cluster inferior (trazados con triángulos) están muy cerca de los puntos del cluster superior (trazados con cuadrados). Dado que el clúster superior está tan extendido, esos tres puntos están más cerca del centroide del clúster inferior que el del clúster superior, aunque los puntos se separan de la mayor parte de los puntos de su propio clúster por un hueco. Dado que la agrupación en clústeres K-means solo considera las distancias y no las densidades, este tipo de resultado puede producirse.

Puede aumentar el número de clústeres para ver si puede encontrar más estructura de agrupamiento en los datos.kmeans Esta vez, use el argumento de par nombre-valor opcional para imprimir información sobre cada iteración en el algoritmo de agrupación en clústeres.'Display'

[cidx3,cmeans3] = kmeans(meas,3,'Display','iter'); 
  iter  phase      num          sum      1      1      150      79.1364      2      1        1      78.8557 Best total sum of distances = 78.8557 

En cada iteración, el algoritmo (consulte) reasigna puntos entre clústeres para reducir la suma de las distancias de punto a centroide y, a continuación, vuelve a calcular los centroides de clúster para las nuevas asignaciones de clúster.kmeansAlgoritmos Observe que la suma total de las distancias y el número de reasignaciones disminuyen en cada iteración hasta que el algoritmo alcanza un mínimo. El algoritmo utilizado consiste en dos fases.kmeans En el ejemplo aquí, la segunda fase del algoritmo no hizo ninguna reasignación, indicando que la primera fase alcanzó un mínimo después de sólo unas cuantas iteraciones.

De forma predeterminada, comienza el proceso de agrupación en clústeres mediante un conjunto seleccionado aleatoriamente de ubicaciones de centroide iniciales.kmeans El algoritmo puede converger en una solución que sea un mínimo local; es decir, puede particionar los datos de tal forma que mover un solo punto a un clúster diferente aumente la suma total de las distancias.kmeanskmeans Sin embargo, al igual que con muchos otros tipos de minimizaciones numéricas, la solución que llega a veces depende de los puntos de partida.kmeans Por lo tanto, pueden existir otras soluciones (minima locales) que tengan una suma total menor de distancias para los datos. Puede usar el argumento de par nombre-valor opcional para probar diferentes soluciones.'Replicates' Cuando se especifica más de una réplica, se repite el proceso de clustering a partir de diferentes centroides seleccionados aleatoriamente para cada réplica. a continuación, devuelve la solución con la suma total más baja de distancias entre todas las réplicas.kmeanskmeans

[cidx3,cmeans3,sumd3] = kmeans(meas,3,'replicates',5,'display','final'); 
Replicate 1, 3 iterations, total sum of distances = 78.8557. Replicate 2, 2 iterations, total sum of distances = 78.8557. Replicate 3, 10 iterations, total sum of distances = 142.754. Replicate 4, 6 iterations, total sum of distances = 78.8514. Replicate 5, 5 iterations, total sum of distances = 78.8514. Best total sum of distances = 78.8514 

La salida muestra que, incluso para este problema relativamente simple, existen mínimos no globales. Cada una de estas cinco réplicas comenzó a partir de un conjunto diferente de centroides iniciales. Dependiendo de dónde comenzó, alcanzó una de las dos soluciones diferentes.kmeans Sin embargo, la solución final que devuelve es la que tiene la suma total más baja de distancias, sobre todas las réplicas.kmeans El tercer argumento de salida contiene la suma de las distancias dentro de cada clúster para esa mejor solución.

sum(sumd3) 
 ans =     78.8514  

Una gráfica de silueta para esta solución de tres clústeres indica que hay un clúster que está bien separado, pero que los otros dos clústeres no son muy distintos.

[silh3,h] = silhouette(meas,cidx3,'sqeuclidean'); 

De nuevo, puede trazar los datos sin procesar para ver cómo se han asignado los puntos a los clústeres.kmeans

for i = 1:3     clust = find(cidx3==i);     plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});     hold on end plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'ko'); plot3(cmeans3(:,1),cmeans3(:,2),cmeans3(:,3),'kx'); hold off xlabel('Sepal Length'); ylabel('Sepal Width'); zlabel('Petal Length'); view(-137,10); grid on 

Puede ver que se ha dividido el clúster superior de la solución de dos clústeres y que esos dos grupos están muy próximos entre sí.kmeans En función de lo que pretenda hacer con estos datos después de agruparse en clústeres, esta solución de tres clústeres puede ser más o menos útil que la solución anterior de dos clústeres. El primer argumento de salida contiene los valores de silueta para cada punto, que puede utilizar para comparar cuantitativamente las dos soluciones.silhouette El valor medio de la silueta era mayor para la solución de dos clústeres, lo que indica que es una mejor respuesta puramente desde el punto de vista de la creación de clústeres distintos.

[mean(silh2) mean(silh3)] 
 ans =      0.8504    0.7357  

También puede agrupar estos datos con una distancia diferente. La distancia del coseno podría tener sentido para estos datos porque ignoraría los tamaños absolutos de las mediciones y solo consideraría sus tamaños relativos. Por lo tanto, dos flores que eran de diferentes tamaños, pero que tenían pétalos de forma similar y sépalos, podría no estar cerca con respecto a la distancia euclidiana cuadrada, pero estaría cerca con respecto a la distancia del coseno.

[cidxCos,cmeansCos] = kmeans(meas,3,'dist','cos'); 

Desde la gráfica de la silueta, estos racimos parecen estar solo ligeramente mejor separados que los encontrados usando la distancia euclidiana cuadrada.

[silhCos,h] = silhouette(meas,cidxCos,'cos'); [mean(silh2) mean(silh3) mean(silhCos)] 
 ans =      0.8504    0.7357    0.7491  

Observe que el orden de los clústeres es diferente al de la gráfica de silueta anterior. Esto se debe a que elige las asignaciones iniciales del clúster al azar.kmeans

Al trazar los datos sin procesar, puede ver las diferencias en las formas de clúster creadas con las dos distancias diferentes. Las dos soluciones son similares, pero los dos clústeres superiores son alargados en la dirección del origen cuando se utiliza la distancia del coseno.

for i = 1:3     clust = find(cidxCos==i);     plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});     hold on end hold off xlabel('Sepal Length'); ylabel('Sepal Width'); zlabel('Petal Length'); view(-137,10); grid on 

Esta gráfica no incluye los centroides del clúster, ya que un centroide con respecto a la distancia del coseno corresponde a una media línea desde el origen en el espacio de los datos sin procesar. Sin embargo, puede crear un trazado de coordenadas paralelas de los puntos de datos normalizados para visualizar las diferencias entre los centroides del clúster.

lnsymb = {'b-','r-','m-'}; names = {'SL','SW','PL','PW'}; meas0 = meas ./ repmat(sqrt(sum(meas.^2,2)),1,4); ymin = min(min(meas0)); ymax = max(max(meas0)); for i = 1:3     subplot(1,3,i);     plot(meas0(cidxCos==i,:)',lnsymb{i});     hold on;     plot(cmeansCos(i,:)','k-','LineWidth',2);     hold off;     title(sprintf('Cluster %d',i));     xlim([.9, 4.1]);     ylim([ymin, ymax]);     h_gca = gca;     h_gca.XTick = 1:4;     h_gca.XTickLabel = names; end 

De esta trama se desprende claramente que los especímenes de cada uno de los tres racimos tienen un tamaño relativamente diferente de pétalos y sépalos en promedio. El primer racimo tiene pétalos que son estrictamente más pequeños que sus sépalos. Los pétalos y sépalos de los segundos dos racimos se superponen en tamaño, sin embargo, los del tercer cluster se superponen más que el segundo. También puede ver que los clústeres segundo y tercero incluyen algunos especímenes que son muy similares entre sí.

Debido a que conocemos las especies de cada observación en los datos, puede comparar los racimos descubiertos por la especie real, para ver si las tres especies tienen características físicas discerniblemente diferentes.kmeans De hecho, como muestra la siguiente trama, los racimos creados utilizando la distancia del coseno difieren de los grupos de especies por sólo cinco de las flores. Esos cinco puntos, trazados con estrellas, están todos cerca del límite de los dos racimos superiores.

subplot(1,1,1); for i = 1:3     clust = find(cidxCos==i);     plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});     hold on end xlabel('Sepal Length'); ylabel('Sepal Width'); zlabel('Petal Length'); view(-137,10); grid on sidx = grp2idx(species); miss = find(cidxCos ~= sidx); plot3(meas(miss,1),meas(miss,2),meas(miss,3),'k*'); legend({'setosa','versicolor','virginica'}); hold off 

Clustering de datos de iris de Fisher mediante clustering jerárquico

La agrupación en clústeres K-means produjo una sola partición de los datos de iris, pero es posible que también desee investigar diferentes escalas de agrupación en los datos. La agrupación jerárquica le permite hacer precisamente eso, creando un árbol jerárquico de clústeres.

En primer lugar, cree un árbol de clúster utilizando las distancias entre las observaciones en los datos de iris. Empiece usando la distancia euclidiana.

eucD = pdist(meas,'euclidean'); clustTreeEuc = linkage(eucD,'average'); 

La correlación cofenética es una forma de comprobar que el árbol del clúster es coherente con las distancias originales. Los valores grandes indican que el árbol se ajusta bien a las distancias, en el sentido de que los vínculos en parejas entre las observaciones se correlacionan con sus distancias reales en parejas. Este árbol parece ser un ajuste bastante bueno a las distancias.

cophenet(clustTreeEuc,eucD) 
 ans =      0.8770  

Para visualizar la jerarquía de clústeres, puede trazar un dendrograma.

[h,nodes] = dendrogram(clustTreeEuc,0); h_gca = gca; h_gca.TickDir = 'out'; h_gca.TickLength = [.002 0]; h_gca.XTickLabel = []; 

El nodo raíz en este árbol es mucho más alto que los nodos restantes, confirmando lo que usted vio de la agrupación en clústeres K-means: hay dos grupos grandes y distintos de observaciones. Dentro de cada uno de esos dos grupos, se puede ver que los niveles más bajos de los grupos surgen a medida que se consideran escalas más pequeñas y más pequeñas en la distancia. Hay muchos niveles diferentes de grupos, de diferentes tamaños, y en diferentes grados de distinción.

Sobre la base de los resultados de la agrupación en clústeres K-means, el coseno también podría ser una buena opción de medición de distancia. El árbol jerárquico resultante es bastante diferente, sugiriendo una manera muy diferente de mirar la estructura del grupo en los datos del iris.

cosD = pdist(meas,'cosine'); clustTreeCos = linkage(cosD,'average'); cophenet(clustTreeCos,cosD) 
 ans =      0.9360  
[h,nodes] = dendrogram(clustTreeCos,0); h_gca = gca; h_gca.TickDir = 'out'; h_gca.TickLength = [.002 0]; h_gca.XTickLabel = []; 

El nivel más alto de este árbol separa las muestras de iris en dos grupos muy distintos. El dendrograma muestra que, con respecto a la distancia del coseno, las diferencias dentro del grupo son mucho más pequeñas en relación con las diferencias entre grupos que en el caso de la distancia euclidiana. Esto es exactamente lo que cabría esperar de estos datos, ya que la distancia del coseno calcula una distancia en pares de cero para los objetos que están en la misma "dirección" desde el origen.

Con 150 observaciones, la trama está abarrotado, pero se puede hacer un dendrograma simplificado que no muestra los niveles más bajos del árbol.

[h,nodes] = dendrogram(clustTreeCos,12); 

Los tres nodos más altos de este árbol separan tres grupos de igual tamaño, más un solo espécimen (etiquetado como nodo hoja 5) que no está cerca de otros.

[sum(ismember(nodes,[11 12 9 10])) sum(ismember(nodes,[6 7 8])) ...                   sum(ismember(nodes,[1 2 4 3])) sum(nodes==5)] 
 ans =      54    46    49     1  

Para muchos propósitos, el dendrograma podría ser un resultado suficiente. Sin embargo, puede ir un paso más allá y usar la función para cortar el árbol y dividir explícitamente las observaciones en clústeres específicos, como con K-means.cluster Utilizando la jerarquía desde la distancia de coseno para crear clústeres, especifique una altura de vinculación que cortará el árbol por debajo de los tres nodos más altos y creará cuatro clústeres y, a continuación, trazará los datos sin procesar agrupados.

hidx = cluster(clustTreeCos,'criterion','distance','cutoff',.006); for i = 1:5     clust = find(hidx==i);     plot3(meas(clust,1),meas(clust,2),meas(clust,3),ptsymb{i});     hold on end hold off xlabel('Sepal Length'); ylabel('Sepal Width'); zlabel('Petal Length'); view(-137,10); grid on 

Esta gráfica muestra que los resultados de clustering jerárquico con distancia de coseno son cualitativamente similares a los resultados de K-means, utilizando tres clústeres. Sin embargo, la creación de un árbol de clúster jerárquico le permite visualizar, todos a la vez, lo que requeriría una experimentación considerable con valores diferentes para K en clústeres K-means.

La agrupación jerárquica también le permite experimentar con diferentes vínculos. Por ejemplo, agrupar los datos de iris con un enlace único, que tiende a vincular objetos entre sí a distancias mayores que la distancia promedio, da una interpretación muy diferente de la estructura en los datos.

clustTreeSng = linkage(eucD,'single'); [h,nodes] = dendrogram(clustTreeSng,0); h_gca = gca; h_gca.TickDir = 'out'; h_gca.TickLength = [.002 0]; h_gca.XTickLabel = [];