Para este ejemplo se usó la librería scikit-learn, la cual contiene una gran cantidadmodelos de aprendizaje de máquina en Python y es muy usada dentro de la comunidad de Machine Learning. La página de la librería es: http://scikit-learn.org/stable/#
In [19]:
import matplotlib.pyplot as plt #Para graficar
from sklearn import datasets #Para importar la base de datos de prueba
from sklearn.decomposition import PCA #Para reducir la dimensionalidad
from mpl_toolkits.mplot3d import Axes3D #Para graficas 3D
import numpy as np
In [3]:
iris = datasets.load_iris()
In [4]:
iris.data[1:7,]
Out[4]:
In [5]:
iris.target[1:7]
Out[5]:
Cuando aumenta la dimensionalidad de los datos (la cantidad de variables), el volumen del espacio aumenta exponencialmente, haciendo que los datos disponibles se encuentren más dispersos.
In [27]:
datax = np.asarray([0.0, 1.0, 0.0, 1.0])
datay = np.asarray([0.0, 0.0, 1.0, 1.0])
dataz = np.asarray([0.0, 0.0, 0.0, 50.0])
plt.scatter(datax, datay)
plt.show()
In [38]:
fig = plt.figure(figsize=(6, 9))
ax = Axes3D(fig)
ax.scatter(datax, datay, dataz)
Out[38]:
La distancia euclidiana entre los puntos en tres dimensiones es mayor que la distancia euclidiana de los puntos en dos dimensiones. Para poder enfrentar este problema tenemos dos opciones:
El análisis de componentes principales selecciona las direcciones con mayor variabilidad. Permitiendo eliminar las direcciones con menor variabilidad, pues estas tienen menos información.
In [12]:
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target)
plt.xlabel(unicode('Longitud del sépalo', 'utf-8'))
plt.ylabel(unicode('Longitud del sépalo', 'utf-8'))
Out[12]:
In [13]:
iris_reducido = PCA(n_components=2).fit_transform(iris.data)
plt.scatter(iris_reducido[:, 0], iris_reducido[:, 1], c=iris.target)
plt.xlabel(unicode('Primer vector propio', 'utf-8'))
plt.ylabel(unicode('Segundo vector propio', 'utf-8'))
Out[13]:
En este caso PCA captura logra concentrar la información de las cuatro dimensiones en dos dimensiones. PCA no usa la etiqueta de la muestra. Se usó en este script para ilustrar mejor.