% Created 2025-03-04 mar 18:26
% Intended LaTeX compiler: pdflatex
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\author{Carlos Enrique Carleos Artime}
\date{\today}
\title{Análisis Discriminante Lineal}
\hypersetup{
 pdfauthor={Carlos Enrique Carleos Artime},
 pdftitle={Análisis Discriminante Lineal},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 29.3 (Org mode 9.6.15)}, 
 pdflang={Spanish}}
\begin{document}

\maketitle
\tableofcontents

\section{Datos de ejemplo: iris}
\label{sec:org4b0c34d}
\begin{itemize}
\item \href{https://es.wikipedia.org/wiki/Conjunto\_de\_datos\_flor\_iris}{Famoso} conjunto de datos de \href{https://onlinelibrary.wiley.com/doi/epdf/10.1111/j.1469-1809.1936.tb02137.x}{Físher (1936)}.
\item Medidas en centímetros de cuatro variables:
\begin{itemize}
\item longitud de sépalos
\item anchura  de sépalos
\item longitud de pétalos
\item anchura  de pétalos
\end{itemize}
\item Tamaño muestral: 150 registros en 3 grupos indicados por la variable «especie»:
\begin{itemize}
\item 50 registros de \emph{Iris setosa}
\item 50 registros de \emph{Iris versicolor}
\item 50 registros de \emph{Iris virginica}
\end{itemize}
\item En R: 
\begin{itemize}
\item \texttt{iris  \# dataframe}
\item \texttt{?iris \# ayuda}
\end{itemize}
\item En Rcmdr:
\begin{itemize}
\item Datos
\item Conjunto de datos en paquetes
\item Leer conjunto de datos en paquete adjunto
\item Paquete: datasets
\item Conjunto de datos: iris
\item Aceptar
\end{itemize}
\end{itemize}
\section{Descripción univariante}
\label{sec:org977b01d}
\begin{verbatim}
pdf("/tmp/iris.pdf")
for (i in 1:4) boxplot (iris[,i] ~ iris$Species, main = names(iris)[i])
dev.off()
\end{verbatim}
\begin{itemize}
\item \emph{Iris setosa} se separa fácil del resto.
\item Para las otras, de mejor a peor:
\begin{itemize}
\item longitud/anchura de pétalos => descripción bivariante
\item longitud de sépalos
\item anchura  de sépalos
\end{itemize}
\end{itemize}
\section{Descripción bivariante}
\label{sec:org0db9f04}
\begin{verbatim}
plot (Petal.Width ~ Petal.Length, iris, col=Species)
\end{verbatim}
\begin{itemize}
\item La separación es bastante clara.
\item Deberían producirse pocos errores de clasificación
\end{itemize}
\section{Advertencia sobre evaluación de clasificadores}
\label{sec:org1ace9e0}
\begin{itemize}
\item \href{https://es.wikipedia.org/wiki/Validaci\%C3\%B3n\_cruzada}{Wikipedia}
\item Al usar técnicas de aprendizaje automático (de clasificación o de regresión) 
hay que tener en cuenta el problema del \textbf{sobreajuste}.
\item Dada cualquier muestra de datos, es evidente que se puede construir
un modelo que se ajuste perfectamente a ellos.  Por ejemplo,
cualquiera de las dos siguientes funciones clasificaría correctamente
el 100\% de los datos \texttt{iris}:
\begin{verbatim}
## buscar si el nuevo individuo coincide con alguno de los que ya existen;
## si no, clasificarlo como "setosa", por ejemplo:
clasificar1 <- function (long.sep, anch.sep, long.pet, anch.pet)
{
    for (i in 1:150)
        if (all (c (long.sep, anch.sep, long.pet, anch.pet) == iris [i, 1:4]))
          return (as.character (iris [i, "Species"]))
    "setosa"
}
## buscar al individuo más cercano, según la distancia euclídea,
## y asignarle su grupo
clasificar2 <- function (long.sep, anch.sep, long.pet, anch.pet)
  as.character (iris [which.min (apply (iris[,1:4], 1, function (fila)
                                        sum ((fila - 
                                              c (long.sep, anch.sep, 
                                                 long.pet, anch.pet))^2))),
                      "Species"])
## comprobación de que se aciertan todos
for (clasificar in  c (clasificar1, clasificar2))
    print (all (apply (iris[,1:4], 1,
                       function (f)     # "f" de "fila"
                           clasificar (f[1], f[2], f[3], f[4])) == iris$Species))

\end{verbatim}
\item Sin embargo, ¿cómo funcionarían esos clasificadores al usarlos sobre datos nuevos?
\begin{itemize}
\item \texttt{clasificar1} clasificaría como "setosa" cualquier dato nuevo;
\item \texttt{clasificar2} para clasificar al dato nuevo usaría sólo el dato viejo
más cercano, aunque estuviesen rodeados de datos de otro grupo.
\end{itemize}
En ningún caso parecen clasificadores óptimos, aunque obtengan el 100\% de aciertos
sobre los datos originales.  Están \textbf{sobreajustados}.
\item Para dar una estimación más objetiva de la tasa de error de un modelo,
se recurre a
\begin{itemize}
\item método de retención
\item validación cruzada
\end{itemize}
\end{itemize}
\subsection{Método de retención}
\label{sec:orgfc8f603}
Consiste en dividir los datos originales en dos partes:
\begin{description}
\item[{Conjunto de Entrenamiento}] Suele ser el subconjunto más grande.  Habitualmente,
del 70\% al 90\% de los datos originales.  El modelo clasificador se calcula 
usando sólo los datos de entrenamiento.
\item[{Conjunto de Validación}] Son los datos restantes.  Se utilizan para probar el
modelo generado a partir de los datos de entrenamiento.  La tasa de error se 
calcula sobre dichas pruebas.
\end{description}
\subsection{Validación cruzada}
\label{sec:org50c0f95}
Si la aplicación del método de retención requiere poco tiempo de computación, 
se puede aplicar la idea de forma repetida, de forma que en cada repetición:
\begin{itemize}
\item Se muestrea un nuevo conjunto de entrenamiento.
\item Se calcula una tasa de error.
\end{itemize}
Al final, se promedian todas las tasas de error obtenidas.

El muestreo puede ser determinista o aleatorio, siendo más habitual lo primero.
Así, en una validación cruzada de orden \(k\):
\begin{itemize}
\item Se dividen los datos originales en \(k\) grupos.
\item Se repite con \(i\) desde \(1\) hasta \(k\) lo siguiente:
\begin{itemize}
\item Se construye un clasificador con todos los grupos menos el \(i\)-ésimo.
\item Se usa ese clasificador sobre los datos del grupo \(i\)-ésimo.
\item Sea \(E_i\) la tasa de error obtenida con ese clasificador en el grupo \(i\).
\end{itemize}
\item Se calcula finalmente la tasa de error promedio: \(\frac1k\sum_{i=1} E_i\)
\end{itemize}

Valores habituales de \(k\) son \(k=5\) y \(k=10\).
\subsection{Dejando uno fuera}
\label{sec:org34d173f}
Si la potencia de cálculo lo permite, la forma más completa de usar
validación cruzada es tomar \(k\) igual al tamaño muestral.
De esa forma, en cada iteración el clasificador se construye "dejando uno fuera".
En inglés se usan las siglas LOO (leave one out) para referirse a este método.
\section{Análisis discriminante}
\label{sec:org22a534c}
\subsection{Cargar la biblioteca necesaria}
\label{sec:org3604dec}
Buscamos una función que realice análisis discriminante:
\begin{verbatim}
help.search ("discriminant")    # MASS::lda    Linear Discriminant Analysis
library (MASS)
\end{verbatim}
\subsection{Con retención (muestras de entrenamiento y de validación)}
\label{sec:org004ad3c}
\subsubsection{Cálculo del modelo a partir de la muestra de entrenamiento}
\label{sec:org2e664b2}
\begin{verbatim}
entrena <- sample (150, 120)            # 120 = 80% de 150 para entrenar
modelo  <- lda (Species ~ ., iris)      # el punto «.» = resto de variables en «iris»
modelo  <- lda (Species ~ Petal.Length + Petal.Width + Sepal.Length + Sepal.Width,
                iris)                   # equivale a la anterior orden
modelo
\end{verbatim}
\subsubsection{Análisis de la salida}
\label{sec:org71f34aa}
La salida obtenida incluye lo siguiente:
\begin{itemize}
\item Importancia de los ejes discriminantes
\begin{verbatim}
Proportion of trace:
   LD1    LD2 
0.9912 0.0088 
\end{verbatim}
El primer eje explica más del 99\% de la discriminación 
(variabilidad entre los grupos).
\item Interpretación de los ejes
\begin{verbatim}
Coefficients of linear discriminants:
                    LD1         LD2
Petal.Length -2.2012117  0.93192121
Petal.Width  -2.8104603 -2.83918785
Sepal.Length  0.8293776 -0.02410215
Sepal.Width   1.5344731 -2.16452123
\end{verbatim}
\begin{itemize}
\item Primer eje (>99\%)
\begin{itemize}
\item Puntuaciones altas = pétalos pequeños y sépalos grandes.
\item Contrapone pétalos a sépalos.
\end{itemize}
\item Segundo eje (<1\%)
\begin{itemize}
\item Puntuaciones altas = pétalos largos y estrechos
\item Contrapone pétalos alargados a pétalos anchos
\end{itemize}
\end{itemize}
\end{itemize}
\subsubsection{Clasificación en la muestra de validación}
\label{sec:org770ffc1}
\begin{verbatim}
prediccion <- predict(modelo, iris[-entrena,])
names (prediccion)             # class  posterior  x
\end{verbatim}
\begin{itemize}
\item «class» sirve para calcular la matriz de confusión (errores de clasificación)
\begin{verbatim}
> table (real = iris[-entrena,"Species"], predicho = prediccion$class)
            predicho
real         setosa versicolor virginica
  setosa         16          0         0
  versicolor      0          8         0
  virginica       0          0         6
\end{verbatim}
Todas las muestras de validación se han clasificado bien.  100\% efectividad.
\item «posterior» sirve para detectar muestras dudosas, o cuantificar la 
credibilidad de la clasificación.
\begin{verbatim}
posteriores <- round (prediccion$posterior, 3)
## si fuesen muchos, podrían ordenarse así:
entropia <- function (p) -sum (ifelse (p==0, 0, p * log2(p))) # 0 en lugar de Nan
tail (posteriores [order (apply (posteriores, 1, entropia)), ])
\end{verbatim}
El peor caso es el «128», clasificada como «virginica» con sólo un 86,6\% de 
seguridad (13,4\% como «versicolor»).
\item «x» son las coordenadas en el espacio de los ejes discriminantes:
\begin{verbatim}
plot (prediccion $ x, col = iris[-entrena,"Species"])
\end{verbatim}
\begin{itemize}
\item Se observa la importancia del primer eje en la separación de los grupos.
\end{itemize}
\end{itemize}
\subsection{Con validación cruzada «dejando uno fuera»}
\label{sec:org171121e}
Se puede pedir al comando «lda» que haga una validación cruzada exhaustiva,
dejando uno fuera en cada iteración, es decir, 
\begin{itemize}
\item se entrena el modelo con todos los datos menos uno;
\item se predice la clasificación de éste y se compara con su clase real;
\item se repite el proceso para todos los datos de la muestra original.
\end{itemize}
\begin{verbatim}
modelo  <- lda (Species ~ ., iris, CV=TRUE)  # validación cruzada
table (iris$Species, modelo$class)           # matriz de confusión
errores <- iris$Species != modelo$class      # individuos mal clasificados
iris [errores, ]                             # datos de esos individuos
modelo$posterior [errores, ]                 # seguridad en la clasificación
## representación destancando los errores
plot (Petal.Width ~ Petal.Length, iris, col=Species, pch=1+16*errores) 
\end{verbatim}
\end{document}
