Los métodos de reducción de dimensionalidad son técnicas estadísticas que mapean el conjunto de los datos a subespacios derivados del espacio original, de menor dimensión, que permiten hacer una descripción de los datos a un menor costo. Estas técnicas cobran importancia ya que muchos algoritmos de diversos campos tales como análisis numérico, aprendizaje automático o minería de datos suelen degradar su rendimiento cuando se usan con datos de alta dimensionalidad. En los casos extemos, el algoritmo deja de ser útil para el fin que fue diseñado. La maldición de la dimensión (también conocida como efecto Hughes o por su término en inglés curse of dimensionality), se refiere a los diversos fenómenos que surgen al analizar y organizar datos de espacios de múltiples dimensiones. [Wik16a]
Nuestro primer objetivo es mostrar un ejemplo práctico de una técnica conocida como PCA. El segundo objetivo es hacer una comparación con otra técnica conocida como LDA. Nuestro tercer objetivo es comparar ambas técnicas.
Para ello vamos a utilizar la base de datos Iris, popularizada por un artículo de Fisher [Fis36].
Iris es quizás la base de datos más conocida que se encuentran en la literatura de reconocimiento de patrones. El artículo de Fisher es un clásico en ésta área. Esta base de datos, recolectada durante varios años por Edgar Anderson fue utilizada para demostrar que estas medidas podrían utilizarse para diferenciar entre especies de plantas iris. Contiene 3 clases de 50 casos cada una, donde cada clase se refiere a un tipo de planta iris [Lic07].
Una clase es linealmente separable de los otras 2; estas últimas no son linealmente separables entre sí.
Los atributos son:
Figura 1. Pétalo y Sépalo de una planta. Imágen tomada de “The Iris Flower Data Set|Iris Abramson”
data(iris)
Antes de empezar, hacemos un poco de análisis exploratorio.
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3.0 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5.0 | 3.6 | 1.4 | 0.2 | setosa |
5.4 | 3.9 | 1.7 | 0.4 | setosa |
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | |
---|---|---|---|---|
Min. :4.300 | Min. :2.000 | Min. :1.000 | Min. :0.100 | |
1st Qu.:5.100 | 1st Qu.:2.800 | 1st Qu.:1.600 | 1st Qu.:0.300 | |
Median :5.800 | Median :3.000 | Median :4.350 | Median :1.300 | |
Mean :5.843 | Mean :3.057 | Mean :3.758 | Mean :1.199 | |
3rd Qu.:6.400 | 3rd Qu.:3.300 | 3rd Qu.:5.100 | 3rd Qu.:1.800 | |
Max. :7.900 | Max. :4.400 | Max. :6.900 | Max. :2.500 |
Figura 2a. Gráfica de barras de las variables
La siguiente gráfica contiene 4 boxplots de cada una de las variables. El boxplot es una forma estandarizada de mostrar la distribución de los datos basados en el resumen de cinco números: mínimo, primer cuartil, mediana, tercer cuartil y máximo.
Figura 2b. Gráfica para representar los cuartiles de las variables
Una variación de la gráfica anterior. Agrega un kernel de densidad kernel girado a cada lado del boxplot
Figura 2c. Gráfica para representar los cuartiles y la densidad de las variables
Las siguientes dos gráficas nos muestran las frecuencias y distribuciones de la variables.
Figura 3a. Gráfica que muestra la frequencia de las variables en un histograma
Figura 3b. Gráfica que muestra la densidad de las variables
Es buena práctica ver la correlación entre las variables, en este caso sólo aplica para las variables numéricas.
Figura 3c. Gráfica de dispersión entre las variables
Figura 3d. Gráfica para interpretar la relación entre las variables
sapply(iris[1:4],var)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 0.6856935 0.1899794 3.1162779 0.5810063
range(sapply(iris[1:4],var))
## [1] 0.1899794 3.1162779
La variabilidad parece alta para este contexto. Veamos el efecto de escalar los datos
iris.standardized <- as.data.frame(scale(iris[,1:4]))
sapply(iris.standardized, sd)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 1 1 1
La desviación estándar es 1. En realidad no tendríamos que escalar ya que las unidades de las 4 variables están en centimetros.
De acuerdo a Wikipedia, “PCA es un procedimiento matemático que utiliza la transformación ortogonal para convertir un conjunto de observaciones de variables posiblemente correlacionadas en un conjunto de valores de variables linealmente no correlacionadas llamadas componentes principales.” Está diseñado de tal manera que cada uno de los sucesivos componentes principales explica una cantidad decreciente de la variación en el conjunto de datos [Wik16b].
La función prcomp puede usar la matriz de correlación (con datos estandarizados) o la matriz de covarianzas. También es posible hacer PCA con la librería caret.
ir.pca <- prcomp(iris[-5], scale=T)
# prcomp(iris.standardized, scale=T)
# prcomp(iris.standardized)
# princomp(iris.standardized, cor=T)
print(ir.pca)
## Standard deviations:
## [1] 1.7083611 0.9560494 0.3830886 0.1439265
##
## Rotation:
## PC1 PC2 PC3 PC4
## Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
## Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
## Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
## Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
summary(ir.pca)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
Esta es la manera de obtener sólo las desviaciones estándar de los componentes
ir.pca$sdev
## [1] 1.7083611 0.9560494 0.3830886 0.1439265
Con ir.pca$rotation se obtenien los pesos de los componentes
PC1 | PC2 | PC3 | PC4 | |
---|---|---|---|---|
Sepal.Length | 0.5210659 | -0.3774176 | 0.7195664 | 0.2612863 |
Sepal.Width | -0.2693474 | -0.9232957 | -0.2443818 | -0.1235096 |
Petal.Length | 0.5804131 | -0.0244916 | -0.1421264 | -0.8014492 |
Petal.Width | 0.5648565 | -0.0669420 | -0.6342727 | 0.5235971 |
En este momento ya sabemos que componentes capturan la mayoría de la varianza. Vamos a hacerlo más visual.
Figura 3. Gráfica de varianzas de los componentes
Podemos observar que los componentes 1 y 2 son los más significativos. Por un resultado anterior sabemos que capturan casi el 96% de las varianzas de las variables.
La siguiente figura nos ayuda a visualizar el método de Componentes Principales
Figura 4. Visualización de los compenentes y las observaciones
Podemos notar que la anchura y la longitud de los pétalos están altamente correlacionadas y su variabilidad a través de las tres especies Iris se explica principalmente por el componente 1, que también explica una gran parte de la variabilidad en la longitud del sépalo.
La siguiente figura es una simplificación de la Figura 4 y ayuda a la interpretación de los componentes 1 y 2 en relación a las variables numéricas.
Figura 5. Interpretación de los compenentes principales
Para este caso los componentes 1 y 2 resumen el modelo de la base Iris. Hay que tener presente que PC1 y PC2 son variables sintéticas y no correlacionadas entre sí.
Cabe mencionar que no siempre resulta sencillo la interpretación de los componentes y puede requerir la ayuda de un experto en los datos (juicio experto).
El análisis discriminante (LDA) es una técnica para tratar de encontrar las variables que permiten diferenciar a los grupos y cuántas de estas variables son necesarias para alcanzar la mejor clasificación posible. La pertenencia a los grupos, conocida de antemano, se utiliza como variable dependiente (una variable categórica con tantos valores discretos como grupos). Las variables en las que suponemos que se diferencian los grupos se utilizan como variables independientes o variables de clasificación (variables discriminantes).
El objetivo del análisis discriminante es encontrar la combinación lineal de las variables discriminantes que mejor permita diferenciar (discriminar) a los grupos. Una vez encontrada esa combinación (la función discriminante) podrá ser utilizada para clasificar nuevos casos. Se trata de una técnica de análisis multivariante capaz de aprovechar las relaciones existentes entre una gran cantidad de variables independientes para maximizar la capacidad de discriminación.
ir.lda <- lda(Species ~ ., iris, prior = c(1, 1, 1) / 3)
prop.ir.lda = ir.lda$svd^2 / sum(ir.lda$svd^2)
plda <- predict(object = ir.lda, newdata = iris)
ir.lda$means nos proporciona las medias de cada grupo
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | |
---|---|---|---|---|
setosa | 5.006 | 3.428 | 1.462 | 0.246 |
versicolor | 5.936 | 2.770 | 4.260 | 1.326 |
virginica | 6.588 | 2.974 | 5.552 | 2.026 |
ir.lda$scaling nos dice los coeficientes de combinación lineal para cada discriminante lineal
LD1 | LD2 | |
---|---|---|
Sepal.Length | 0.8293776 | 0.0241021 |
Sepal.Width | 1.5344731 | 2.1645212 |
Petal.Length | -2.2012117 | -0.9319212 |
Petal.Width | -2.8104603 | 2.8391879 |
Los valores singulares (svd) proporcionan la relación de las desviaciones estándar entre y dentro de los grupos de los discriminantes lineales.
svd <- ir.lda$svd
svd
## [1] 48.642644 4.579983
Podemos utilizar estos valores singulares para calcular el peso de la varianza entre los grupos que es explicada por cada discriminante lineal.
print(svd^2 / sum(svd^2))
## [1] 0.991212605 0.008787395
Podemos ver que el primer discriminante lineal explica más del 99% de la varianza entre grupos.
La siguiente figura muestra la comparación entre ambas técnicas.
Figura 6. Comparación entre LDA y PCA
Tanto LDA como PCA son técnicas de transformación lineal que se utilizan para la reducción de dimensionalidad. PCA se puede describir como un algoritmo “no supervisado”, ya que “ignora” las etiquetas de clase siendo su objetivo encontrar las direcciones (componentes principales) que maximizan la varianza de un conjunto de datos. En contraste con PCA, LDA es “supervisado” y calcula las direcciones (discriminantes lineales) que representarán a los ejes que que maximizan la separación entre múltiples clases.
La siguiente figura muestra que las especie versicolor y virginica están separadas en LDA, mientras que hay cierta superposición entre ellas en PCA. PCA trata de retener la mayor parte de la variabilidad en los datos mientras que LDA trata de retener la mayor parte de la varianza entre la clase de los datos.
Figura 7. Diferencias entre LDA y PCA
[Fis36] Fisher, R. A. (1936). The use of multiple measurements in taxonomic problems. Annals of eugenics, 7(2), 179-188.
[Lic07] Lichman, M. (2007). UCI machine learning repository (2013). URL archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science.
[Wik16a] Wikipedia contributors. (2016) Curse of dimensionality. URL en.wikipedia.org/wiki/Curse_of_dimensionality
[Wik16b] Wikipedia contributors. (2016) Principal component analysis. URL en.wikipedia.org/wiki/Principal_component_analysis