Author Archives: Jose Nunez

Experimentación Ondas Cerebrales

6 Dic , 2017,
Jose Nunez
, , , , ,
No Comments

Recientemente tuvimos la oportunidad de experimentar un poco con un sensor de ondas cerebrales (Emotiv Insight) que nos ha servido de introducción al fascinante mundo de los BCI (Brain-Computer Interface)

El proyecto que nos trajo a este punto trata de desarrollar formas de comunicación adicionales para personas con algunas dificultades físicas para comunicarse, incluyendo peronas con dificultades para el habla, la escucha o diversos niveles de parálisis cerebral.

En este artículo quiero condensar un poco una propuesta para una metodología de experimentación que nos permita capturar datos de este tipo de dispositivos y que sirvan de insumo para crear modelos de aprendizaje de máquinas que a su vez nos lleven a desarrollar modelos de interpretación de las ondas y por ende los deseos o necesidades de las personas.

Metodología de Experimentación

  1. Definir un repositorio para la documentación oficial de cada experimento y para los resultados de los experimentos.
  2. Definir personas y roles: facilitador, sujeto de experimentación, observadores.
  3. Definir objetivos y metas del experimento
  4. Definir características de los sujetos de experimentación.
  5. Definir un ambiente controlado para minimizar los estímulos no esperados y el ruido
  6. Establecer un guión o protocolo de pasos, tiempos y clases para el experimento,
    1. Definir tareas a realizar: preparación, arranque, ejecución, finalización y cierre.
    2. Identificar estímulos Intencionales: preparación, arranque, ejecución, finalización, cierre
    3. Identificar estímulos no intencionales: derivados, ruido aceptable, ruido no aceptable (invalidación temprana del experimento)
  7. El resultado de cada experimento será un archivo con la información sensada y la pre-clasificación de los diferentes eventos o estímulos ocurridos detectados por el observador. Este archivo se usará para generar modelos de aprendizaje de máquinas que nos permitan estudiar y entender los fenómenos documentados en cada experimento.

Como siempre, sus comentarios para enriquecer esta metodología serán de gran valor para nosotros.


Haga clic acá para una plantilla de ejemplo


Algunas Referencias Interesantes:

Anaconda y Jupyter Notebook como plataforma de Machine Learning en Python

3 Dic , 2017,
Jose Nunez
, , , , ,
No Comments

¿Qué es Anaconda?

Anaconda es una de las plataformas más prominentes de ciencia de datos para Python. Se puede descargar Anaconda de este enlace: http://www.continuum.io/downloads 


Distribución Anaconda

Expanda para ver Distribución ANACONDA

La distribución gratuita incluye una serie de librerías y programas utilitarios avanzados tales como

Image tomada de https://www.anaconda.com/distribution/

Dentro de los paquetes que me han resultado más interesantes podemos mencionar:

  1. Numpy: Librería de Python para computación científica
  2. Scipy: Meta-librería de computación científica para Python
  3. Pandas: Librerías para estructuras de datos y analítica de datos para Python
  4. Jupyter Notebook: Es un IDE que permite crear documentación “activa/viva” incluyendo visualizaciones, scripts, ejemplos, etc

Jupyter Notebook

Expanda para ver ¿Cómo iniciar con Jupyter Notebook?

Jupyter Notebook perimte generar documentación viva que incluya scripts, datos y visualizaciones de ejemplo.

En Windows, para ejecutar Jupyter Notebook se abre la consola de Anaconda (Windows > Anaconda Prompt) y se ejecuta el comando jupyter notebook

Este comando levanta un servidor jupyter y una ventana de navegador apuntando a http://localhost:8888 (el puerto puede variar)

Cada línea del documento puede ser de tipo Markup, Titulo o Código.

En las líneas que son de tipo código puede ejecutarse este con solo presionar [CTRL] [ENTER]

Desde esa ventana web se pueden crear o modificar proyectos Jupyter que incluyan código de ejemplo Python que puede ser ejecutado en el documento.


Flujo de Trabajo para Aprendizaje de Máquinas

Expanda para ver más sobre Machine Learning Workflow

Machine Learning Workflow: Es un patrón repetible y orquestado que permite la transformación y el procesamiento sistemático de informació para crear soluciones de predicción.

  1. Definir la pregunta a responder
  2. Preparar los datos
  3. Seleccionar un algoritmo
  4. Entrenar un modelo
  5. Validar el modelo
  6. Retro-alimentación

 

Realizando un Proyecto SCRUM exitoso en 7 pasos

27 Nov , 2017,
Jose Nunez
, , ,
No Comments

Continuando con nuestra serie sobre SCRUM les presentamos 7 pasos para un proyecto SCRUM exitoso.

Pueden ver nuestro artículo anterior que resume varios conceptos importantes de SCRUM.

También pueden ver acá que nuestra plantilla scrum incluye detalles de cada ceremonia SCRUM.

Paso 1Identifique una persona que esté dispuesta a llevar a cabo el rol de SCRUM master, una persona que lleve el rol de Dueño de Producto e identifique a su equipo de ejecución.


Paso 2 – El dueño de producto crea un backlog inicial que describa el producto en unidades de trabajo (historias de usuario). Para esto normalmente se requiere el trabajo conjunto entre el dueño de producto y el equipo de ejecución donde el scrum master facilita el proceso, principalmente orientando donde sea necesario al dueño de producto para que las historias de usuario tengan una buena descripción, criterio de aceptación y estimación superficial.


Paso 3 – Se realiza una ceremonia oficial de Planeamiento del Producto donde todo el equipo (dueño de producto, equipo de ejecución, scrum master) revisan el backlog, las estimaciones superficiales, agregando criterios técnicos y aclarando dudas sobre cada historia de usuario. Esta ceremonia es organizada y facilitada por el scrum master. El resultado de esta ceremonia es una estimación general del tamaño del proyecto.


Paso 4 – Se organiza el calendario del siguiente trimestre en iteraciones de dos semanas cada una (aproximadamente entre cinco a seis iteraciones en total). Para esto el scrum master organiza las siguientes ceremonias en el calendario del equipo:

  • Poda del backlog cada dos semanas. Acá se identifican dudas y se hace una estimación final del esfuerzo de cada historia de usuario.
  • Planeamiento de Iteraciones al inicio de cada iteración (cada dos semanas), incluyendo Cierre de Iteración, Retrospectiva y Planeamiento.
  • Actualizaciones Diarias (15 minutos a la misma hora)
  • Planeamiento incremental del producto al final del trimestre. El scrum master tiene la responsabilidad de asegurarse que cada ceremonia se ejecute y tenga el resultado esperado. Para esto cuenta con la colaboración indispensable de todo el equipo, especialmente del dueño del producto.

Paso 5 – Durante la ceremonia de poda del backlog, el equipo de ejecución junto con el dueño de producto identifican dudas en cada historia de usuario y hacen una estimación final del esfuerzo requerido para cada iteración medido en puntos (1,2,3,5,8,13). Se realiza el esfuerzo de dividir las historias de usuario más grandes (> 5 puntos) en historias de usuario más pequeñas alcanzables en una iteración. Se identifican también historias de usuario de investigación donde se requiera aprender cómo realizar alguna tarea o diseñar algo. Las historias de usuario que tengan las aclaraciones necesarias y la estimación final en puntos se denominan “historias podadas”. Esto es importante porque en una iteración solamente se pueden asumir historias podadas.


Paso 6 – En el planeamiento de iteración se identifican la disponibilidad de cada miembro del equipo para la iteración, incluyendo ausencias programadas (vacaciones, permisos, capacitaciones), la cantidad de horas que cada miembro del equipo (en especial el equipo de ejecución) tiene disponibles para realizar tareas de la iteración y se realiza la estimación detallada de cada historia de usuario que se vaya a adoptar en la iteración en términos de tareas y horas estimadas para cada tarea.Al final del planeamiento se tendrá:

  • Una lista de miembros del equipo de ejecución y horas disponibles para la iteración y días de ausencia programada.
  • Una lista de historias adoptadas (compromiso de la iteración) con el detalle de tareas y estimación de las horas que tomaría cada tarea y cual miembro del equipo está a cargo de cada tarea. La sumatoria de las horas estimadas para cada tarea por miembro de equipo se llama “asignación” (allocation) y no debe superar las horas disponibles para los miembros de equipo encargado. Con la cantidad de asignación entre la cantidad de horas disponibles por encargado calculamos el porcentaje de asignación que nos permite ver si un miembro de equipo tiene una signación muy baja (< 85%) o muy alta (>100%)

Paso 7 – El equipo de ejecución adquiere un compromiso por cada iteración. Durante las ceremonias de actualización diaria se actualizan las métricas de ejecución ( horas pendientes, puntos aceptados ) para calcular el gráfico de burndown y se aclaran dudas, se identifican dificultades que requieran ayuda de otros miembros del equipo. Durante todo este proceso el scrum master realiza una labor de facilitador y también da seguimiento a las necesidades de ayuda.

Durante la iteración se ejecuta el compromiso del equipo, se removen obstáculos y se monitorea la ejecución dentro del marco de la ceremonia de actualización diaria.

Al final de la iteración se realiza un cierre que involucra:

  • Una sesión retrospectiva (qué cosas debemos seguir haciendo, qué cosas debemos dejar de hacer y qué cosas debemos empezar a hacer) especialmente con miras a mejorar el % compromiso entregado.
  • Una demostración de las historias de usuario aceptadas por el dueño de producto como terminadas.
  • Y el reacomodo de historias de usuario que no se hayan terminado (compromiso fallido) hacia la siguiente iteración.

Y… en resumen:

En mi experiencia – Un resumen sobre SCRUM

26 Nov , 2017,
Jose Nunez
, ,
No Comments

La administración de proyectos es una de las actividades más importantes de quehacer humano. En gran medida, la administración de proyectos determina el éxito o fracaso de proyectos y hasta de organizaciones enteras.

En la actualidad la administración de proyectos ha evolucionado de modelos como Waterfall, donde un gerente de proyecto establece un cronograma y dirige un conjunto de personas para cumplirlo al final de dicho cronograma, a modelos más iterativos donde los roles de administración de proyecto y de equipo han sido completamente redefinidos; dando lugar a interacciones de equipo de trabajo más ricas y productivas. Uno de estos modelos es SCRUM.

También pueden ver nuestro artículo: Realizando un Proyecto en SCRUM exitoso en 7 pasos

El siguiente mapa mental ilustra los principales elementos que componen la metodología SCRUM:

En resumen

Proceso Iterativo

El modelo SCRUM permite llevar adelante proyectos simples y complejos mediante un proceso iterativo de planeamiento y ejecución, donde los equipos de trabajo son redefinidos para cubrir roles específicos como SCRUM Master, dueño de producto y ejecutores. Cada iteración usualmente se extiende por dos o tres semanas.


¿Qué es el proyecto? un conjunto de historias de usuario o metas

Un proyecto es entonces un conjunto de metas definidas por el dueño de producto (muchas veces con ayuda del equipo de ejecución). Cada meta (también llamada historia de usuario) se define en términos de descripción y criterio de aceptación.

Un ejemplo de una historia de usuario hipotética es el siguiente:

  • Descripción: Como cliente de uber, quiero poder pagar en efectivo
  • Criterio de aceptación:
    • La aplicación móvil tiene un botón para que el usuario escoja el medio de pago entre su tarjeta o efectivo
    • Cuando el usuario elige pagar en efectivo su tarjeta no es debitada con el costo del viaje
    • El conductor tiene un mecanismo para dar fe en su aplicación de haber recibido el dinero del pago

Esta lista de historias de usuario  es luego revisada por el equipo de ejecución para estimar a grosso modo el esfuerzo requerido para realizar cada una de ellas. Esta estimación de esfuerzo se hace en puntos relativos (1,2,3,5,8,13) . La siguiente lista muestra un ejemplo de la equivalencia de los puntos al esfuerzo requerido:

  • 1 punto: La historia de usuario se puede completar en 8 horas o menos con ningun riesgo previsible de extender su ejecución y ninguna dependencia externa.
  • 2 puntos: La historia de usuario se puede completar en 16 horas o menos y/o involucra una nivel bajo de riesgo y/o pocas dependencias externas.
  • 3 puntos: La historia de usuario se puede completar en 32 horas o menos y/o existen riesgos razoables de complejidad o dependencias externas.
  • 5 puntos: La historia de usuario se puede completar en 60 horas o menos  (más de una semana) y/o involucra riesgos importantes en complejidad o dependencias externas.
  • 8 puntos: La historia de usuario se puede completar en 80 horas o menos (dos semanas) y/o involucra riesgos críticos en términos de complejidad o dependencias externas.
  • 13 puntos: La historia de usuario se puede completar en 80 horas o más  (tres semanas o más) y/o involucra demasiados riesgos gríticos, demasiada complejidad o demasiadas dependencias externas.

Normalmente cuando una historia de usuario se estima en 5 puntos o más, se realiza el ejercicio de dividirla en historias de usuario más pequeñas que puedan ejecutarse en menos de una semana cada una.

Como nota final, existen dos tipos de historia de usuario: las historias de negocio y las historias de investigación (SPIKES). Las historias de investigación normalmente miden 2 a 3 puntos, tienen como objetivo aprender cómo se hace algo (crear conocimiento en el equipo)  y culminan con documentación sobre el resultado de la investigación y posiblemente nuevas historias de negocio a ser ejecutadas en iteraciones posteriores.

Al conjunto de historias de usuario que definen un proyecto se le llama “backlog”


Iteraciones, tareas y ejecución

Cada iteración de dos o tres semanas se inicia con un proceso detallado de planeamiento donde cada historia de usuario del backlog que se vaya a trabajar en la iteración es desglosada en tareas y miembros del equipo que realizarán cada tarea, más una estimación en horas del esfuerzo necesario para realizar cada tarea.

Al conjunto de historias  de usuario y tareas elegidas o planeadas para ejecutarse en una iteración se le conoce como el compromiso del equipo en esa iteración. El equipo entonces hará todo lo necesario para cumplir con su compromiso para con el cliente o el dueño del producto; incluyendo trabajos interdisciplinarios, investigaciones, sesiones de trabajo, etc.

Una historia de usuario se considera terminada cuando (1) todas sus tareas han sido completadas con éxito, (2) se han cumplido todos los criterios de aceptación y por ende ha sido aceptada por el dueño de producto y (3) la historia de usuario cumple con la definición de terminado que normalmente incluye documentación, integración de resultados, demostraciones, pruebas, etc.


Rituales o Ceremonias

Se dice que la vida del ser humano está definida por sus rituales, por aquellas cosas que realiza frecuentemente. Por ejemplo una persona que tiene el ritual de levantarse a las 4 de la mañana a correr tiene una definición de vida diferente de una persona que tiene el ritual de levantarse a las 8am a tomar capuccino dulce.

Los principales rituales del modelo SCRUM inclyen:

  • Planeamiento Incremental del Producto: Es cuando se revisa el backlog en equipo y se determinan los cambios necesarios (remover historias de usuario, agregar nuevas historias de usuario, nuevas dependencias, etc.)
  • Poda del backlog (grooming): Es cuando se realiza la estimación de cada historia de usuario en términos de puntos. Para esto el equipo (incluyendo el dueño del producto) se reunen por dos o más horas y revisan la definición de cada historia, el criterio de aceptación de cada historia y la definición de “terminado” adoptada por el equipo.
  • Planeamiento de Iteración: En esta ceremonia de aproximadamente 1 a 2 horas se planea la itereación siguiente. Normalmente se realiza inmediatamente después del cierre de la iteración anterior. Aquí se identifican (1) aspectos limitantes como la disponibilidad de cada miembros del equipo, vacaciones, etc; (2) las historias de usuario que se trabajarán en la iteración siguiente y (3) las tareas específicas y la estimación en horas de cada tarea. De nuevo, al conjunto de historias de usuario y tareas de una iteración se le conoce como el compromiso del equipo.
  • Reunión de Actualización Diaria (DSU): Esta es una ceremonia de máximo 15 minutos donde cada miembro del equipo comunica sus avances, la ayuda que pudiera necesitar y sus planes para el día. Es importante aclarar que un DSU donde nadie necesita ayuda es probablmente un DSU demasiado superficial.
  • Cierre de Iteración: En esta sesión normalmente de 1 hora se da por concluida una iteración y se identifican logros, correcciones de equipo necesarias y planes. Normalmente se realiza junto con el Planeamiento de Iteración en una sesión conjunta que ronda de 2 a 3 horas.
    • Demostraciones: Cada miembo del equipo demuestra sus logros de la iteración.
    • Retrospectiva: Esta ceremonia tiene como objetivo la mejora continua del equipo. Acá cada miembro del equipo expresa qué cosas considera que el equipo debería (1) dejar de hacer, (2) continuar haciendo/profundizando y (3) comenzar a hacer; especialmente con miras a la parte del compromiso de iteración que no se haya logrado o a las dificultades que se enfrentaron durante la iteración.
    • Movimientos de historias de usuario no terminadas a la iteración siguiente

Estado del Proyecto, Métricas y Velocidad de Equipo

Como ya mencionamos un proyecto es definido como el conjunto de historias de usuario que componen el backlog y por sus recursos, es decir el equipo de ejecución.

El tamaño del backlog se define como la suma de los puntos asignados a todas las historias de usuario del backlog.

Luego de tres iteraciones es probable que el equipo de ejecución sea capaz de preveer cuantos puntos pueden ejecutar por iteración. Esta métrica es importante para el proyecto por que permite estimar en el tiempo la duración aproximada del proyecto.

Así, si un backlog mide 100 puntos, y la velocidad del equipo es de 10 puntos por iteración de dos semanas, se puede preveer que se requerirán al menos 10 iteraciones para completar el proyecto, es decir 20 semanas o lo que es lo mismo 5 meses.

Estas métricas aparte de ser muy simples permiten también conocer en el tiempo el estado del proyecto, tanto respecto a la iteración que se está ejecutando (cuantos puntos han sido aceptados, cuantos puntos están siendo ejecutados (WIP), cuantos puntos no se han empezado) así como respecto al proyecto como un todo (cuantos puntos se han ido ejecutando por iteración, cuantos puntos faltan para completar el proyecto, incrementos o disminuciones de velocidad de equipo en el tiempo, etc.)


Enlace a Plantilla

Como un aporte final les adjunto este enlace donde resumo los roles, ceremonias y presento una plantilla para un backlog de historias de usuario.

También en esta plantilla muestro la construcción de un gráfico de “burn-down” que permite visualizar el avance de la iteración vs el ideal esperado.

 

Espero que les sea de utilidad.

Enlace de Google Sheets. Plantilla SCRUM (haga clic acá)

 

 

Inteligencia Artificial o Aprendizaje de Máquinas

12 Nov , 2017,
Jose Nunez
, , , , ,
No Comments

Flor IRIS

Haciendo un resumen exagerado, podemos decir que la Inteligencia Artificial y/o el Aprendizaje de Máquinas son la forma en que hemos logrado que los sistemas artificiales (máquinas) logren aprender más o menos igual como nosotros los seres humanos lo hacemos: mediante el análisis de un conjunto de observaciones (o muestras) de forma que una vez realizado el aprendizaje, el sistema pueda realizar inferencias ya sea prediciendo un resultado basado en un conjunto de datos.

Las tareas de aprendizaje pueden ser de dos tipos: aprendizaje supervisado (cuando se tiene disponible el resultado durante el aprendizaje) y aprendizaje no-supervisado cuando no se tiene un resultado disponible.

A su vez, las tareas de parendizaje pueden incluir problemas de:

  1. Clasificación: cuando se necesita clasificar un conjunto de características en clases pre-definidas como valores discretos; por ejemplo determinar qué clase de planta está representada en un conjunto de datos.
  2. Regresión: cuando se necesita establecer un valor continuo como resultado de analizar un conjunto de características. Por ejemplo establecer el precio de un producto.
  3. Agrupamiento: cuando se necesita encontrar características comunes entre si que denoten grupos de datos. Por ejemplo la identificación de patrones en una imagen.

El proceso de aprendizaje de máquinas en general se puede definir en los siguientes pasos:

  1. Determinación del Problema: Identificar el objetivo, qué es lo que se quiere lograr (clasificación, regresión o agrupamiento) e identificar las características o atributos de datos relevantes (“features”); así como el tipo de proceso (supervisado o no-supervisado)
  2. Escogencia del algoritmo de aprendizaje: Existen diversos algoritmos para tomar una serie de datos y generar modelos de aprendizaje de máquinas. Estos algoritmos difieren uno de otro en su aplicabilidad para diferentes tipos de problemas. En este enlace se presenta un tutorial bastante sencillo sobre diferentes algoritmos y su evaluación para un problema determinado.
  3. Entrenamiento de un Modelo: Consiste en ejecutar el o los algoritmos elegidos usando el 80% de los datos conocidos (en el caso de aprendizaje supervisado) para generar un modelo que pueda hacer futuras inferencias con datos nuevos. Esto da como resultado un modelo entrenado.
  4. Validación del modelo entrenado: Consiste en ejecutar el algoritmo sobre el modelo entrenado usando el 20% restante y comparando los resultados con los valores conocidos para ese 20% de datos.
  5. Uso del modelo y refuerzo: Una vez alcanzada una precision deseada en los resultados (tal vez > 90%) se puede ya utilizar el modelo entrenado y validado para realizar nuevas inferencias a partir de nuevos datos donde no se tenga un resultado predefinido.

Como una nota final podemos decir que los conceptos de Aprendizaje de Máquinas y de Inteligencia Artificial se pueden separar citando un artículo reciente en la revista Forbes:

Inteligencia artificial (IA) es el concepto amplio de máquinas que son capaces de realizar tareas en una forma que se pueda considerar “inteligente”

y,

Aprendizaje de máquinas es la aplicación de paradigmas de IA al rededor de la idea de que deberia ser posibe que simplemente demos datos a las máquinas y que estas puedan aprender por sí mismas.

Acá algunos conceptos más avanzados que hemos logrado aprender: http://costaricamakers.com/?p=1455

______________________________________________

Referencias

Computación Cuántica – La Desconcertante Guerra de las Álgebras

11 Nov , 2017,
Jose Nunez
No Comments

La física cuántica ( o mecánica cuántica ) no deja de ser un tema fascinante y a la vez desconcertante. Esto porque las cosas en el mundo subatómico se rigen por reglas completamente diferentes a las que estamos acostumbrados; y nuestro entendimiento de los fenómenos físicos se ha limitado históricamente a la física clásica donde cada cosa tiene un estado deterministico que se puede observar, medir y controlar de manera más o menos estable.

A este desconocimiento masivo debemos agregar la gran cantidad de esoterismo que encuentra uno en la “literatura” común sobre mecánica cuántica y sobre cómo esta explicaría la forma de realizar cosas como viajar en el tiempo, la tele-transportación de materia, la telepatía y otras tonterías de ese corte.

Sobre este “andamiaje” teórico es que el ser humano se encuentra de frente con un tema todavía más profundo: la computación cuántica. Es decir, la computación que se basa en los fenómenos o leyes de la mecánica cuántica.

Tengo mis reservas sobre el tema. Por momentos me resulta fascinante, y por momentos irritante. Pero bueno, nada que no haya enfrentado antes con muchos otros temas de esta experiencia humana.

Un dato que me resulta importante de aclarar es que en realidad el ser humano ha estado manipulando las cosas a nivel sub-atómico desde hace rato. Cada vez que un microprocesador procesa unos y ceros en realidad está procesando flujos de electrones (partículas sub-atómicas); haciendo que fluyan en mayor o menor intensidad por diferentes materiales y dispositivos (transistores, resistencias, diodos, etc.)

El punto medular de la computación cuántica radica en una álgebra distinta. Mientras la computación moderna está basada en el álgebra booleana 2 que podríamos definir como una simplificación determinística de las matemáticas que permite representar prácticamente cualquier cosa por medio de unos y ceros; la computación cuántica necesita una álgebra distinta porque se basa en modelos probabilísticos y no determinísticos. Es decir, mientras el estado de un bit es definitivamente uno o cero, el estado de un qubit se considera superpuesto (uno y cero a la vez) y hasta que es medido y adquiere uno de los dos estados, “abandonando” el anterior. Estamos hablando de la Lógica cuántica 3.

Entonces en gran medida la computación cuántica se centra en el debate entre modelos deterministicos y probabilísticos 4 y de cómo sacar mejor provecho de cada uno.

En mi próximo aporte quiero abordar otro aspecto de este tema: La coherencia y decoherencia.

Finalizo con esta frase que probablemente escribiría Edwin Shrödinger en su lecho de muerte:

“cada vez que alguien usa el Gato de Schrödinger
para afirmar cualquier cosa metafísica,
espiritual, o sobre universos paralelos,
el pobre gato se revuelca en su tumba.”

______

1: https://web.archive.org/web/20161104151733/http://computadoras.about.com/od/tipos-de-pc/fl/iquestQueacute-es-la-computacioacuten-cuaacutentica.htm
2: https://es.wikipedia.org/wiki/%C3%81lgebra_de_Boole
3: https://es.wikipedia.org/wiki/Lógica_cuántica
4: http://tornado.sfsu.edu/geosciences/classes/m698/Determinism/determinism.html
5: https://es.wikipedia.org/wiki/Gato_de_Schr%C3%B6dinger

Algunos conceptos interesantes de Machine Learning usando Anaconda / Python

23 Sep , 2017,
Jose Nunez
, ,
No Comments

Continuando con nuestras recientes publicaciones sobre “Machine Learning” (artículo anterior sobre fundamentos), en esta oportunidad compartimos algunas cosas que hemos aprendido siguiendo el tutorial “Machine Learning in Python Step by Step“.

Para poder entender este artículo recomendamos seguir el tutorial paso a paso… no se toma más de 30 minutos.

  1. Anaconda: Aprendimos que se puede configurar un ambiente relativamente completo para experimentación con Machine Learning y Python usando Anaconda.
  2. Dataset IRIS: Existe un “Hello World” para Machine Learning basado en un dataset llamado “IRIS” 3. Este consiste en un conjunto de datos que describe tres tipos de flores Iris (setosa, virginica y versicolor) por las dimensiones de su sépalo y pétalo; se puede usar para entrenar un modelo de aprendizaje de máquina para que este infiera el tipo de flor (clasificación) con base en la combinación de parámetros.
  3. Arreglos: Python provee mecanismos para expresar y manipular arreglos de forma sumamente robusta. Podemos resumirlos de la siguiente manera:
    • Básicamente [a:b,c:d] donde a:b representa un rango de filas y c:d representa otro rango de columnas.
    • array[:,0:4] retorna todas las filas de la matriz y las primeras 4 columnas a partir de la columna cero.
    • array[:,4] retorna todos los elementos (filas) de la quinta columna (índice 4)
      
      
  4. Entrenamiento y Validación: El entrenamiento y validación de modelos de aprendizaje de máquinas usualmente suele dividir los datos conocidos en 80% para aprendizaje o creación del modelo y 20% para validación del modelo generado. En este tutorial se usa la función model_selection.train_test_split(X,Y, test_size, random_state) de la libreria sklearn.
  5. SKLEARN LIB: Existen diversos algoritmos de clasificación en la librería sklearn:
    1. LogisticRegression
    2. LinearDiscriminationAnalysis
    3. KNeighborsClassifier
    4. DecisionTreeClassifier
    5. GaussianNB
    6. SVM/SVC
  6. Precisión de Los Algoritmos: Diferentes algoritmos presentan diferentes niveles de precisión dependiendo del problema a resolver. Estos se pueden evaluar usando funciones como model_selection.cross_val_score que da como resultado medidas estadísticas como la media y la desviación estandar. Esta validación se puede confirmar con gráficos de tipo box charts, scattered matrix e histogramas. Estos gráficos se generan en python usando librerías como matplotlib
  7. Aprender y Predecir: Una vez entrenado el modelo (con knn.fit()) se pueden generar predicciones (knn.predict())
  8. Matriz de Confusión: Las predicciones pueden ser validadas mediante mecanismos como confusion_matrix que provee una análisis simple de valores esperados y valores predichos de manera correcta y errónea.
    • La matriz de confusión tiene un eje (x) que representa los valores conocidos, y un eje (y) que representa los valores predichos.
      setosa     ==> [[ 7   0   0]
      versicolor ==>  [ 0  11   1]
      virginica  ==>  [ 0   2   9 ]]
                        se  ve  vi
    • Esto se interpreta así:
      • Se identificaron 7 setosas adecuadamente.
      • De las 12 versicolor se identificaron 11 correctamente y una como virginica
      • De las 11 virginicas se identificaron 9 correctamente y 2 como versicolor.

Referencias:

  1. Machine Learning Step by Step: https://machinelearningmastery.com/machine-learning-in-python-step-by-step/
  2. Confusion Matrix: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html
  3. IRIS: https://es.wikipedia.org/wiki/Iris_flor_conjunto_de_datos
  4. Iris Setosa Imagehttps://www.rhs.org.uk/Plants/9355/Iris-setosa/Details

 

Modelando Bases de Datos Relacionales con XAMPP y phpMyAdmin

12 Sep , 2017,
Jose Nunez
, , , , , , ,
No Comments

Alguna vez habrán enfrentado la necesidad de modelar una base de datos relacional.

El mundo de bases de datos relacionales (RDBM) está regido por unos cuantos titanes en el tema. Desde Oracle, pasando por MS SQL Server y sin olvidar MySQL (y su hermana MariaDB) y PostgreSQL.

Para efectos de este artículo nos enfocaremos en MySQL y su nueva ramificación MariaDB.

MySQL forma parte de una pila de tecnologías web sumamente influyentes a nivel mundial. Nos referimos al “Stack LAMPP” que se traduce en Linux, Apache, MySQL, PHP/PERL.

En este conjunto de tecnologías, LINUX figura como un principal contendor en el mercado de sistemas operativos para servidores web (si es que existe tal cosa); mientras que Apache se desempeña como uno de los principales programas de servidor web a nivel mundial. Luego tenemos MySQL que es el componente de base de datos y finalmente PHP como lenguaje de programación para la web del lado del servidor.

Existen varios sistemas de instalación de la pila LAMPP; en nuestro caso usaremos una publicada por la organización ApacheFriends.org denominadada XAMPP. La “X” viene por la compatibilidad con sistemas operativos fuera de LINUX. Así XAMPP permite la instalación de la pila AMPP tanto en LINUX como en MS Windows y OSx de Mac.

A su vez, XAMPP trae algunas utilidades adicionales de las cuales vale la pena mencionar el sistema phpMyAdmin. Una herramienta avanzada que permite el diseño y manipulación de bases de datos MySQL.

Una vez que hemos descargado e instalado XAMPP en nuestro computador, y que nos hemos asegurado de que los servicios para Apache y MySQL están funcionando adecuadamente, podemos acceder al poder de XAMPP la dirección del servidor local: http://localhost/

La siguiente imagen muestra nuestra pantalla principal de XAMPP por medio del navegador.

Nótese entonces que en el menú superior a la derecha tenemos la opción “phpMyAdmin”

Seguidamente se ilustra como luce nuestra versión de phpMyAdmin en este momento.

Al lado izquierdo tenemos las diferentes bases de datos que están ya definidas en el servidor; mientras que a mano derecha tenemos el área de trabajo con diversos puntos de funcionalidad para editar bases de datos y cualquier otro elemento de base de datos.


PASO 1 – CREACIÓN DE BASE DE DATOS

Comenzamos este ejercicio haciendo clic en el nodo “New” que se encuentra a mano izquierda sobre la lista de bases de datos.

Esto nos muestra un formulario para crear una nueva base de datos que básicamente pregunta por el nombre de la base de datos y por el conjunto de caracteres (collation) predeterminado para la base de datos. Este parámetro define qué tipo de simbología usará la base de datos para almacenar texto. Uno de los conjuntos de caracteres más efectivos para occidente es el utf8 con sus variantes por idioma. Para este ejemplo que soporta símbolos en español y otros idiomas usaremos utf8_bin.

Una vez creada la base de datos podemos comenzar con el proceso de modelado.

Para esto utilizaremos el siguiente enunciado:

Se requiere diseñar una base de datos relacional para manejo de inventarios. El inventario contabiliza las cantidades disponibles de productos de diversos tipos; tomados del catálogo de productos que vende la organización. Para efectos de inventario se tienen dos tipos de producto: (1) los productos “serializables” que son productos que se pueden identificar de manera única (por número de serie asignado por el fabricante) y (2) los productos “a granel” que no se pueden identificar de manera unica sino por cantidades, por ejemplo 1 Kg de tornillos, o 300 destornilladores. El inventario se maneja en diversas bodegas y a su vez se contabilizan las entradas y salidas de inventario para y desde cada bodega.

Con este enunciado vamos a dar un siguiente paso para la identificación de los elementos fundamentales del modelo conceptual, es decir las entidades y sus relaciones.


PASO 2 – Identificación de Elementos

Una técnica que proponemos para esto es la de marcar el enunciado con un color (azul) aquellas partes que describen una entidad y con otro color (verde) aquellas partes que describen una relación. Así el enunciado queda de la siguiente manera:

Se requiere diseñar una base de datos relacional para manejo de inventarios. El inventario contabiliza las cantidades disponibles de productos de diversos tipos; tomados del catálogo de productos que vende la organización. Para efectos de inventario se tienen dos tipos de producto: (1) los productos “serializables” que son productos que se pueden identificar de manera única (por número de serie asignado por el fabricante) y (2) los productos “a granel” que no se pueden identificar de manera única sino por cantidades de alguna unidad de medida; por ejemplo 1 Kg de tornillos, o 300 destornilladores. El inventario se maneja en diversas bodegas y a su vez se contabilizan diferentes movimientos como entradas y salidas de inventario para y desde cada bodega.

De esta forma hemos identificado las siguientes entidades:

  1. Catálogo de Producto
  2. Tipo de Producto
  3. Unidad de Medida
  4. Bodega
  5. Movimiento
  6. Tipo de Movimiento
  7. Fabricante

También se identifican algunas relaciones:

  1. Catálogo de Producto >==> Tipo de Producto
  2. Catálogo de Producto >==> Fabricante
  3. Catálogo de Producto >==> Unidad de Medida
  4. Movimiento >==> Tipo de Movimiento (entrada/salida)
  5. Movimiento >==< Bodega

Finalmente algunos atributos relevantes son:

  1. Número de serie
  2. Cantidad
  3. Nombre del Producto
  4. Nombre de Bodega
  5. Descripción de Unidad de Medida
  6. Nombre de Tipo de Movimiento

PASO 3 – Modelo Conceptual

Una vez identificados los elementos básicos del modelo de datos, podemos realizar un diagrama de Entidad-Relación que nos permita comunicar cuales son las entidades que componen el modelo y como se relacionan entre si.

Aunque basta con Power Point o algun otro software que nos permita generar cajitas y conectarlas con líneas; en nuestro caso usaremos el poder de phpMyAdmin.

Para esto tomamos cada entidad y definimos las tablas respectivas con los valores más fundamentales que podemos pensar para cada entidad:

  1. Tipo de Producto (Código de Tipo de Producto, Descripción)
  2. Unidad de Medida (Código de Unidad de Medida, Descripción)
  3. Fabricante (Código de Fabricante, Nombre)
  4. Catálogo de Producto (Código de Producto, Descripción, Código de Tipo de Producto, Código de Fabricante, Código de Unidad de Medida)
  5. Bodega (Código de Bodega, Descripción)
  6. Tipo de Movimiento (Código de Tipo de Movimiento, Descripción)
  7. Movimiento (ID de Movimiento, Código de Bodega, Código de Producto, Código de Tipo de Movimiento, Cantidad)

Nótese que hemos reorganizado las entidades de forma que primero se definen aquellas de las cuales hay dependencia en otras entidades. También debemos acotar que los nombres de las tablas (entidades) y sus atributos los realizamos usando una nomenclatura estándar, donde “cd” refiere a código, “dsc” refiere a descripción y “id” refiere a identificador numérico automático. Se usan ID’s en las entidades transaccionales, mientras que se usan códigos en las entidades tipificadoras.

La siguiente imagen muestra cómo se definen los campos básicos de una tabla (entidad). Para poder acceder a este formulario se hace clic en el nodo de base de datos “inventario” a la izquierda. En el área de trabajo hay una opción para iniciar la creación de una tabla (entidad) con una cantidad predeterminada de columnas (atributos)

 


PASO 4 – Modelado de las Relaciones

Una vez definidas las entidades (tablas) podemos visualizarlas usando el área de la izquierda, expandiendo los nodos correspondientes como se muestra en la siguiente imagen.

A su vez, si hacemos clic en la base de datos “inventario” podremos acceder a la función “Designer” la cual nos permitirá ir construyendo las relaciones entre las entidades (tablas) mientras que construimos el diagrama Entidad-Relación correspondiente.

La siguiente imagen muestra la función de diseño, desde donde se pueden crear relaciones entre las diferentes tablas.

Si hacemos clic en “Toggle small/big” en el menú de la izquierda podremos ver todos los atributos.

También, si hacemos clic en “Create relationship” podremos seleccionar – primero – un atributo de tipo “llave primaria” y – segundo – un atributo en otra tabla de tipo “referencia foránea” y así conformar las relaciones.

De esta forma podemos ver el diagrama con relaciones logrado como sigue, el cual no solamente expresa las relaciones en sí, sino también la cardinalidad entre las entidades.

Volviendo al diagrama reducido a solamente las entidades podemos ver que queda así; incluyendo indicadores de cardinalidad entre las entidades.

Estos diagramas son sumamente útiles para discutir y razonar sobre el modelo de datos. A su vez se puede utilizar phpMyAdmin para agregar o modificar atributos en la fase de modelado detallado de la base de datos.

Posibilidades con el pequeño Wheely

12 Ago , 2017,
Jose Nunez
No Comments

¿Recuerdan nuestro pequeño Robot de dos llantas?

Bien, le agregamos unos cuantos dispositivos más y veremos si lo podemos hacer un poco más listo.

  • Batería de Lítio-Polímero de 3.7V recargable. Para no gastar en baterías AA.
  • Regulador de 3V a 5V que nos permite usar la batería LIPO para alimentar una gama interesante de controladores y los motores a 5V.
  • Sparkfun Thing 8266: Este controlador nos da capacidades WIFI y además un mecanismo para cargar la batería LIPO usando un cable micro-USB convencional.
  • Arduino 101: Microcontrolador de gran capacidad que además trae acelerómetro y giroscópio en 6 ejes y comunicación Bluetooth BLE. Lo alimentamos a 5V, pero operan sus señales a 3.3V.
  • Sensor de proximidad para detectar obstáculos o mapear áreas que opera a 5V.
  • El ya conocido controlador S4A-EDU con puente H desconectabe. Nos permite controlar los motores en diferentes direcciones e incluye comunicación tx/rx que podemos usar para conectarlo a los otros micro-controladores mencioandos.

De momento no he programado mayor cosa con todo esto, salvo por este ejemplo; pero esperamos hacer algunas cosas interesantes con todas estas capacidades.

RFID Usando RDM6300 y Arduino 101, TinyTILE o ARDUINO UNO

7 Ago , 2017,
Jose Nunez
, , , ,
No Comments

(!) Antes de seguir estas instrucciones asegúrese de entender las Condiciones de Uso de nuestro sitio.

El RDM6300 es un módulo bastante sencillo de utilizar en el entorno de ARDUINO gracias a la librería RDM6300 que se puede descargar de acá.

El módulo tiene tres conectores:

P1 (6 contactos): que contiene los pines para realizar comunicaciones. En este experimento utilizaremos solamente el pin 1 ubicado en la esquina que lo conectaremos al pin 6 del Arduino 101. Básicamente este es el único pin que se conecta al microcontrolador.

P2 (2 contactos) que es donde se conecta la antena (bobina)

P3 (3 contactos) que es donde se alimenta el sistema y donde se pude agregar un LED (todavía no tengo claro para qué exactamente) el punto es que de este solo utilizaremos el pin 2 y 3 que son +5V  y GND respectivamente.

El programa que utilizamos simula la apertura de un sistema mediante un pulso a un LED verde conectado al pin 3 de Arduino, y un pulso para cerrar simulado por un LED amarillo conectado al pin 2 del Arduino.

Algo interesante es que el Arduino 101 opera a 3.3V pero es tolerante a señales de 5V lo cual lo hace particularmente versatil (esto también aplica para TinyTILE. Con Arduino UNO también funciona.

Conexiones:

ARDUINO
PIN  2 ==> amarillo ====> LED Amarillo ===> Resistencia 150 Ohm ==> GND
PIN  3 ==> verde =======> LED Verde ======> Resistencia 150 Ohm ==> GND
PIN  6 <== café <======== PIN 1 del conector P1 del RDM6300 (TX)
PIN 13 ==> naranja =====> LED Verde ======> Resistencia 150 Ohm ==> GND
5V ======> rojo ========> Puerto + del protoboard
GND =====> negro =======> Puerto - del protoboard

RDM6300
PIN 2 del conector P3 (Vin) <===== Puerto + del protoboard (operando a 5V)
PIN 3 del conector P3 (GND) <===== Puerto - del protoboard

PIN 1 del conector P1 (TX) ======> PIN 6 del ARDUINO

Conector P2 =====< ANTENA (bobina)

 

Programa de ejemplo:

La versión oficial de este sketch se puede encontrar acá: https://github.com/janunezc/robotics/tree/master/rfid/rfid_rdm630_open_then_close

(!) También, será necesario que los archivos de la librería RDM6300 estén disponibles para compilar el sketch. Se puede copiar ambos archivos (rdm630.h y rdm630.cpp) en la misma carpeta del sketch, o en la carpeta de librerías del ARDUINO IDE (c:\user\myusername\documents\Arduino\libraries\rdm630\***). Es importante asegurarse que la librería RDM630 solo está copiada una vez en las diferentes rutas.

/*
 * Programa escrito por Jose Nunez como ejemplo didáctico del uso del RDM6300 con un ARDUINO 101.
 * Use bajo su propio riesgo.
 * Ejemplo de dominio público.
 *
*/
#include "rdm630.h"

rdm630 rfid(6, 0);  //TX-pin of RDM630 connected to Arduino pin 6
int led_yellow_close = 2;
int led_green_open = 3;
int led_signal = 13;
long OPEN_PULSE_WIDTH = 800;
long CLOSE_PULSE_WIDTH = 1000;
long OPEN_STATE_DURATION = 5000; 
long CODE_READ_DELAY = 10000;
long codeReadDelayMaxMillis = millis();

void setup()
{
    Serial.begin(115200);  // start serial to PC
    pinMode(led_yellow_close, OUTPUT);
    pinMode(led_green_open, OUTPUT);
    pinMode(led_signal, OUTPUT);
    rfid.begin();
    ledSignal(5,500);
    setMessage("READY!");
}

void loop()
{
  unsigned long rfidTagCode = 0;  
  
  if(rfid.available()){
    setMessage("RFID Data is available! reading it...");
    rfidTagCode = readRFIDCode();
    setMessage("Data: " + String(rfidTagCode));
    if(millis() > codeReadDelayMaxMillis) {
      if(rfidTagCode == 7598635) {
        setMessage("OPEN");
        openPulse();//This involves a closePulse() call inside the openPulse() function.
        codeReadDelayMaxMillis = millis() + CODE_READ_DELAY;
      } else {
        setMessage("I DONT KNOW YOU!");
        closePulse();
      }
    } else {
      setMessage("SkippingNewReads");
      delay(500);
    }   
  }
}

void openPulse(){
  setMessage("SENDING OPEN PULSE");
  digitalWrite(led_green_open, HIGH);
  delay(OPEN_PULSE_WIDTH);
  digitalWrite(led_green_open,LOW);
  setMessage("OPEN PULSE DONE! Waiting for OPEN STATE DURATION...");
  delay(OPEN_STATE_DURATION);
  setMessage("OPEN STATE COMPLETE");
  closePulse();
}

void closePulse(){
  setMessage("SENDING CLOSE PULSE");
  digitalWrite(led_yellow_close, HIGH);
  delay(CLOSE_PULSE_WIDTH);
  digitalWrite(led_yellow_close, LOW);
  setMessage("CLOSE PULSE DONE!");
}

unsigned long readRFIDCode(){
  byte data[6];
  byte length;

  rfid.getData(data,length);
  Serial.println("Data valid");
  for(int i=0;i<length;i++){
      Serial.print(data[i],HEX);
      Serial.print(" ");
  }
  Serial.println();
  //concatenate the bytes in the data array to one long which can be 
  //rendered as a decimal number
  unsigned long result = 
    ((unsigned long int)data[1]<<24) + 
    ((unsigned long int)data[2]<<16) + 
    ((unsigned long int)data[3]<<8) + 
    data[4];              
  Serial.print("decimal CardID: ");
  Serial.println(result);
  return result;  
}

void ledSignal(int times, int milliseconds){
  for(int i=0; i<times; i++){
    digitalWrite(led_signal, HIGH);
    delay(milliseconds);
    digitalWrite(led_signal, LOW);
    delay(milliseconds);
  }
}

void addToMessage(String message){
  setMessage(message, false);
}

void setMessage(String message){
  setMessage(message, true);
}

void setMessage(String message, bool newLine){
  String timeStamp = String(millis());
  String finalMessage = timeStamp + " - " + message;
  if(newLine){
    Serial.println(finalMessage);
  } else {
    Serial.print(message);
  }
}

Acá un ejemplo de la ejecución:

Espero que les sea de utilidad.