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.

Análisis de clústeres

En este ejemplo se muestra cómo examinar las similitudes y diferencias de observaciones u objetos mediante el análisis de clústeres en Statistics and Machine Learning Toolbox™. Los datos a menudo caen naturalmente en grupos (o clústeres) de observaciones, donde las características de los objetos en el mismo clúster son similares y las características de los objetos en diferentes clústeres son diferentes.

Medios K y clustering jerárquico

El cuadro de herramientas Estadísticas y Machine Learning incluye funciones para realizar clústeres de medios K y agrupación jerárquica.

La agrupación en clústeres de K-means es un método de particionamiento que trata las observaciones en los datos como objetos que tienen ubicaciones y distancias entre sí. Divide los objetos en clústeres mutuamente excluyentes de K, de modo que los objetos de cada clúster estén lo más cerca posible entre sí y lo más lejos posible de los objetos de otros clústeres. Cada clúster se caracteriza por su centroide o punto central. Por supuesto, las distancias utilizadas en la agrupación en clústeres 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úster. El árbol no es un único conjunto 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 agrupación en clústeres es más adecuado en la aplicación.

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

rng(6,'twister') 

Datos de Iris de Fisher

En la década de 1920, los botánicos recogieron mediciones sobre la longitud del sépalo, la anchura del sépalo, la longitud del pétalo y la anchura de los pétalos de 150 especímenes de iris, 50 de cada una de las tres especies. Las mediciones se conocieron 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 hay una manera obvia de agrupar los datos. Por el momento, ignoraremos la información de la especie y agruparemos los datos usando sólo las mediciones brutas. Cuando hayamos terminado, podemos comparar los racimos resultantes con las especies reales, para ver si los tres tipos de iris poseen características distintas.

Agrupación de datos de iris de Fisher mediante clustering de K-Means

La función realiza la agrupación en clústeres de K-Means, mediante un algoritmo iterativo que asigna objetos a clústeres para que la suma de distancias de cada objeto a su centroide de clúster, en todos los clústeres, sea mínima.kmeans Utilizado en los datos del iris de Fisher, encontrará las agrupaciones naturales entre los especímenes de iris, basados en sus medidas de sépalo y pétalo. Con la agrupación en clústeres de 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 establecido en 2 y utilizando la distancia euclidiana cuadrada.kmeans Para hacerse una idea de lo bien separados que están los clústeres resultantes, puede crear una gráfica de silueta. El trazado de silueta muestra una medida de lo cerca que está cada punto de un clúster a los puntos de los clústeres vecinos.

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

En el trazado 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 puntos de otros clústeres.

Resulta que la cuarta medida en estos datos, el ancho del pétalo, está altamente correlacionado con la tercera medida, la longitud del pétalo, por lo que 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 símbolos diferentes para cada clúster creado por , puede identificar los puntos con valores de silueta pequeños como aquellos puntos que están cerca de 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 clúster se trazan utilizando X circulares. Tres de los puntos del clúster inferior (trazados con triángulos) están muy cerca de los puntos del clúster superior (trazados con cuadrados). Dado que el clúster superior está tan distribuido, esos tres puntos están más cerca del centroide del clúster inferior que del clúster superior, aunque los puntos estén separados de la mayor parte de los puntos de su propio clúster por un hueco. Dado que k-means clustering solo tiene en cuenta las distancias, y no las densidades, puede producirse este tipo de resultado.

Puede aumentar el número de clústeres para ver si puede encontrar más estructura de agrupación en los datos.kmeans Esta vez, utilice el argumento opcional de par nombre-valor 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      146.424      2      1        5      144.333      3      1        4      143.924      4      1        3       143.61      5      1        1      143.542      6      1        2      143.414      7      1        2      143.023      8      1        2      142.823      9      1        1      142.786     10      1        1      142.754 Best total sum of distances = 142.754 

En cada iteración, el algoritmo (consulte ) reasigna puntos entre clústeres para reducir la suma de distancias 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 distancias y el número de reasignaciones disminuyen en cada iteración hasta que el algoritmo alcanza un mínimo. El algoritmo utilizado en consta de dos fases.kmeans En el ejemplo aquí, la segunda fase del algoritmo no realizó ninguna reasignación, lo que indica que la primera fase alcanzó un mínimo después de solo unas pocas iteraciones.

De forma predeterminada, comienza el proceso de agrupación en clústeres mediante un conjunto seleccionado aleatoriamente de ubicaciones centroides iniciales.kmeans El algoritmo puede converger a una solución que es un mínimo local; es decir, puede particionar los datos de modo que mover cualquier punto a un clúster diferente aumente la suma total de 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 (mínimo local) que tienen una suma total de distancias más baja 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 agrupación en clústeres 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, 9 iterations, total sum of distances = 78.8557. Replicate 2, 10 iterations, total sum of distances = 78.8557. Replicate 3, 8 iterations, total sum of distances = 78.8557. Replicate 4, 8 iterations, total sum of distances = 78.8557. Replicate 5, 1 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 dos soluciones diferentes.kmeans Sin embargo, la solución final que devuelve es la que tiene la suma total más baja de distancias, en todas las réplicas.kmeans El tercer argumento de salida contiene la suma de 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'); 

Una vez más, puede trazar los datos sin procesar para ver cómo ha 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 ha dividido el clúster superior de la solución de dos clústeres y que esos dos clústeres están muy cerca uno del otro.kmeans Dependiendo de lo que pretenda hacer con estos datos después de agruparlos 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 de contiene los valores de silueta para cada punto, que puede utilizar para comparar las dos soluciones cuantitativamente.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 únicamente 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 utilizando una distancia diferente. La distancia del coseno podría tener sentido para estos datos porque ignoraría los tamaños absolutos de las medidas 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 y sépalos de forma similar, podrían no estar cerca con respecto a la distancia euclidiana cuadrada, pero estarían cerca con respecto a la distancia del coseno.

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

A partir de la gráfica de silueta, estos racimos parecen estar ligeramente mejor separados que los que se encuentran utilizando 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 del de la gráfica de silueta anterior. Esto se debe a que elige las asignaciones de clúster iniciales al azar.kmeans

Al trazar los datos sin procesar, puede ver las diferencias en las formas de clúster creadas utilizando 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 de 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, porque un centroide con respecto a la distancia del coseno corresponde a una media línea del origen en el espacio de los datos sin procesar. Sin embargo, puede crear un trazado de coordenadas paralelo de los puntos de datos normalizados para visualizar las diferencias entre los centroides de 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 parcela se desprende claramente que los especímenes de cada uno de los tres racimos tienen tamaños relativos claramente diferentes 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 dos segundos pétalos y sépalos de los dos racimos se superponen en tamaño, sin embargo, los del tercer clúster se superponen más que el segundo. También se puede ver que el segundo y tercer racimo incluyen algunos especímenes que son muy similares entre sí.

Debido a que conocemos las especies de cada observación en los datos, se pueden 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 gráfica, los racimos creados con distancia de coseno difieren de los grupos de especies para 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 

Agrupación de datos de iris de Fisher mediante clustering jerárquico

La agrupación en clústeres de K-Means produjo una única partición de los datos del 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 justo eso, creando un árbol jerárquico de clústeres.

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

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

La correlación copénica es una manera de verificar que el árbol de 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 por pares entre las observaciones se correlacionan con sus distancias reales por pares. 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 de este árbol es mucho mayor que los nodos restantes, lo que confirma lo que ha visto en la agrupación en clústeres de K-Means: hay dos grupos grandes y distintos de observaciones. Dentro de cada uno de esos dos grupos, puede ver que los niveles más bajos de grupos emergen a medida que considera 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.

Según los resultados de la agrupación en clústeres de K-Means, el coseno también podría ser una buena opción de medida de distancia. El árbol jerárquico resultante es muy diferente, lo que sugiere una manera muy diferente de ver 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 los especímenes 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 la distancia euclidiana. Esto es exactamente lo que cabría esperar para estos datos, ya que la distancia del coseno calcula una distancia en pares cero para los objetos que están en la misma "dirección" desde el origen.

Con 150 observaciones, la gráfica está desordenada, pero puede hacer un dendrograma simplificado que no muestre 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 una sola muestra (etiquetada como nodo hoja 5) que no está cerca de ningún otro.

[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 utilizar la función para cortar el árbol y particionar explícitamente las observaciones en clústeres específicos, como con K-Means.cluster Mediante la jerarquía de la distancia del 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 cree cuatro clústeres y, a continuación, trace 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 la agrupación jerárquica con distancia coseno son cualitativamente similares a los resultados de K-Means, utilizando tres clústeres. Sin embargo, la creación de un árbol de clústerjero jerárquico le permite visualizar, todo a la vez, lo que requeriría una experimentación considerable con diferentes valores para K en la agrupación en clústeres K-Means.

La agrupación jerárquica también le permite experimentar con diferentes vínculos. Por ejemplo, la agrupación de los datos de iris con un solo vínculo, que tiende a unir objetos a distancias mayores que la distancia media, proporciona una interpretación muy diferente de la estructura de 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 = [];