Universidad de Chile Facultad de Ciencias Físicas y Matemáticas Departamento de Ingeniería Eléctrica EL4106 Inteligencia Computacional INFORME TAREA N 4 CLUSTERING Nombre Alumno : Profesor : Profesor Auxiliar : Sebastián Gálvez Javier Ruiz del Solar Daniel Herrmann Felipe Valdés Fecha : 16/06/2014 Santiago, Chile.
Contenido Contenido... II Índice de Figuras y Tablas... III 1. Introducción... 1 2. Desarrollo... 2 2.1. Base de Datos... 2 2.2. K-means... 3 3. Conclusiones... 5 4. Anexos... 6 5. Bibliografía...10
Índice de Figuras y Tablas Figura 1: Clustering K-Means, K=3... 3
Introducción 1. Introducción El objetivo general de esta tarea consiste en identificar agrupaciones de datos similares mediante distintos algoritmos de clustering, analizando su desempeño. Para esto se utilizará la base de datos Wine Data Set, que forma parte del UC Irvine Machine Learning Repository. Esta base de dato contiene 13 características fisicoquímicas medidas para 178 muestras de vino. La base de datos contiene datos de vinos Italianos, producidos en la misma región, pero por 3 productores distintos. Cada productor produce un tipo de vino distinto. Se debe utilizar el algoritmo de clustering k-means para encontrar y caracterizar 3 clusters, luego, realizar lo mismo para el algoritmo fuzzy c-means y comparar los resultados. También se debe analizar la correspondencia entre los productores del vino y clusters al que pertenece la muestra. U. de Chile. FCFM. DIE ~1~
Desarrollo 2. Desarrollo 2.1. Base de Datos El programa generado en el archivo separacion.m contiene una función [entren,clases_entren,prueba,clases_prueba]=separacion(data,clases,pr_r ate), que tiene como objetivo dividir la base de datos en los conjuntos de entrenamiento y prueba, para retornarlos en las matrices respectivas. El argumento data contiene en cada fila las mediciones sobre las distintas características correspondientes a las columnas. El argumento clases es un vector columna que en cada fila contiene el número correspondiente al dígito representado en cada muestra. El argumento pr_rate identifica qué proporción del conjunto total se asignará al conjunto de prueba. Luego de cargar la base de datos de los dígitos trazados en una Tablet utilizando load Base_de_Datos_Tarea4, se puede separar invocando la función de la forma [en en_c pr pr_c]=separacion(trazos,numero,pr_rate); La función de Matlab identifica los conjuntos de datos de distinto productor y extrae aleatoriamente datos para formar el conjunto de prueba. Luego del conjunto original resta estos datos para obtener el conjunto de entrenamiento. El desempeño muestra que la representatividad y la proporción de clases se mantiene en niveles similares como muestra la siguiente tabla. Clase Productor 1 Productor 2 Productor 3 Conjunto [%] [%] [%] Conjunto Original 33.15 39.89 26.97 Conjunto Prueba 33.80 39.44 26.76 Conjunto Entrenamiento 32.71 40.19 27.10 Y se logró que la proporción de conjuntos fuera la pedida. En este caso se logró que el conjunto de prueba fuera 39.89% de los datos. U. de Chile. FCFM. DIE ~2~
Desarrollo 2.2. K-means En el archivo script k-means.m se carga la base de datos utilizada y se separa utilizando la función mencionada en el punto anterior, obtenio conjuntos de entrenamiento y prueba. Luego, se utiliza la función de Matlab [ik, ck] =kmeans(x,k) para separar los datos X en K clusters, almacenando los índices de los clusters asignados en la variable ik, y los centroides que los representan en el espacio de características. Para el caso de generar 3 clusters, se generó un gráfico para visualizar si los clusters obtenidos representaban completamente la partición según los productores, lo cual no se produjo, ya que como se observa en la Figura 1, existen algunos datos que están en un cluster distinto al que debiese corresponder según su producción (se compara según los índices del vector productores de la base de datos). FIGURA 1: CLUSTERING K-MEANS, K=3 U. de Chile. FCFM. DIE ~3~
Desarrollo Posteriormente, se procede a realizar una validación del clustering, utilizando el Índice de Calinski & Harabasz como criterio, el cual se calcula según la siguiente fórmula: Donde N es el número de muestras, y Tr(SB) y Tr(SB) son las trazas de las matrices de dispersión inter- e intra clase. Así, para cada K, se obtiene un índice y se puede calcular el número óptimo de clusters sio el que maximiza el índice CH. Si bien, este criterio no considera la partición a priori conocida (según productores), es un buen método para identificar qué tan compactos son los clusters y qué tan alejados entre ellos están. Sería interesante combinar este indicador junto a uno según un criterio externo, sin embargo por razones de tiempo esto no pudo ser realizado. Finalmente, dado el índice CH para valores de K entre 3 y 8, se obtuvo que el mejor clustering se obtiene para K=3, ya que aumentando el número de clusters el índice disminuye, y considerar un menor número no tiene sentido, ya que se sabe que existen al menos 3. U. de Chile. FCFM. DIE ~4~
Conclusiones 3. Conclusiones El método de Clustering K-means permite dividir las muestras en K grupos (clusters) distintos, y según distintos criterios se puede validar qué tan buena es esta división. En el caso del índice de Calinski & Harabansz, éste considera cuán compactos y separados entre ellos están los clusters, pero no incorpora información sobre una partición de las muestras conocida a priori, por lo que tal vez no es la mejor elección para este caso, pero sí podría ser útil como complemento. Según el criterio utilizado, se observa que conviene realizar un clustering para 3 grupos distintos. U. de Chile. FCFM. DIE ~5~
Anexos 4. Anexos A continuación se muestran los códigos contenidos en cada uno de los archivos entregados en la tarea. separacion.m function [entren, clases_entren, prueba, clases_prueba]= separacion(data,clases,pr_rate) %[entren clases_entren, prueba, clases_prueba]= separacion(data,clases) recibe la matriz 'data' con los datos de %los trazos de los digitos y genera dos conjuntos representativos 'entren' con el (1-pr_rate)*100% de los datos y %'prueba' con el (pr_rate)*100%, y dos conjuntos ('clases_entren' y 'clases_prueba') que llevan información sobre la clase verdadera de cada muestra. N=length(data(:,1)); nfeats=length(data(1,:)); % n de caracteristicas nc=3; % n de clases %Uno los datos con las clases en una sola matriz, para asociar los %índices de las filas a cada clase distinta. newdata=[data,clases]; %ordeno y obtengo los índices de las muestras de cada clase. [aux ind]=sortrows(newdata,14); szs=zeros(1,nc); ind_bord=zeros(1,nc); %debo encontrar los indices de los que efectivamente pertenecen a cada %clase, para guardarlos en una matriz y luego separarlos. for i=1:nc auxaux=(aux(:,nfeats+1)==i); ind_aux=find(auxaux,1,'last'); ind_bord(i)=ind_aux; szs(i)=sum(auxaux(:)); %también calculo cuántos hay por clase. clear auxaux; %Se quiere pr_rate% de los datos por cada clase para el conjunto de prueba pr_szs=round(szs.*pr_rate); ind_bord_pr=cumsum(pr_szs);%esto me sirve para saber cuántos datos seleccionar por cada clase en las iteraciones. sz_prueba=sum(pr_szs); %tamaño total del conjunto de prueba. prueba=zeros(sz_prueba,nfeats+1); r_vec=zeros(sz_prueba,1); %vector que trá los indices seleccionados. %Selección de datos de prueba (20% por cada clase) U. de Chile. FCFM. DIE ~6~
Anexos %primera iteración for i=1:ind_bord_pr(1) r=randi([1 ind_bord(1)]); while(find(r_vec==ind(r))) %selecciono un indice al azar dentro del rango de la clase '0'. % y me aseguro que sea distinto a alguno seleccionado. r=randi([1 ind_bord(1)]); prueba(i,:)=newdata(ind(r),:); %guardo los datos y la clase a la que pertenece el dato elegido en el conjunto de prueba r_vec(i)=ind(r); %guardo el indice para luego borrar ese dato del conjunto y que lo que quede sea el de entrenamiento % repito para el resto de las clases. for j=2:nc for i=(ind_bord_pr(j-1)+1):ind_bord_pr(j) r=randi([(ind_bord(j-1)+1) ind_bord(j)]); while(find(r_vec==ind(r))) r=randi([(ind_bord(j-1)+1) ind_bord(j)]); prueba(i,:)=newdata(ind(r),:); r_vec(i)=ind(r); prueba2 = prueba(randperm(length(prueba(:,1))),:); %desordeno las filas prueba=prueba2; clear prueba2; %extraigo del conjunto original los datos utilizados para el conjunto de prueba entren=newdata; entren(r_vec,:)=[]; sz_entren=length(entren(:,1)); %Verificar representatividad %calculo cantidad de datos por clase en cada conjunto [aux ind]=sortrows(prueba,14); [aux2 ind2]=sortrows(entren,14); ver_szs_prueba=zeros(1,nc); ver_szs_entren=zeros(1,nc); for i=1:nc auxaux=(aux(:,nfeats+1)==i); auxaux2=(aux2(:,nfeats+1)==i); ver_szs_prueba(i)=sum(auxaux(:)); %calculo cuántos datos hay por clase en el conjunto de prueba construido. ver_szs_entren(i)=sum(auxaux2(:)); %y cuántos por clase en el conjunto de entrenamiento clear auxaux; clear auxaux2; U. de Chile. FCFM. DIE ~7~
Anexos %verifico proporciones parecidas por clase en ambos conjuntos. (DESCOMENTAR %PARA VERIFICAR) % repr_total=szs./n % repr_prueba=ver_szs_prueba./sz_prueba % repr_entren=ver_szs_entren./sz_entren %verifico proporción 80/20 de los datos en cada conjunto. % sz_entren/n % sz_prueba/n %Separo datos de información sobre la clase a la que pertenece cada uno. clases_entren = entren(:,14); entren(:,14)=[]; clases_prueba = prueba(:,14); prueba(:,14)=[]; k_means.m load Base_de_Datos_Tarea4 %a=muestras; for i=1:13 a(:,i)=muestras(:,i)./norm(muestras(:,i)); N=length(a(:,1)); Nfeats=length(a(1,:)); [en, en_c, pr, pr_c]=separacion(a,productor,0.4); %***Descomentar para "ver" división en clusters segun sus indices. %K=3; %[ik ck]=kmeans(a,k); % ind=1:n; % plot(ind,ik,'.') % title('indices asociados a K-means') % axis([1 N 0 K+1]) % xlabel('indice de muestra') % ylabel('indice del cluster asociado') U. de Chile. FCFM. DIE ~8~
Anexos %******* VALIDACION******* CH=zeros(1,6); for l=3:8 K=l; [ik ck]=kmeans(a,k); %matriz de particion gamma=zeros(k,n); for i=1:k for j=1:n gamma(i,j)=(ik(j)==i); m=mean(ck); %numero de datos por cluster Nc=zeros(1,K); ind=cell(k,1); for i=1:k Nc(i)=sum(ik==i); %**** Dispersión Intra-cluster **** Sw=zeros(Nfeats,Nfeats); for i=1:k; for j=1:n; Sw=Sw+gamma(i,j)*((a(j,:)-ck(i,:))'*(a(j,:)-ck(i,:))); %**** Dispersión Entre Clusters ***** Sb=zeros(Nfeats,Nfeats); for i=1:k; Sb=Sb+Nc(i)*((ck(i,:)-m)'*(ck(i,:)-m)); %Indice de Calinski y Harabasz CH(l)=(trace(Sb)/(K-1))/(trace(Sw)/(N-K)); [mch,mk]=max(ch); display(sprintf('el mejor clustering se logra para K=%i',mk)) U. de Chile. FCFM. DIE ~9~
Bibliografía 5. Bibliografía Presentación EL4106 - Inteligencia Computacional - ValidacionClustering - Otoño 2014. Centro de documentación de Mathworks, Sección de K-means http://www.mathworks.com/help/stats/kmeans.html U. de Chile. FCFM. DIE ~10~