Kiko Correoso

Análisis Cluster (II): Clasificación no supervisada mediante clasificación jerárquica aglomerativa

(Este es el segundo capítulo de la mini-serie de artículos sobre análisis cluster que estamos haciendo en pybonacci, si todavía no has leído el artículo inicial échale un ojo ahora).
Como vimos anteriormente, existen diferentes formas de hacer clustering y, como también comentamos anteriormente, una de las más habituales es el clustering jerárquico.
El clustering jerárquico asociativo pretende, partiendo de m observaciones, ir encontrado agrupaciones de forma jerarquizada. Para ello, primero busca similitudes entre las observaciones y después procura asociar en grupos o ‘clusters’ las observaciones que se encuentran ‘más cercanas’ o presentan mayor similitud.
Si os acordáis, en el primer capítulo de esta mini-serie, entrecomillamos la palabra ‘similitud’. Vamos a ver qué significa esto de similitud en general y en nuestro ejemplo concreto (ver capítulo anterior de la serie para conocer el ejemplo). Dependiendo del problema concreto necesitaremos asociar las variables para poder medir como son de similares o a qué distancia se encuentran entre sí. Estas medidas de asociación (similitud o distancia) dependerán del problema concreto con el que nos encontremos y no se usaría lo mismo para variables booleanas, binarias, reales,… Gracias al módulo scipy.spatial.distance podemos ver muchas de estas medidas de asociación en las que no voy a entrar en detalle. Un resumen de la mayoría de ellas lo podéis ver en el siguiente enlace del profesor José Ángel Gallardo San Salvador, nuevamente. En el ejemplo propuesto usaremos la correlación como medida de asociación ya que es una medida invariante aunque las variables se escalen y/o se les sumen/resten parámetros (algo muy útil para el caso que nos ocupa).
Leer más »Análisis Cluster (II): Clasificación no supervisada mediante clasificación jerárquica aglomerativa

Análisis cluster (I): Introducción

Vamos a empezar una mini-serie de artículos sobre clasificación no supervisada que dividiré, en principio, en tres capítulos. En este primer capítulo no vamos a ver nada de python (oooooohhhhh) pero creo que es necesario dividirlo así para no hacerlos excesivamente pesados y largos y para introducir un poco la teoría de forma muy somera. ¿Vamos al lío?
Una de las actividades más propias del ser humano consiste en clasificar ‘cosas’ en clases o categorías (¡¡nos encanta etiquetar!!). Esto nos permite simplificar la inmensa cantidad de información que nos está llegando en todo momento:

  • clase baja, media y alta
  • Líquido, sólido, gaseoso (y plasma, y condensado de Bosé-Einstein, y…)
  • Friki, flipado, raro, geek, normal,…

A lo largo de todo el texto de esta mini-serie usaré términos tanto en español como en inglés puesto que, normalmente, la terminología anglosajona es también la más habitual en los textos en español.
Brevísima introducción teórica
El análisis cluster es el nombre genérico que recibe un tipo de procedimientos de aprendizaje NO supervisado (unsupervised learning) usados para crear clasificaciones o agrupaciones. De forma más detallada, se podría decir que consiste en procedimientos de clasificación no supervisada (no existe una información previa) sobre una muestra de ‘individuos’ que intenta reorganizarlos en grupos que pretenden ser homogéneos. Estos grupos son los que se conocen como ‘clusters’ y esta es la palabra que usaremos a lo largo del presente texto puesto que es la más ampliamente usada en la literatura tanto en inglés, obviamente, como en español.
Leer más »Análisis cluster (I): Introducción

Videos interesantes de la PyConCa 2012

A pure python genetic algorithms framework [youtube https://www.youtube.com/watch?v=YYDdBv430sU] Dancing with big data: Disco + inferno [youtube https://www.youtube.com/watch?v=D3VFq97NhEk] Integrating geocode data with python [youtube https://www.youtube.com/watch?v=MhsbivEDTds] Science and python: retrospective of a (mostly) successful decade [youtube https://www.youtube.com/watch?v=F4rFuIb1Ie4] Server log analysis with pandas [youtube https://www.youtube.com/watch?v=ZOpR3P-jAno] Writing self-documenting scientific code using physical quantities [youtube… Leer más »Videos interesantes de la PyConCa 2012

Recopilación del PyData NYC 2012

Francesc Alted: PyTables: An on-disk binary data container, query engine and computational kernel. Stefan van der Walt: An introduction to numpy: the notebook version. Jake Vanderplas: Matplotlib tutorial. Jake Vanderplas: Tutorial: Machine learning for astrophysics with scikit-learn. Thomas Wiecki: Simulated Algorithmic Trading with Zipline: Backtesting, Statistics, and Optimization. Thomas Wiecki:… Leer más »Recopilación del PyData NYC 2012

Análisis de componentes principales con python

Esta entrada también se podría haber llamado:
‘Reducción de la dimensión’
‘Comprimiendo imágenes usando análisis de componentes principales y python’
Para la siguiente entrada se ha usado python 2.7.2, numpy 1.6.1, matplotlib 1.1.0 y sklearn 0.10

El análisis de componentes principales (PCA, por sus siglas en inglés, Principal Component Analysis) es una técnica que trata de reducir el número de dimensiones (número de variables) de un conjunto de datos intentando, a su vez, conservar la mayor cantidad de información. Es una técnica extremadamente útil como análisis exploratorio de datos (exploratory data analysis, pongo algunos términos en inglés porque a veces pueden resultar extraños en castellano), cuando se tiene demasiada información (muchas dimensiones, variables) y no se puede analizar correctamente la información. Se ha usado de forma exitosa para encontrar patrones, determinar ‘outliers’, compresión de imágenes,… Más adelante se explicará brevemente el proceso matemático que hay detrás.
Para el presente artículo vamos a usar el PCA para obtener imágenes comprimidas. Vamos a trabajar con una imagen monocromática extraída de la galería de AdeRussell en flickr. (con licencia cc 2.0) La imagen en cuestión es la siguiente:

Martin Luther King Memorial and the Washington Monument por AdeRussell

Martin Luther King Memorial and the Washington Monument por AdeRussell


Primero la guardaremos en nuestro equipo usando la biblioteca urllib2 disponible en la biblioteca estándar de vuestra instalación de python:
[sourcecode language=”python”]
import urllib2
## Leemos la imagen desde la url
url = ‘http://farm9.staticflickr.com/8312/8059125132_bed732fcc8_z.jpg’
kk = urllib2.urlopen(url).read()
## Guardamos la imagen en el directorio donde nos encontremos
## con el nombre ‘king.jpg’
imagen = open(‘king.jpg’, ‘wb’)
imagen.write(kk)
imagen.close()
[/sourcecode]
La imagen está en formato jpg, la vamos a leer usando matplotlib y vamos a guardar la información en una matriz 2D (tenemos tres canales (r,g,b) que son iguales (imagen en escala de grises) por lo que solo vamos a usar uno de ellos).
[sourcecode language=”python”]
import numpy as np
import matplotlib.pyplot as plt
## Leemos la imagen como un numpy array
kk = plt.imread(‘king.jpg’)
## Si hacemos kk.shape vemos que existen
## tres canales en la imagen (r, g, b)
## Pero como es una imagen en escala de grises
## Los tres canales tienen la misma información
## por lo que nos podemos quedar con un solo canal
plt.subplot(221)
plt.title(‘canal 1’)
plt.imshow(kk[:,:,0])
plt.subplot(222)
plt.title(‘canal 2’)
plt.imshow(kk[:,:,1])
plt.subplot(223)
plt.title(‘canal 3’)
plt.imshow(kk[:,:,2])
## Vemos que la imagen está rotada, hacemos uso de np.flipud
## http://docs.scipy.org/doc/numpy/reference/generated/numpy.flipud.html
plt.subplot(224)
plt.title(‘canal 1 rotado en BN’)
plt.imshow(np.flipud(kk[:,:,0]), cmap=plt.cm.Greys_r)
plt.show()
## Finalmente, nos quedamos con una única dimensión
## Los tres canales rgb son iguales (escala de grises)
matriz = np.flipud(kk[:,:,0])
[/sourcecode]
Bueno, ahora ya tenemos nuestra imagen como la queremos para poder empezar a trabajar con ella.
¿Cómo se obtienen las componentes principales?
Leer más »Análisis de componentes principales con python