martes, 26 de septiembre de 2017

Jojutla

De niño crecí en un lugar que, junto con la formación académica me mis papás, moldeó en gran parte mi amor por la ciencia. Vivía en una unidad habitacional que tiene una vista muy amplia hacia el valle del suroeste de Morelos con dos volcanes en el fondo. El paso de las estaciones es muy notorio en esa zona de México gracias a los cambios en el color de la vegetación en los cerros, el ir y venir de los glaciares de los volcanes y las "lluvias" de tisne del final de la zafra azucarera. La cerros también me daban una referencia para darme cuenta que el Sol salía en un lugar diferente a lo largo del año, efecto que noté muy bien durante la formación de las mañanas en la secundaria. Las fumarolas del Popocatepetl eran muy comunes y siempre visibles por el clima. Las tormentas eléctricas también son particularmente intensas en esa región, algo que sólo noté hasta que me mudé a otros estados. Hasta la fecha no he estado en un lugar de México en dónde haya tantas especies de plantas y animales en un mismo patio como en ese lugar. Jojutla siempre me recordó que la Tierra es un lugar vivo y de constante cambio. Este mes lo ha hecho más que nunca y nos ha dado a muchos un recordatorio de lo frágiles que somos los humanos ante el poder de la naturaleza

* * *

El 26 de septiembre de 2007 publiqué la primera estrada en este, mi primer y único blog continuamente activo. Me hubiera gustado que mi entrada de X aniversario tuviera un tema menos sombrío. El de 19 de septiembre de este mes ocurrió uno de los sismos más devastadores en la historia de mi país. Mis primeras entradas hablaban de la región, ahora en buena parte en ruinas, en la que pasé toda mi infancia. Nunca nos pasó por la mente el vivir en Jojutla un desastre tan grande. Los sismos siempre fueron frecuentes pero nunca pasaron un breve susto. De niños crecimos haciendo colectas de vivieres hacia lugares que nos parecían muy lejanos. Este fue un tema recurrente entre mis amigos de la infancia con quienes estuve apoyado como brigadista de remoción de escombros desde el martes pasado hasta el domingo. Caminar por aquella ciudad ciudad tan querida reducida a una zona de guerra me provocó una sensación extraña de irrealidad. Al mismo tiempo el ver el compromiso de tanta gente me animó de forma inesperada. Por ahora las emergencias ya están atendidas y solo queda trabajar en las demoliciones y reconstrucción. Aún hay un largo camino por trabajar. Me hubiera quedado más tiempo pero desafortunadamente tenía acceso a internet sólo por breves momentos y no me dí cuenta que la BUAP reanudaba labores hasta el 2 de octubre. Sólo tenía que regresar por mis tramites de titulación. Posiblemente regrese a apoyar este jueves.  

jueves, 7 de septiembre de 2017

Clasificador k-NN supervisado con Scikit-Learn

Scikit-Learn es un módulo para Python que incluye varias rutinas de clasificación, regresión y clustering entre otras herramientas matemáticas utilizadas en machine learning y minería de datos. En esta entrada únicamente trataré un ejemplo sencillo que permitirá introducir a la idea central detrás del clustering o análisis de grupos.

Imaginemos que existe una especie de conejos en la que las hembras tienden a ser grandes y tener pelaje de color gris claro mientras que los machos tienden a ser más pequeños y tener un pelaje más oscuro. Crearemos un programa que implemente un clasificador k-NN (k-nearest neighbors) utilizando el modulo scikit-learn. Este algoritmo de clasificación es muy sencillo. Su trabajo es dividir un espacio de n dimensiones (dónde cada una de ellas en la práctica representa un atributo o característica de un objeto) en N regiones (dónde cada una representa una clase de objetos). El modelo de división del espacio se basa en la razón de clases de los 'k' datos vecinos más cercanos a un punto de dicho espacio. Por ejemplo, para el caso en dónde solo existen n = 2 características y N = 2 clases (triángulos y cuadrados):
Para k = 3 (circulo solido), el elemento desconocido en verde será clasificado dentro de la categoría de los triángulos (2 triángulos vs 1 cuadrado). Para un k = 5 (circulo punteado), el elemento sera clasificado dentro de la categoría de los cuadrados (3 cuadrados vs 2 triángulos). El modelo de clasificación debe poder hacer predicciones para todos los posibles datos que caigan en cualquier punto del espacio de características. El proceso de generación de este modelo se conoce como entrenamiento. Existen dos caminos: supervisado, cuando el conjunto de datos de entrenamiento esta clasificado desde un principio para el algoritmo y no supervisado, cuando no se le dice algoritmo a que clase pertenece cada elemento del conjunto de entrenamiento. En nuestro ejemplo de los conejos utilizaremos un entrenamiento supervisado a partir de un conjunto de datos de entrenamiento que generé con la siguiente distribución (conejos.csv):
El color de los conejos está especificado por valores en escala de grises de 8-bits (0-255). El código se puede dividir en 4 secciones: carga y acondicionado de los datos de entrenmiento, instanciación del clasificador desde el módulo, entrenamiento del clasificador y finalmente la predicción de la clase de un elemento arbitrario. Una vez entrenado el clasificador, debe poder retornar una predicción de la clase a la cual puede pertenecer el vector [color,tamaño]. El código es el siguiente:

Para más detalles recomiendo revisar la documentación de sklearn.neighbors.KNeighborsClassifier.