En esta ocasión exploraremos de una manera muy básica un algoritmo no supervisado de aprendisaje máquina. Queremos clasificar una serie de datos con la computadora, sin que tengamos algún entrenamiento previo. Cada dato se representa en forma de vectores y estos tendrán una distancia entre ellos. De tal manera que se encuentren agrupamientos. Este tipo de algoritmos son llamados de agrupamiento o de clustering. A su vez, como se ha dicho si contamos un conjunto de datos y queremos identificar relaciones entre ellos, sin tener conocimientos previos sobre ellos, entonces estamos hablando de aprendizaje máquina no supervisado.

El algoritmo que trataremos es uno de los más conocidos y es el agrupamiento jerárquico. Este algoritmo, con una métrica, comienza a detectar distancias entre los datos, agrupando a los datos más cercanos en grupos. Una vez encontrados los primeros grupos, estos se toman como unidades, buscando nuevamente vecinos cercanos. 

Ahora se presenta el algoritmo general de agrupamiento jerárquico, usando el método aglomerativo. para mas detalles se puede consultar http://www.saedsayad.com/clustering_hierarchical.htm

Dados
X es un conjunto de objetos {x1,...,xn}
Una función de distancia d(c1,c2)
para todo i = 1 a n
ci={xi}
fin para todo
C={c1,...,cn}
I=n+1
mientras C.tamaño > 1 hacer
(cmin1, cmin2)=mínimo(ci,cj) para todo ci,cj en C
eleminar cmin1 y cmin2 de C
agregar {cmin1, cmin2} a C
I=I+1
fin mientras

En python, en la librería scipy se tiene incluido el algoritmo de agrupamiento. Mediante los objetos dendrogram y linkage es posible realizar esta tarea. Linkage permite agrupar con diferentes criterios los datos. Los criterios de agrupamiento pueden ser centroid, ward, single, complete, average, etc. Para ver la lista completa de criterios y su significado se puede ver la página https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.cluster.hierarchy.linkage.html Con dendogram se genera el diagrama y se expone a matplotlib. 

Para la demostración se utiliza la base de datos de IRIS Cetosa, contenida en sklearn, que agrupa un conjunto de datos sobre flores.  

# By Jesús Mager
# GPL 3+
from matplotlib import pyplot as plt from scipy.cluster.hierarchy import dendrogram, linkage from sklearn import datasets import numpy as np iris = datasets.load_iris() X=iris.data Z = linkage(X, 'ward') plt.figure(figsize=(10, 8)) plt.title('Dendograma jerárquico para clasificar IRIS setosa') plt.xlabel('Indice de entrada (1-50,51-100,101-150)') plt.ylabel('Distancia') max_d = 10 dendrogram( Z, leaf_rotation=90., leaf_font_size=8., show_contracted=True ) plt.axhline(y=max_d, c='k') plt.show()

Share This