Tutorial del Algoritmo ADL en Python
¿Ya entiendes cómo funciona ADL? ¡Salta al código!
El Algoritmo de Análisis Discriminante Lineal (ADL) es un algoritmo de Machine Learning utilizado para categorizar dos o más grupos basándose en sus características. Este es capaz de descubrir un subespacio apoyado en características que optimice la separabilidad de los grupos. Este proceso usa principalmente métodos estadísticos y probabilísticos, ya que se fundamenta en el Teorema de Bayes, el cual permite calcular la probabilidad de que un evento ocurra condicionado a otro evento.
Supongamos que se está trabajando con un conjunto de datos con una dimensión alta, en la que queremos clasificar algunas observaciones, por ejemplo, los datos que corresponden a un hospital tienen numerosas características para cada paciente — ejemplo de la presión sanguínea, la altura, peso, etc -. En este caso, el algoritmo viene siendo de gran ayuda, debido a que descubrirá una proyección lineal que permitirá optimizar el segmento de datos en un subespacio con menos dimensiones capaz de maximizar algunas medidas de separación de clases.
El algoritmo ADL puede ser entendido de una manera general con el siguiente ejemplo: digamos que tenemos una fábrica de cauchos, en esta ocurren dos eventos: el caucho aprueba el control de calidad (mostrado en color verde) y el caucho no aprueba el control de calidad (color rojo), y esto se encuentra basado en una sola característica, la cual será la curvatura de la rueda.
Podemos notar que con una sola característica, existe una superposición (lo que se conoce en inglés como overlapping). Si esto ocurre, no podemos tomar una decisión ni tener una idea clara de la situación. Pero, ¿a qué se refiere con superposición en este caso?
El gráfico nos da información acerca de un falso negativo, que sería un caucho en buen estado que falló el control de calidad — círculo verde -, y dos falsos positivos, algunos cauchos en mal estado que aprobaron el control de calidad.
Para evitar esto, podemos añadir otra característica, podría ser el diámetro del caucho. De esta manera, tendremos un mejor gráfico que nos ayude al cálculo de este algoritmo.
Con este gráfico, es casi imposible dibujar una línea recta que separe a los dos grupos de manera eficiente, sin embargo, aquí es donde actúa el algoritmo ADL, ayudando a reducir este plano de dos dimensiones en uno de una dimensión.
Este método creará un nuevo eje. Este maximizará la distancia entre las medias de ambos grupos y minimizará la varianza existente dentro del grupo individual. Además, el algoritmo proyectará todos los datos en este nuevo eje, haciendo un segmento de datos separados de una dimensión. Esto nos puede mostrar un resultado como el siguiente.
De esta forma el algoritmo nos da una mejor información acerca de los cauchos, basado en las dos características pero mostradas como solo una, dándonos una perfecta clasificación que nos ayudará en nuestro proceso de toma de decisiones en nuestro sistema de control de calidad.
En el caso que las medias de las distribuciones se vuelvan compartidas, el algoritmo ADL tenderá a fallar, puesto a las dificultades en hallar un nuevo eje que haga a ambas clases linealmente separables. En esta situación, se emplea el algoritmo de Análisis Discriminante no Lineal.
¿Cómo puede este algoritmo hacer todo su trabajo? Con ayuda del tutorial en Python, veremos todas las explicaciones matemáticas, utilizando la librería scikit-learn y el segmento de datos de Iris.
Tutorial en Python
Sigue el código en github: https://github.com/AccelAI/AI-Tutorials/blob/main/LDA_Tutorial/LDA-Tutorial.ipynb
Para comenzar con este tutorial, primero debemos aclarar que se está utilizando la distribución Anaconda. Si no es tu caso, tal vez debas instalar los pips necesarios si no lo has hecho anteriormente. Además, se utilizará el segmento de datos de Iris, que es facilitado gracias a la conocida librería scikit-learn. Así que importemos las siguientes librerías.
Lo siguiente que haremos es leer el segmento de datos y declarar algunas variables para su uso posterior.
Además, crearemos un diccionario que contendrá los valores de los índices correspondientes y su significado de acuerdo al tipo de planta Iris.
Ahora que tenemos todos los datos cargados, estamos listos para comenzar con el cálculo del algoritmo. Este consta de cinco pasos:
1.- Calcular los vectores n-dimensionales de las medias.
Comenzaremos con un simple cálculo de los vectores de las medias de las tres diferentes clases de planta Iris. Este segmento de datos contiene cuatro características: longitud del sépalo, ancho del sépalo, longitud del pétalo y ancho del pétalo; teniendo cada una 50 muestras para cada clase.
2.- Calcular las Matrices de Dispersión
Para que este algoritmo funcione correctamente, se necesita calcular dos matrices de dispersión: la matriz de dispersión dentro de las clases y la matriz de dispersión entre las clases.
Una matriz de dispersión es un estadístico — el cual es un valor calculado basado en una muestra y este es usado para propósitos estadísticos — usado para estimar la matriz de covarianza. Si deseas saber un poco más acerca de ella, puedes leer un poco sobre ello en mi anterior artículo sobre el Algoritmo ACP en la sección 2: “Cálculo de la Matriz de Covarianza” (Tutorial del Algoritmo ACP en Python | by Anthony Barrios | LatinXinAI | Medium).
Ambas matrices de dispersión proveen información esencial acerca de la relación dentro y entre las diferentes clases. Estas son generalizaciones de la suma de los cuadrados en el análisis de su varianza.
La matriz de dispersión entre clases es calculada con la siguiente ecuación:
Donde:
C es el número de clases,
Si es la matriz de dispersión para cada clase, calculada por medio de
Aquí,
X es el vector valor de cada instancia para cada clase, lo que significa que incluirá 150 muestras.
mi representa el vector de medias de la clase i.
Ahora, la matriz de dispersión entre clases emplea la siguiente fórmula:
Con esta ecuación, medimos la dispersión del segmento de datos, donde:
C es el número de clases,
Ni es el tamaño de la clase respectiva,
mi es la media por clase, y
m es la media general del segmento de datos.
3.- Resolver el Problema de Valor Propio Generalizado para la Matriz.
Si no estás familiarizado con valores y vectores propios, recomiendo que leas la sección tres de mi artículo sobre el algoritmo ACP: “Calcular la Descomposición Propia de la Matriz de Covarianza” (Tutorial del Algoritmo ACP en Python | by Anthony Barrios | LatinXinAI | Medium). Ayudará bastante a un mejor entendimiento.
Un problema de valor propio generalizado consiste en determinar vectores “x” diferentes a cero y un número lambda, que potencialmente puede ser complejo, de manera que exista Ax = λBx. Donde x es el vector propio y λ su valor propio; A y B representan matrices simétricas.
Resolver este problema puede ayudar en diferentes campos de aplicación, tal es el caso de la química, sistemas de información, teorías de control, entre otros. En este caso, lo usaremos para obtener las discriminantes lineales.
Con conocimientos de álgebra lineal podemos recordar que los vectores y valores propios nos están dando información acerca de una distorsión de una transformación lineal. El vector propio nos indica la dirección de esta distorsión, mientras que el valor propio es un factor de escala que describe la magnitud de dicha distorsión.
En este caso, los valores propios tienen una gran importancia, puesto que nos dice cuánta información está ubicada en nuestros nuevos ejes que el algoritmo está calculando. A manera de evitar errores con los cálculos realizados se puede realizar un paso extra, un chequeo para revisar si la descomposición propia es correcta y satisface la siguiente ecuación:
Donde A es el problema de valor propio generalizado, v es nuestro vector propio y λ es nuestro valor propio.
Esta simple función busca por las similitudes entre la ecuación insertada y los valores resultantes de los pasos anteriores. Los valores no tienen que ser exactamente iguales, puesto que la función tiene un margen de error delimitado que nos dice si los valores son válidos para trabajar con ellos. En el caso contrario, el programa arrojará una excepción, puedes hacer el intento cambiando la variable eigv por un número aleatorio, por ejemplo el 6.
4.- Seleccionando discriminantes lineales para el nuevo subespacio de características
Debido a que este es un algoritmo de reducción de dimensionalidad, queremos desechar los vectores propios que contengan poca información. Para hacer esto, necesitamos ordenar los vectores propios de mayor a menor con respecto a sus valores propios, así seleccionar el número de vectores propios que queremos conservar.
Si se observan los valores propios, podemos ver que dos de ellos están más cercanos a 0 que los otros. Esto ocurre debido a que en el algoritmo ADL el número de discriminantes lineales debe ser como máximo igual al número de clases menos uno, lo cual significa que el último vector propio debe ser 0. Esto no significa que no almacenen información, sino que dicha información no es relevante para el trabajo que se va a realizar. Para ver la varianza en este segmento de datos, se puede ejecutar el siguiente bloque de código:
Se puede ver que el primer par propio es el más informativo y los dos últimos no representan mucho a los datos.
Ahora se procede a construir la matriz de vectores propios, a la que llamaremos W. Esta tiene una dimensión d x k (en este caso, 4x2, debido a que tenemos 4 características y los dos pares propios más informativos).
5.- Transformando las muestras en el nuevo subespacio
Finalmente, utilizaremos W para transformar las muestras en un subespacio de características de dos dimensiones. La única cosa que se debe hacer es calcular la siguiente ecuación:
Donde X es la matriz que contiene los datos del segmento original y Y será el nuevo subespacio de k dimensiones que contendrá todas las muestras.
Y así completamos este tutorial del algoritmo ADL. Para tener una mejor forma de visualizarlo, podemos crear una función que grafique los nuevos subespacios del segmento de datos.
Cuando llamamos a la función plot_set_dla, nos mostrará esta gráfica:
Podemos ver que el discriminante lineal 1 nos da una mejor separación de clases que el segundo, esto confirma el cálculo realizado en el paso anterior y la función de porcentaje que mostró que el segundo par propio tiene solo un 0.88% de la información.
En conclusión
El Algoritmo de Análisis de Discriminante Lineal es una buena aproximación tanto para la reducción de dimensionalidad como para la clasificación en el área de Machine Learning. Esta tiene diferentes aplicaciones como Reconocimiento Facial, Identificación de Clientes y en el campo médico como la clasificación del estado de enfermedad del paciente. Repasando los pasos realizados podemos notar que comparte ciertas similitudes con el algoritmo ACP, exceptuando el hecho que el algoritmo ADL es más apropiado para ciertos casos de clasificaciones especiales, como por ejemplo, la clasificación multiclases. Si deseas continuar en este trayecto de Machine Learning, te recomiendo leer mis artículos anteriores y hacer una investigación más profunda acerca de este algoritmo tan interesante y poderoso.
Do you identify as Latinx and are working in artificial intelligence or know someone who is Latinx and is working in artificial intelligence?
Get listed on our directory and become a member of our member’s forum: https://lxai.app/
Become a writer for the LatinX in AI Publication: http://bit.ly/LXAI-Volunteer
Learn more on our website: http://www.latinxinai.org/
Don’t forget to hit the 👏 below to help support our community — it means a lot! Thank you :)
Referencias:
- Linear Discriminant Analysis in Python | Machine Learning. (n.d.). Recuperado el 13 de Octubre, 2022, de https://python-course.eu/machine-learning/linear-discriminant-analysis-in-python.php
- Epperly, E. (2021, December 14). The Elegant Geometry of Generalized Eigenvalue Perturbation Theory — Ethan Epperly. Recuperado el 2 de Octubre, 2022, de https://www.ethanepperly.com/index.php/2021/12/14/the-elegant-geometry-of-the-generalized-eigenvalue-perturbation-theory/
- GeeksforGeeks. (2022, August 24). ML | Linear Discriminant Analysis. Recuperado el 19 de Septiembre, 2022, de https://www.geeksforgeeks.org/ml-linear-discriminant-analysis/
- Ho, G. (2017, December 30). Linear Discriminant Analysis for Starters. ⁂ George Ho. Recuperado el 22 de Septiembre, 2022, de https://www.georgeho.org/lda/
- Linear Discriminant Analysis (LDA) in Machine Learning — Javatpoint. (n.d.). www.javatpoint.com. Recuperado el 1 de Octubre, 2022, de https://www.javatpoint.com/linear-discriminant-analysis-in-machine-learning
- Nor, N. M., Hussain, M. A., & Hassan, C. R. C. (2015). Process Monitoring and Fault Detection in Non-Linear Chemical Process Based On Multi-Scale Kernel Fisher Discriminant Analysis. 12th International Symposium on Process Systems Engineering and 25th European Symposium on Computer Aided Process Engineering, 1823–1828. https://doi.org/10.1016/b978-0-444-63577-8.50149-2
- Raschka, S. (2014, August 3). Linear Discriminant Analysis. Dr. Sebastian Raschka. Recuperado el 8 de Octubre, 2022, de https://sebastianraschka.com/Articles/2014_python_lda.html
- StatQuest with Josh Starmer. (2016, July 10). StatQuest: Linear Discriminant Analysis (LDA) clearly explained. [Video]. YouTube. Retrieved October 13, 2022, from https://www.youtube.com/watch?v=azXCzI57Yfc