Análisis Discriminante Cuadrático

Análisis Discriminante Lineal

Ahora, consideremos un problema de clasificación representado por una distribución de probabilidad de Bayes P(Y=k | X=x), LDA lo hace de manera diferente tratando de modelar la distribución de X dada la clase de predictores (es decir, el valor de Y) P(X =x|Y=k):

P(Y=k | X=x) = \frac{P(X=x | Y=k) P(Y=k)}{P(X=x)}

= \frac{P(X=x | Y=k) P(Y=k)}{\sum_{j=1}^{K} P(X=x | Y=j) P(Y=j)}

En LDA, asumimos que P(X | Y=k) se puede estimar a la distribución Normal multivariada que viene dada por la siguiente ecuación:

f_k(x) = \frac{1}{(2\pi)^{p/2}|\mathbf\Sigma|^{1/2}} e^{-\frac{1}{2}(x-\mu_k)^T \mathbf{\Sigma}^{-1}(x-\mu_k)}

dónde, \mu_k = mean\, of\, the\, examples\, of \, category\, k \\ \mathbf{\sum} = covariance \, (we\, assume\, common\, covariance\, for\, all\, categories)

y P(Y=k) =\pi_k. Ahora, tratamos de escribir la ecuación anterior con las suposiciones:

P(Y=k | X=x) = \frac{\pi_k  \frac{1}{(2\pi)^{p/2}|\mathbf\Sigma|^{1/2}} e^{-\frac{1}{2}(x-\mu_k)^T \mathbf{\Sigma}^{-1}(x-\mu_k)}}{\sum_{j=1}^{K} \frac{1}{(2\pi)^{p/2}|\mathbf\Sigma|^{1/2}} e^{-\frac{1}{2}(x-\mu_j)^T \mathbf{\Sigma}^{-1}(x-\mu_j)}}

Ahora, tomamos logaritmo de ambos lados y maximizando la ecuación, obtenemos el límite de decisión:

\delta_k(x) = \log \pi_k  - \frac{1}{2}\mu_k^T \Sigma^{-1}\mu_k + x^T \Sigma^{-1}\mu_k

Para dos clases, el límite de decisión es una función lineal de x donde ambas clases dan el mismo valor, esta función lineal se da como:

\left\{x: \delta_k(x) = \delta_{\ell}(x) \right\}, 1 \leq j,\ell \leq K

Para clases múltiples (K>2), necesitamos estimar las medias de pK, la varianza de pK, las proporciones previas de K y  \binom{p}{2}K = \left ( \frac{p(p-1)}{2} \right )K  . Ahora, discutimos con más detalle sobre el análisis cuadrático discriminante.

Análisis Discriminante Cuadrático

El análisis discriminante cuadrático es bastante similar al análisis discriminante lineal, excepto que relajamos la suposición de que la media y la covarianza de todas las clases eran iguales. Por lo tanto, requerimos calcularlo por separado. 

Ahora, para cada uno de la clase y la array de covarianza viene dada por:

\Sigma_y = \frac{1}{N_y-1} \sum_{y_i = y} (x_i - \mu_y)(x_i -\mu_y)^T

Agregando el siguiente término y resolviendo (tomando registro de ambos lados y ). La función Discriminante cuadrática viene dada por:

\delta_k(x) = \log \pi_k  - \frac{1}{2}\mu_k^T \mathbf{\Sigma}_k^{-1}\mu_k + x^T \mathbf{\Sigma}_k^{-1}\mu_k - \frac{1}{2}x^T \Sigma_k^{-1}x -\frac{1}{2}\log |\Sigma_k|

Implementación

  • En esta implementación, utilizaremos la biblioteca R y MASS para trazar el límite de decisión del análisis discriminante lineal y el análisis discriminante cuadrático. Para esto, usaremos el conjunto de datos de iris:

R

# import libraries
library(caret)
library(MASS)
library(tidyverse)
 
# Code to plot decision plot
decision_boundary = function(model, data,vars, resolution = 200,...) {
  class='Species'
  labels_var = data[,class]
  k = length(unique(labels_var))
  # For sepals
  if (vars == 'sepal'){
  data = data %>% select(Sepal.Length, Sepal.Width)
  }
  else{
  data = data %>% select(Petal.Length, Petal.Width)
  }
   
   
  # plot with color labels
  int_labels = as.integer(labels_var)
  plot(data, col = int_labels+1L, pch = int_labels+1L, ...)
   
  # make grid
  r = sapply(data, range, na.rm = TRUE)
  xs = seq(r[1,1], r[2,1], length.out = resolution)
  ys = seq(r[1,2], r[2,2], length.out = resolution)
  dfs = cbind(rep(xs, each=resolution), rep(ys, time = resolution))
   
  colnames(dfs) = colnames(r)
  dfs = as.data.frame(dfs)
   
  p = predict(model, dfs, type ='class' )
  p = as.factor(p$class)
 
   
  points(dfs, col = as.integer(p)+1L, pch = ".")
   
  mats = matrix(as.integer(p), nrow = resolution, byrow = TRUE)
  contour(xs, ys, mats, add = TRUE, lwd = 2, levels = (1:(k-1))+.5)
   
  invisible(mats)
}
 
par(mfrow=c(2,2))
# run the linear discriminant analysis and plot the decision boundary with Sepals variable
model = lda(Species ~ Sepal.Length + Sepal.Width, data=iris)
lda_sepals = decision_boundary(model, iris, vars= 'sepal' , main = "LDA_Sepals")
 
# run the quadratic discriminant analysis and plot the decision boundary with Sepals variable
model_qda = qda(Species ~ Sepal.Length + Sepal.Width, data=iris)
qda_sepals = decision_boundary(model_qda, iris, vars= 'sepal', main = "QDA_Sepals")
 
# run the linear discriminant analysis and plot the decision boundary with Petals variable
model = lda(Species ~ Petal.Length + Petal.Width, data=iris)
lda_petal =decision_boundary(model, iris, vars='petal', main = "LDA_petals")
 
# run the quadratic discriminant analysis and plot the decision boundary with Petals variable
model_qda = qda(Species ~ Petal.Length + Petal.Width, data=iris)
qda_petal =decision_boundary(model_qda, iris, vars='petal', main = "QDA_petals")

Visualización LDA y QDA

Referencias:

Publicación traducida automáticamente

Artículo escrito por pawangfg y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *