Buscar este blog

lunes, 14 de abril de 2014

Clasificadores discriminantes, discriminante de Fisher



Bien, en esta entrada hablaré acerca de algunas de las técnicas de discriminantes que existen. Debo aclarar que este  es uno de los temas en donde se encuentra más teoría que práctica en la web, haciendo realmente en ocasiones difícil de entender la idea general (en la mayoría de los casos se encontraran con varias fórmulas sin un ejemplo concreto de su utilización u explicación de las variables que la forman). El motivo de esto, quiero suponer, es porque este tipo de clasificadores se basan en una idea en general, que es la de discriminar a las clases, más que a un algoritmo en particular.

La idea general de este tipo de clasificadores es, una vez teniendo conocimiento de nuestros datos, intentar crear un modelo que nos permita separar a nuestra clases, usualmente este modelo es una recta (discriminantes lineales), una curva (discriminantes no lineales) , un circulo (ídem) etc.

Por ejemplo supongamos que tenemos la gráfica de  dos dimensiones de alguna tabla de una base y que las mismas se ven de la siguiente manera:


Bien, si quisiéramos diferenciar a los círculos verdes de los azules, podríamos trazar un círculo y diríamos que todo lo que este dentro del círculo es azul y fuera del mismo es verde:


Claro, es un poco raro encontrarse con este tipo de distribuciones, usualmente nos encontraremos con datos de la siguiente manera (al menos cuando sigan una distribución Gaussiana):



Para este tipo de datos basta con trazar una línea (ese será nuestro modelo o discriminante) para diferenciar a nuestros datos:


Pero en la práctica, tendremos bases de datos con más de tres atributos, lo cual indica que no podremos visualizarlos en una gráfica y entonces no podremos colocar nuestro discriminante de forma manual, es aquí en donde entran los métodos desarrollados para este tipo de casos.

En esta entrada solo me basaré en los discriminantes más utilizados, los lineales(son los más utilizados por que sirven para discriminar poblaciones que siguen una Gaussiana).

Bien existen muchas técnicas para poder trazar una o varias líneas que nos puedan separar a nuestros datos, entre ellas tenemos algunos métodos que son parecidos al siguiente algoritmo:

Elegir un modelo aleatorio L
Para cada elemento “a” de una población ” A” hacer
                Si el modelo L NO clasifica bien al elemento “a” entonces
                               Modificar el modelo L para que pueda clasificar al elemento a
Termina Si
Termina Para
Salida el modelo L

Si, lo se, es un poco burdo el algoritmo, pero es la idea básica de cómo funcionan la mayoría de los métodos que se encontrarán, claro el problema principal está en modificar el modelo para que pueda clasificar bien a la entrada que se le está dando.

Pero los discriminantes lineales no son tan ciegos y existen varias técnicas que nos permiten escoger (algunas de ellas mediante modelos estadísticos)  la línea (o el plano si es que hablamos de más de dos atributos) con una simple fórmula, ejemplos de esto es el discriminante de Fisher y la máquina de soporte de vectores.

Bien enfocaremos nuestra energía en el discriminante de Fisher.

Este discriminante es muy poderoso, se usa entre otras cosas en imágenes, sistemas de información médica y un sin fin de cosas. Utiliza información de variables estadísticas para poder trazar el modelo que nos servirá para discriminar nuestras clases. Su regla de clasificación es la siguiente:

Clasifica al grupo 1 si:

W'X() < W'((VectorMediasClase1 + VectorMediasClase2) / 2  )

En donde:

  • W= Sw-1  (VectorMediasClase1  -  VectorMediasClase2);
  • W’ = transpuesta de W
  • Sw = ((n1 -1) / n1 + n2 -2) S1 +  ((n1 -1) / n1 + n2 -2  ) S2
  • S1 , S2 = Matriz de covarianzas para la clase 1 y la clase 2
  •  n1,n2 = cantidad de elementos de la clase 1 y cantidad de elementos de la clase 2

Cabe mencionar que a Sw se le conoce como matriz de intra-grupos combinada

Pues bien manos a la obra. 

Para el ejemplo clasificaré a la base de datos iris, en particular clasificaré las clases versicolor y setosa. Primero debo de obtener su vector de medias para cada uno, esta base de datos cuenta con  4 atributos, entonces los vectores de medias quedan de la siguiente manera:

VectorMedias Setosa
5.0059999999999993
3.4180000000000006
1.464
0.24399999999999991
  

VectorMediasVersicolor
5.936
2.7700000000000005
4.26
1.3259999999999998

Ahora obtendremos la matriz de covarianzas para setosa (S1):



0.12424898
0.10029796
0.01613878
0.01054694
0.10029796
0.14517959
0.01168163
0.01143673
0.01613878
0.01168163
0.03010612
0.00569796
0.01054694
0.01143673
0.00569796
0.01149388


Y para versicolor (S2):



0.12424898
0.10029796
0.01613878
0.01054694
0.10029796
0.14517959
0.01168163
0.01143673
0.01613878
0.01168163
0.03010612
0.00569796
0.01054694
0.01143673
0.00569796
0.01149388


Ahora computamos Sw:

Sw = ((50 -1) / 50 + 50 -2) S1 +  ((50 -1) / 50 + 50 -2  ) S2

Sw = 



0.12424898
0.10029796
0.01613878
0.01054694
0.10029796
0.14517959
0.01168163
0.01143673
0.01613878
0.01168163
0.03010612
0.00569796
0.01054694
0.01143673
0.00569796
0.01149388


Vamos por W:

W =
 

-2.8464883
-18.4136903
21.2317579
32.5898589






W’=



-2.8464883
-18.4136903
21.2317579
32.5898589
 
¡Uf! ya casi, ahora que ya tenemos todas las partes, es hora de ensamblar nuestro modelo :

Modelo = W' ((VectorMediasClase1 + VectorMediasClase2) / 2  ) =

Modelo = 42.462542

Y Listo tenemos nuestro modelo ahora, ya podemos clasificar nuevas entradas tomando en cuenta lo siguiente:

  • Si W’X() (en donde X() es la entrada a clasificar) > 42.462542 entonces está por encima de la línea (plano etc.)
    Si W’X() (en donde X() es la entrada a clasificar) < 42.462542 entonces está por debajo de la línea (plano etc.)
Saber que clase está arriba y que clase está por debajo no es nada difícil, basta con proporcionar un  dato del conjunto con el cual se creó el modelo y determinar cuál es arriba y cual abajo, en este caso versicolor está encima y setosa se ubica debajo de nuestro plano.

Tomemos como ejemplo la siguiente entrada:


Sepal length
Sepal width
Petal length
Petal width
7
3.8
1.7
0.4

Ahora computamos:

W’X(7 , 3.8, 1.7, 0.4) = -40.767

Entonces decimos que la entrada pertenece a setosa ya que  ser menor -40.767 < 42.46 se encuentra por debajo de la linea.


Hasta aquí todo excelente, pero ¿Qué pasa si tengo más de 2 clases?, bueno pues es cuestión de crear más líneas, por ejemplo, si tenemos 3 clases, crearemos dos planos, primero detectamos en el modelo que explique la clase que se ubica en el fondo, si resulta ser de dicha clase bueno allí paramos, pero si no, entonces ahora computamos el segundo modelo y determinamos su clase, es decir, modelo1 explica las clases 1 y 2, modelo2 explica las clases 2 y 3. Dada una entrada, con el modelo1 checamos a que clase pertenece, si pertenece a la clase uno , allí termina, si no, entonces aplicamos el modelo2 para determinar si es clase 2 o clase 3.

A continuación muestro una imagen que muestra lo que acabo de comentar, cabe aclarar que solo grafiqué tres parámetros de las clases de la base de datos iris, y dibujé los planos que representan al modelo creado:




1 comentario:

Unknown dijo...

Muy buena información algo extensa pero entendible