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):
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:
dónde,
y P(Y=k) =\pi_k. Ahora, tratamos de escribir la ecuación anterior con las suposiciones:
Ahora, tomamos logaritmo de ambos lados y maximizando la ecuación, obtenemos el límite de decisión:
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:
Para clases múltiples (K>2), necesitamos estimar las medias de pK, la varianza de pK, las proporciones previas de K y . 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:
Agregando el siguiente término y resolviendo (tomando registro de ambos lados y ). La función Discriminante cuadrática viene dada por:
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")