scikit-learn

Introducción a Machine Learning con Python (Parte 2)

En la entrada anterior, Introducción a Machine Learning con Python (Parte 1), di unas pequeñas pinceladas sobre lo que es el Aprendizaje Automático con algunos ejemplos prácticos. Ahora vamos a adentrarnos en materia de un modo más estructurado viendo paso a paso algunas de las técnicas que podemos emplear en… Leer más »Introducción a Machine Learning con Python (Parte 2)

Repaso a PyData 2013

Unos días después de la PyConUS 2013 se celebró la primera PyData del año (creo que serán semestrales de forma regular aunque el tiempo dirá). Entre las charlas había algunas introductorias, otras más avanzadas y otras enseñando aplicaciones prácticas. Entre las charlas introductorias destacaremos: Introducción a Numpy por Bryan Van… Leer más »Repaso a PyData 2013

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