UNIVERSIDAD DEL CENTRO DE LA PROVINCIA DE BUENOS AIRES TRABAJO FINAL DE GRADO CARRERA INGENIERÍA DE SISTEMAS JoyMeter - Sistema de recomendación de actividades a usuarios de dispositivos móviles Autores: Hernán Javier Ramovecchi - María Sol García Director: Dr Jorge Andrés Diaz Pace ÍNDICE GENERAL ÍNDICE DE FIGURAS ÍNDICE DE TABLAS 1 INTRODUCCIÓN 1.1 ENFOQUE PROPUESTO 1.2 ORGANIZACIÓN DEL TRABAJO 2 EMOCIONES 2.1 ESTADOS DE ÁNIMO 2.2 EMOCIONES POSITIVAS 2.3 UTILIDAD DE LAS EMOCIONES POSITIVAS 2.4 BENEFICIO DE LAS EMOCIONES POSITIVAS 2.5 LO QUE DEPENDE LA VOLUNTAD 2.6 VALORACIÓN DE LAS EMOCIONES POSITIVAS 3 AGENTES DE ASISTENCIA 3.1 AGENTES DE INTERFAZ 3.2 SISTEMAS DE RECOMENDACIÓN 3.2.1 TÉCNICAS DE RECOMENDACIÓN 3.2.1.1 RECOMENDACIÓN BASADA EN CONTENIDO 3.2.1.2 RECOMENDACIÓN COLABORATIVA 3.2.1.3 RECOMENDACIÓN BASADA EN CONOCIMIENTO 3.2.1.4 SISTEMAS DE RECOMENDACIÓN DEMOGRÁFICOS 3.2.1.5 SISTEMAS DE RECOMENDACIÓN BASADOS EN UTILIDADES 3.2.2 CAPTURA DE LAS PREFERENCIAS DEL USUARIO 3.2.3 DOMINIOS DE APLICACIÓN DE LOS SISTEMAS DE RECOMENDACIÓN 4 MACHINE LEARNING 4.1 APRENDIZAJE SUPERVISADO VERSUS NO SUPERVISADO 4.2 ALGORITMOS SUPERVISADOS DE APRENDIZAJE 4.2.1 K VECINOS MÁS CERCANOS (Nearest-neighbor) 4.2.2 NAIVE BAYES 4.2.3 TABLA DE DECISIÓN 4.2.4 MÁQUINAS DE SOPORTE VECTORIAL 4.2.5 REDES NEURONALES ARTIFICIALES 4.2.6 ÁRBOLES DE DECISIÓN 4.2.5 ENSAMBLES 5 APLICACIONES MÓVILES 5.1 ANDROID 5.2 GENERALIDADES DE LAS APLICACIONES ANDROID 5.3 COMPONENTES DE LAS APLICACIONES 5.4 VENTAJA DEL USO DE ANDROID SOBRE OTROS S.O MÓVILES 6 TRABAJOS RELACIONADOS 6.1 GOOGLE NEWS 6.2 XPod 3 5 8 9 11 13 13 15 16 17 18 19 22 22 24 25 25 27 30 30 30 31 32 34 34 36 36 36 37 37 37 38 39 41 42 45 46 50 52 52 53 1 6.3 HULU CF-NADE ALGORITHM 54 6.4 PICFEEL - A WORLD OF FEELINGS 57 6.5 HAPINNESS 58 7 ENFOQUE 60 7.1 JOYMETER 60 7.1.1 ACTIVIDADES 61 7.1.2 NIVEL DE SATISFACCIÓN 62 7.1.3 SUGERENCIA DE ACTIVIDADES 62 7.1.4 AUTENTICACIÓN 62 7.1.5 ACCESIBILIDAD 62 7.1.6 USABILIDAD 63 7.1.7 ACCESO OFFLINE Y SINCRONIZACIÓN 63 7.2 DISEÑO DE ARQUITECTURA 64 7.2.1 SERVIDOR 65 7.2.2 CLIENTE 67 7.3 CÁLCULO DEL NIVEL SUBJETIVO DE LA FELICIDAD 70 7.4 RECOMENDACIÓN DE ACTIVIDADES 71 7.4.1 INFORMACIÓN CAPTADA PARA GENERAR RECOMENDACIONES 72 7.4.2 CLASIFICADORES 73 7.4.3 ESTRATEGIAS DE RECOMENDACIÓN 74 8 EVALUACIÓN EXPERIMENTAL 80 8.1 CLASIFICADORES PROVISTOS POR WEKA 80 8.2 CONSIDERACIONES 81 8.3 PERFILES DE USUARIO ANTERIORES A LA UTILIZACIÓN DE LAS TÉCNICAS DE RECOMENDACIÓN 82 8.4 INFORMACIÓN POSTERIOR AL PERÍODO DE EXPERIMENTACIÓN CON LAS TÉCNICAS DE RECOMENDACIÓN 87 8.5 COMPARACIÓN Y ANÁLISIS DE RESULTADOS 93 9 CONCLUSIONES 94 9.1 VENTAJAS 95 9.2 LIMITACIONES 96 9.3 TRABAJOS FUTUROS 96 10 APÉNDICE 98 APÉNDICE A: ESCALAS DE FELICIDAD 98 APÉNDICE B: TECNOLOGÍAS UTILIZADAS EN EL SERVIDOR 99 APÉNDICE C: TECNOLOGÍAS UTILIZADAS EN EL CLIENTE 112 APÉNDICE D: MANUAL DE USUARIO 122 11 REFERENCIAS 127 2 ÍNDICE DE FIGURAS Figura 1: JoyMeter sistemas de recomendación de actividades 8 Figura 2: Diagrama de contexto de JoyMeter con usuario utilizando la App 10 Figura 3. Efectos de las emociones positivas 17 Figura 4: Interacción usuario-agente de interfaz 23 Figura 5: Perfil de usuario basado en el contenido 25 Figura 6: Vecinos cercanos con preferencias similares 27 Figura 7: Los sistemas de recomendación llegaron para quedarse 32 Figura 8: Ejemplo de la técnica de aprendizaje no supervisado – clustering 35 Figura 9: Ejemplo de una red neuronal artificial de multicapa tipo feed-forward 38 Figura 10: Ejemplo de un árbol de decisión 38 Figura 11(a) : Probabilidad de que precisamente n de 25 clasificadores están en el error (suponiendo que cada uno tiene tasa de error de 0,45). 40 Figura 11(b): Tasa de error vs el número de clasificadores en el conjunto (empleando voto mayoritario) para tres tasas de error independientes. 40 Figura 12: Dispositivos móviles 41 Figura 13: Sistemas operativos móviles en el mundo y Argentina 2015 42 Figura 14: Logotipo del último OS Android (Nougat) 43 Figura 15: Arquitectura Android 43 Figura 16: Ciclo de vida de una actividad en Android 49 Figura 17: Landing page de GoogleNews 53 Figura 18: Pantalla de Hulu de recomendación de productos 54 Figura 19: Un ejemplo demostrativo de CF-NADE 55 Figura 20: Top 5 de películas más similares recomendadas por el algoritmo 56 Figura 21: Aplicación PicFeel 57 Figura 22: Aplicación Happiness 58 Figura 23: Recordatorio de la aplicación Happiness, para cargar una nueva entrada 58 Figura 24: Diagrama nocional de los componentes de JoyMeter y las APIs externas con la interacción del usuario 61 Figura 25: Deploy general de Joymeter e integración con APIs externas 64 Figura 26: Diagrama de componentes del servidor de JoyMeter 66 Figura 27: Flujo de alta y recepción de mensaje de un dispositivo con GCM 66 Figura 28: Arquitectura del cliente de JoyMeter 68 Figura 29: Flujo del alta de un usuario en JoyMeter y componentes involucrados 69 Figura 30: Perfil de usuario 72 Figura 31: Estrategias de recomendación 74 Figura 32: Sugerencia del tipo de Actividad en base a los atributos independientes 74 Figura 33: Distribución de probabilidad de tipos posibles de actividad 75 Figura 34: Basic Activity Recommender 75 Figura 35: Filter Activity Recommender 77 Figura 36: Feedback Filter 77 Figura 37: Usuario A, distribución por tipo de actividad 82 3 Figura 38: Usuario A, distribución por momento del día Figura 39: Usuario A, distribución por tipo de día Figura 40: Usuario A, distribución por nivel de satisfacción Figura 41: Usuario B, distribución por tipo de actividad Figura 42: Usuario B, distribución por momento del día Figura 43: Usuario B, distribución por tipo de día Figura 44: Usuario B, distribución por nivel de satisfacción Figura 45: Usuario A, aceptación total de recomendaciones Figura 46: Usuario A, técnicas de recomendación aceptadas Figura 47: Usuario A, actividades aceptadas por tipo Figura 48: Usuario A, actividades aceptadas por momento del día Figura 49: Usuario B, aceptación total de recomendaciones Figura 50: Usuario B, técnicas de recomendación aceptadas Figura 51: Usuario B, actividades aceptadas por tipo Figura 52: Usuario B, actividades aceptadas por momento del día 83 83 84 85 85 86 86 87 87 88 88 90 90 91 91 4 ÍNDICE DE TABLAS Tabla 1: Fuente que nos proporcionan emociones positivas Tabla 2: Ejemplo de dataset para aprendizaje supervisado Tabla 3: Usuario A, matriz de confusión de estrategia con filtro Tabla 4: Usuario A, matriz de confusión de estrategia de clasificación Tabla 5: Usuario B, matriz de confusión de estrategia con filtro Tabla 6: Usuario B, matriz de confusión de estrategia de clasificación 19 34 89 88 92 92 5 Dedicatorias A mi esposa, Natalia, por creer en mí y estar a mi lado siempre. A mis padres, Lidia y “Chacho” quienes siempre se preocuparon en brindarme una buena educación, con mucho esfuerzo y sacrificio. A mi hermano Damián, familia y amigos por acompañarme en este ciclo. H.J.R A Facundo, mi compañero de vida, por apoyarme incondicionalmente. A mi mamá Patricia, por su esfuerzo dándome la posibilidad de estudiar. A Hernan, mi compañero de tesis, por su empuje y dedicación. Y a mi familia y amigos, por acompañarme siempre. M.S.G 6 Agradecimientos Agradecemos a nuestro director Dr Jorge Andrés Díaz Pace, por escuchar esta propuesta de Tesis y compartir el mismo entusiasmo que nosotros en la realización de este proyecto, con predisposición y paciencia. También queremos hacer llegar nuestro agradecimiento a todos los profesionales que formaron parte de nuestro ciclo académico, sin su vocación docente no podríamos haber realizado este logro. A todos ellos, muchas gracias. 7 1 Introducción Los sistemas de recomendación estudian las preferencias y gustos de los usuarios con el objetivo sugerir ítems que factiblemente sean de su interés. Las recomendaciones forman parte de la cotidianeidad de las personas ya sea al escoger una película, un médico o un viaje a realizar. Las áreas de aplicación de la tecnología de sistemas de recomendación abarcan dominios tradicionales tales como, música, noticias y hasta otros más sofisticados. Estas recomendaciones pueden formarse empleando diferentes técnicas y enfoques, particularmente la tecnología de agentes inteligentes y específicamente los agentes de interfaz o personales pueden ser utilizados para modelar este tipo de sistemas. Estos agentes normalmente emplean internamente técnicas y algoritmos de Inteligencia Artificial. Figura 1: JoyMeter sistemas de recomendación de actividades 8 En los últimos años, psicólogos e investigadores han investigado y proporcionado evidencias concretas sobre una cuestión dejada anteriormente a los filósofos: ¿qué nos hace felices? Descubrimientos en el campo de la psicología positiva sugieren que las acciones de un individuo pueden tener un efecto significativo en su felicidad y satisfacción con la vida. En particular, el cultivo de emociones positivas mediante la realización de ciertas actividades puede ayudar a una persona a desarrollar áreas del cerebro asociadas al bienestar y la felicidad. En este contexto, se considera importante fomentar la práctica de actividades que hacen felices a una persona, sirviéndose para ello de tecnologías ubicuas como son los dispositivos móviles. El presente trabajo apunta a combinar agentes y recomendaciones para que una persona pueda realizar actividades tendientes a mejorar su estado de felicidad. Los sistemas de recomendación juegan un rol primordial, ya que asisten al usuario en la ardua tarea de filtrar items relevantes de información, en base a sus objetivos, preferencias, y necesidades que constituye el perfil de usuario. Existen diferentes técnicas de recomendación aplicadas para lograr interpretar el perfil del usuario. Entre la variedad de estos enfoques, pueden nombrarse: filtrado colaborativo, perfil demográfico, basado en el historial del usuario, entre otros. Algunos recomendadores avanzados, hacen uso de una combinación de estas técnicas, dando como resultado una solución híbrida. 1.1 Enfoque propuesto La capacidad de una aplicación móvil para realizar un seguimiento de las actividades de una persona, y adicionalmente sugerir ciertas actividades que le permitan lograr un cierto grado de felicidad sostenido en el tiempo es el punto de partida para este trabajo. 9 Figura 2: Diagrama de contexto de JoyMeter con usuario utilizando la App El objetivo principal del presente trabajo final fue el desarrollo de una herramienta denominada JoyMeter que permite el seguimiento de actividades personales junto con el nivel de satisfacción obtenido al realizar las mismas. Este sistema permite cargar actividades, actualizarlas, consultarlas y ofrecer un historial con los niveles de satisfacción del usuario a lo largo del tiempo. Se diseñó un sistema de recomendación, con el fin de sugerir actividades a partir de la retroalimentación de la interacción con el usuario, donde se analizaron distintas estrategias de recomendación. En esta línea, se evaluaron distintas reglas para contemplar la satisfacción otorgada por ciertas actividades predefinidas, y el feedback provisto por los usuarios de la aplicación. Para facilitar el acceso, JoyMeter puede ser accedida desde múltiples dispositivos, en base a una arquitectura cliente/servidor. El dispositivo móvil juega el rol de cliente, haciendo uso de servicios Web expuestos por el servidor, como son el caso de la carga, edición y eliminación de las actividades. Adicionalmente, el dispositivo móvil puede consultar el nivel e historial de felicidad alcanzados. Para las recomendaciones se consideraron aspectos de extensibilidad, y se implementaron distintos enfoques de recomendación (por ej. reglas heurísticas, Machine Learning, etc.), en base a un enfoque de diseño modular que soporta la incorporación de distintas técnicas. Como funcionalidad adicional, la herramienta está integrada con 10 Facebook para facilitar el Login del usuario con las credenciales de Facebook, así como también permite al usuario publicar en Facebook cada una de las actividades que se agreguen cuando así lo desee. 1.2 Organización del trabajo El resto del trabajo se estructura en ocho capítulos los cuales están organizados del siguiente modo: En el capítulo 2, se describen conceptos sobre estado emocional positivo y bienestar, incluyendo cómo estás emociones positivas afectan a las personas y como el cultivo de emociones positivas logran un estado emocional saludable. En el capítulo 3, se hace una introducción a los agentes de interfaz y sistemas de recomendación, mencionando las diferentes técnicas de recomendación. En el capítulo 4, se describen técnicas básicas de Machine Learning, partiendo de los tipos de aprendizajes (supervisado y no supervisado), y se abordan los algoritmos más conocidos de aprendizaje En el capítulo 5, se centra en dispositivos móviles, y nociones de aplicaciones móviles para el sistema operativo Android.. En el capítulo 6, se analizan algunos trabajos relacionados en el ámbito de los dispositivos móviles y de sistemas de recomendación existentes. En el capítulo 7, se describe la solución propuesta para JoyMeter, describiendo su arquitectura y sus componentes y tecnologías asociadas, y se ilustran sus principales funcionalidades. Adicionalmente, se presentan las funcionalidades específicas de recomendación de actividades orientadas por “niveles de felicidad”. En el capítulo 8, se reportan algunos experimentos JoyMeter, y se de uso de la aplicación analizan los resultados obtenidos con distintas estrategias de recomendación.. 11 Finalmente, en el capítulo 9, se presentan las conclusiones y se comentan posibles trabajos futuros derivados de este proyecto. 12 2 Emociones Por años las investigaciones relacionadas al bienestar y la felicidad se han centrado en el control y la disminución de los estados emocionales negativos. Sin embargo, en los últimos tiempos viene creciendo una tendencia igualmente valiosa a promover, la cuál da pie a este trabajo: el cultivo de las emociones positivas. La Psicología Positiva ha afirmado desde hace más de una década que el optimismo se puede aprender. Esto ahora está respaldado por hallazgos neurocientíficos de los últimos años, que muestran que los circuitos neuronales implicados en el bienestar tienen plasticidad, así como la habilidad de crecer y cambiar. Por tanto, es posible enseñar a nuestro cerebro a pensar con mayor positividad y a disfrutar de las emociones positivas por medio de saborear, optar por la empatía y la compasión y entrenarnos en la atención plena. Las respuestas emocionales y los estados de ánimo son resultado de las vivencias cotidianas, en el que jugamos un papel muy activo en la génesis de dichos estados emocionales, tanto los positivos como los negativos. Podemos tener cierto grado de control sobre ellos, es decir, podemos hacer cosas tanto para favorecer los estados de ánimo positivos, como para reducir o eliminar los estados emocionales negativos [57]. 2.1 Estados de Ánimo El modo en que una persona se siente no es azaroso, sino que responde a una serie de factores personales y del contexto, los cuales influyen y explican esa manera subjetiva de encontrarse. El comportamiento, incluyendo la manera de sentir, reaccionar, actuar y pensar, es producto de la interacción con el entorno, es decir una persona actúa, siente o piensa en respuesta a un ambiente con el que participa, y que por tanto, nos presenta situaciones y experiencias que no nos dejan indiferentes: una persona interpreta los hechos, se emociona y actúa ante ellos, y lo hace de un modo diferente según la persona [57]. Una emoción es un modo subjetivo de sentirse ante un hecho, situación o estímulo concreto. Tiene una duración limitada en el tiempo. Cuando estos estados emocionales se prolongan más en el tiempo (horas, días, temporadas), se habla de “Estado Anímico”. Para simplificar, se puede clasificar en “Positivos” (Cuando la experiencia subjetiva es agradable, satisfactoria, relajante, placentera) y “Negativos” (La experiencia subjetiva es de malestar, sufrimiento, tensión, desagrado) [57]. 13 Los estados de ánimo surgen como respuesta a nuestras experiencias con el entorno (las situaciones cotidianas, noticias recibidas, la actuación de las personas con las que se relacionan, las consecuencias de sus actos), y pueden estar influidos por otras variables: La hora del día, el clima, la época del año, la alimentación, el estado de salud, la calidad del sueño, el nivel de energía-cansancio. Éstas son variables que pueden ejercer algún efecto en las personas [57]. Hay pocas vivencias cotidianas que le generen a una persona una respuesta emocional neutra; las experiencias suelen provocar respuestas emocionales muy diversas, acordes con la situación (o con nuestro modo de interpretar la situación): enfado, asco, sorpresa, relajación, alegría, tensión, ilusión, impaciencia. Y esto engloba todos los matices y definiciones que cada persona pueda hacer [57]. La respuesta emocional de cada persona ante un mismo hecho es muy subjetiva, pues depende de varios componentes: la respuesta fisiológica (ej. tensión muscular, presión en el pecho), el componente cognitivo (la manera de interpretar los hechos y nuestras propias reacciones ante los hechos) y el componente motor (una determinada manera de actuar ante esos hechos). Según esto, los estados emocionales o anímicos de una persona pueden reflejarse a través de lo que dicha persona hace o dice, a través de su lenguaje verbal y no verbal, una sonrisa, una mueca tensa, un comentario pesimista, una lágrima, un discurso agresivo, un exceso de actividad motora. Todos ellos le funcionan a la persona o al resto como señales que ayudan a comprender su estado de ánimo o el del otro y a elegir el mejor comportamiento en consecuencia. Solo hay que saber detectarlos e “interpretarlos”. La Inteligencia Emocional [1] hace referencia a un conjunto de habilidades importantes a la hora de manejar adecuadamente las emociones propias o las de otros. Estas habilidades engloban: ● Detección de la emoción ● Comprensión de la misma (saber interpretarla) ● Expresión adecuada (saber comunicarla) ● Actuación para su regulación (saber cuál es la mejor manera de proceder ante dicha emoción). Todas ellas son habilidades que se pueden aprender y ejercitar tanto a nivel individual como el terreno social y ello favorecerá un comportamiento más eficaz en las relaciones interpersonales de una persona y en la regulación de sus propios estados. Esto ayuda a que una persona se conozca mejor: a conocer lo que le afecta, de qué modo le afecta y cómo se comporta cuando se siente de una determinada manera. El conocimiento 14 sobre las emociones y sus causas permite a una persona ejercer un mejor control sobre ellas[57]. El primer paso para comprender nuestras emociones es aprender a detectarlas y localizar qué las genera. Sólo aprendiendo a detectar cuando una persona se siente bien o mal se podrá conocer también cómo volver a generar esas emociones (en caso de que sean positivas) o qué hacer para prevenirlas o modificarlas (en caso de que sean negativas). Para ello, es posible realizar un “autorregistro”, que busca asociar las emociones con sus antecedentes [57]. Una vez recopilada dicha información, es posible establecer relaciones sobre los sucesos y actividades y las emociones que provocan [57]. 2.2 Emociones positivas El estudio de las emociones positivas es controvertido y complejo; al mismo tiempo, es apasionante en cuanto integra los dominios biológicos, cognitivos y sociales del desarrollo humano. Sin embargo, hoy día se le ha descuidado por el énfasis excesivo puesto en su contraparte. Las emociones positivas son parte de la naturaleza humana y se han convertido en una clave indiscutible para la consecución de las relaciones sociales. Son creadoras de experiencias positivas, capaces de promover el disfrute y la gratificación [2], de desarrollar la creatividad y de aumentar la satisfacción y el compromiso [3] [4], lo que en general se traduce en una espiral ascendente de transformaciones en la vida de las personas. Las emociones positivas son aquellas en las que predomina la valencia del placer o bienestar [5]; tienen una duración temporal y movilizan escasos recursos para su afrontamiento; además, permiten cultivar las fortalezas y virtudes personales, aspectos necesarios y que conducen a la felicidad. Asimismo, son estados subjetivos que la persona experimenta en razón de sus circunstancias, por lo que son personales e involucran sentimientos. Son descritas como reacciones breves que típicamente se experimentan cuando sucede algo que es significativo para la persona. Las emociones positivas tienen un objetivo fundamental en la evolución, en cuanto que amplían los recursos intelectuales, físicos y sociales de los individuos, los hacen más perdurables y acrecentar las reservas a las que se puede recurrir cuando se presentan amenazas u oportunidades; asimismo, incrementan los patrones para actuar en ciertas situaciones mediante la optimización de los propios recursos personales en el nivel físico, psicológico y social [4]. 15 Una herramienta afín de las emociones positivas es el abanico de expresiones faciales que las acompañan, aunque es importante resaltar que la gesticulación para la expresión de las emociones negativas es más amplia y clara que para las positivas; en efecto, resulta más fácil reconocer emociones y sentimientos relacionados con la tristeza, la melancolía o el miedo, que los de alegría, satisfacción o placer. En este sentido, algunas de las emociones positivas más comunes son la felicidad, el amor y el humor. El proceso emocional se desencadena por la percepción de condiciones internas y externas que dan lugar a la evaluación valorativa, para posteriormente producir la experiencia por medio de la expresión corporal o un lenguaje no verbal, convirtiéndolas así en un fenómeno observable. Así, es posible reconocer si existe una sensación agradable y se precisa de una emoción positiva, a la que además se le otorga el valor de algo bueno. Se proponen cuatro tipos de emociones positivas [3]: la alegría, el interés, el amor y la satisfacción. Mientras que otros autores incluyen al optimismo como una emoción positiva básica [2], o conforman una tercera línea teórica y proponen un abordaje más sistemático y empírico que incluya aspectos cognitivos y biológicos [6], sugiriendo la existencia de dos tipos de emociones positivas distintos: alegría y amor. Por último, hay quienes emplean el término de “fluidez” [7] como aquel estado emocional positivo en el que la persona se halla totalmente concentrada y abstraída por la tarea, la que le produce placer y gracias a la cual pierde la noción del tiempo. [58] 2.3 Utilidad de las emociones positivas Experimentar emociones positivas es una actividad específica de la naturaleza humana debido a que contribuye en la calidad de vida de las personas [3]. Lo anterior lleva a distinguir una doble importancia de las emociones positivas: por un lado, como detonante para el bienestar; por el otro, como un medio para conseguir un crecimiento psicológico personal y duradero. Las emociones positivas optimizan la salud, el bienestar subjetivo y la resiliencia psicológica, favoreciendo un razonamiento eficiente, flexible y creativo. Un razonamiento de este tipo es clave para el desarrollo de un aprendizaje significativo. Así es como las emociones positivas ayudan a otorgar sentido y significado positivo a las circunstancias cambiantes y adversas [8]. Una teoría que sustenta lo anterior es la llamada “teoría de ampliación y construcción de las emociones positivas”, la cual sostiene que emociones como la alegría, el entusiasmo, la satisfacción y demás comparten la finalidad de ampliar los pensamientos y 16 acciones de las personas [3] [4], además de que el cultivo de aquellas puede servir para la consecución de las metas de vida que las personas se plantean, así como para la búsqueda del bienestar. Lo anterior ha sido sometido a experimentaciones que demuestran cómo las emociones positivas producen patrones de pensamiento novedosos, flexibles, inclusivos y creativos; de igual modo, amplían el repertorio de pensamientos y acciones de la persona que resultan de la primera –y central– premisa de esta teoría. Adicionalmente, la teoría de ampliación y construcción propone que experimentar emociones positivas permite construir y reforzar los recursos con los que cuenta la persona (Figura 2.3.a), ya sea de forma física, intelectual y social, creando así una espiral ascendente que transforma a la persona. Incluso hay evidencia empírica que sugiere que dicha espiral ascendente predice con gran efectividad el sentido de bienestar de las personas [8]. [58] Figura 3. Efectos de las emociones positivas 2.4 Beneficio de las emociones positivas Una de las principales ventajas del cultivo de las emociones positivas radica en que ejercen una gran influencia sobre el procesamiento intelectual, la resolución de problemas, el razonamiento y las habilidades sociales [9]. Las investigaciones realizadas por varios autores han demostrado que el experimentar emociones positivas está relacionado con la existencia de una organización cognitiva más abierta, flexible y compleja [10] [11] [12] [13] [14]. En esta misma línea, otras investigaciones hallaron que los estados afectivos positivos facilitan la solución creativa de diversos problemas [15]. Además, ayudan a fortalecer ante la adversidad en cuanto que promueven la resiliencia [15] y protegen contra 17 la depresión, pues se transforman en un ingrediente activo esencial que incrementa los recursos psicológicos de afrontamiento de la persona [16]. Por otro lado, distintas intervenciones psicológicas han puesto de relieve la importancia que tienen las emociones positivas frente a algunas emociones negativas (miedo, enojo y tristeza); así, la teoría de ampliación y construcción explica que estados emocionales como la alegría o el interés combaten los efectos de las emociones negativas que impiden el crecimiento psicológico o el mejoramiento de la salud física o mental [17] [18]. Lo anterior también significa que mientras que las emociones negativas limitan el repertorio de pensamiento-acción de una persona, las positivas lo amplían. Además, estas mismas se vuelven herramientas terapéuticas sumamente valiosas, entre las que podemos contar las técnicas de relajación, las terapias del comportamiento y las cognitivas [19]. Los estados emocionales positivos permiten a los individuos considerar y elaborar un plan acerca de sus resultados futuros [20], mientras que los negativos hacen posible responder a los eventos inmediatos [21]. Las personas que experimentan emociones positivas en un momento determinado muestran una ventaja cognitiva en relación a la experimentación de estados emocionales negativos en cuanto que logran plantearse nuevas metas que anteriormente no habían podido considerar [15]. Como consecuencia de que las emociones positivas son algo más que la mera ausencia de emociones negativas [15], es importante enfatizar que las primeras son útiles en el campo de la salud en tanto que previenen enfermedades y reducen la ansiedad. Las emociones positivas hacen desaparecer los efectos fisiológicos que anteriormente habían sido generados por las emociones negativas [16]. Las personas que se consideran felices asimilan mejor los riesgos a la salud, y por tanto, experimentan un menor desgaste del sistema cardiovascular [17] y, en consecuencia, gozan de una mejor salud. Adicionalmente, el desarrollo de emociones positivas está relacionado con la disminución del estrés que es posible registrar en el sistema nervioso vegetativo y en el cardiocirculatorio. Por último y a este respecto, se ha evidenciado que quien experimenta alegría a lo largo del día, con mayor probabilidad la tendrá el día siguiente. [58] 2.5 Lo que depende de la voluntad Las cosas que una persona hace o deja de hacer tienen consecuencias emocionales. Un persona tenderá a buscar aquellas actividades o lugares donde disfrutó de emociones positivas y en las que se sintió bien, pero no siempre se actúa así. Esto suele 18 suceder porque la persona se ha habituado o no es conscientes de lo que quiere, o porque a veces se pierde todo un día (e incluso toda la vida) pensando en lo que puede que le suceda mañana, o pierde el día rumiando las cosas que le pasaron ayer. En cualquier caso, al hacerlo ha perdido las oportunidades de disfrutar hoy. En primer lugar la persona debe saber que las emociones positivas pueden provenir de diferentes fuentes, tales como la posesión (por ejemplo, poseer un smartphone que nos permita estar en contacto con nuestros seres queridos), o el significado que le brinda la posesión (por ejemplo, tener el último modelo de smartphone y presumir de ello). Otra fuente, más interesante que la anterior, es la realización de actividades, tanto por el hecho de realizarlas como por la capacidad que ha adquirido para realizar la actividad de determinada manera (por ejemplo, practicar rafting en los rápidos de un río). Una fuente más de emociones positivas es el “yo” (por ejemplo, la satisfacción y el orgullo de realizar una actividad). Y, por último, la fuente más importante de emociones positivas, es el estímulo de las demás personas. El siguiente cuadro detalla un resumen de los diferentes focos emocionales que son fuente de emociones positivas. [59] Foco Fuente Cosas y su significado Emociones positivas experimentadas en respuesta a un objeto o a los significados a los que lo asociamos. Actividades Emociones positivas experimentadas en respuesta a una actividad y a las habilidades para su realización. Yo Emociones positivas experimentadas en respuesta a cambios en nosotros mismos. Otras personas Emociones positivas evocadas por los efectos de las actividades de otras personas. Tabla 1: Fuente que nos proporcionan emociones positivas [59] 2.6 Valoración de las emociones positivas La valoración de felicidad y satisfacción ha tomado relevancia en distintos ámbitos cotidianos. Un ejemplo de la importancia de esta información son las encuestas de satisfacción, ya sean a un cliente para brindar un mejor servicio o mejorar un producto, satisfacción de un paciente, satisfacción laboral, como también la satisfacción personal. Se ha vuelto relevante, al punto, que se generó un indicador que mide la calidad de vida en términos más holísticos y psicológicos (FNB: felicidad nacional bruta creada por 19 Jigme Singye Wangchuck en 1972). Sin embargo, incluso este indicador, se enfrenta a una gran dificultad, medir algo tan subjetivo como la felicidad y el bienestar. La felicidad es un tema complejo, en efecto, pero en las últimas décadas se han desarrollado teorías serias y métodos de medida fiables que permiten esgrimir las críticas. Investigar acerca de la felicidad posee la dificultad que, a diferencia de otros temas, por ejemplo, la física cuántica o la teoría de la relatividad; cada individuo tiene sus propios argumentos; la felicidad es una opción individual que tiene que ver con los valores que cada persona reconoce o acepta. Indudablemente, esto dificulta la divulgación de conocimientos, ya que hay que batallar con los prejuicios y teorías del oyente. Pero visto desde otra perspectiva, el hecho de que cada una de las personas crea saber que es la felicidad, indica que es un tema importante y en el que cierta forma cada uno de nosotros, nos consideramos expertos. La felicidad como concepto ha sido abordado desde muchas perspectivas, tales como la filosófica y la artística. La perspectiva científica se caracteriza por ofrecer una definición operacional de la felicidad que, aunque no comprende toda la complejidad que otras perspectivas consideran sobre este concepto, sí permite su medición. En palabras simples, la felicidad es definida como el grado con que una persona aprecia la totalidad de su vida presente de forma positiva y experimenta afectos de tipo placentero. Esta definición tiene implicancias importantes para la medición de la felicidad. Si se reconoce que se trata de un fenómeno interior a cada persona, entonces parece más adecuado medirla con auto-reportes que con evaluaciones de expertos o pares. Y si la felicidad tiene grados, entonces las mediciones deberían reconocer distintos niveles y no clasificar a las personas simplemente como felices o infelices. La medición de la felicidad también debería anclarse en el presente, remitir a la vida en general e incorporar tanto pensamientos como sentimientos. Entre los distintos métodos que se han desarrollado y evaluado, lo más frecuente es recurrir a preguntas sencillas y generales para evaluar la felicidad global y la satisfacción con la vida presente. También es frecuente la utilización de preguntas sobre afectos positivos y negativos, los cuales pueden ser analizados por separado o resumidos en una escala de balance afectivo. Además del conjunto de preguntas mínimas para medir la felicidad existen otras mediciones internacionalmente aceptadas que podrían implementarse de forma complementaria. Entre estas mediciones se incluye la escalera de felicidad de Gallup, 20 índices específicos creados por investigadores reconocidos en el área, preguntas por satisfacción en áreas específicas de la vida y preguntas por satisfacción instantánea. Ésta última puede ser medida con técnicas de muestreo experiencial o de reconstrucción del día. En el primer caso se utiliza el apoyo de tecnología para obtener informes frecuentes e inmediatos de las personas en su entorno cotidiano, mientras que en el segundo se llena una agenda correspondiente a los eventos del día anterior, en donde las personas reportan su experiencia en períodos específicos del día. Hay varias escalas de felicidad como se describen en el Apéndice A. 2.7 Resumen En este capítulo se presentó el estado de ánimo como una consecuencia directa de las emociones que viven las personas, puntualmente como las emociones positivas afectan a las personas y la valoración de las mismas para un estado emocional saludable. 21 3 Agentes de asistencia Los sistemas de recomendación estudian las preferencias y gustos de los usuarios con el objetivo de recomendarles ítems a comprar o examinar que factiblemente sean de su interés. Estos sistemas se han convertido en un componente esencial, por ejemplo, en los sistemas de comercio electrónico debido a que personalizan las ofertas maximizando de este modo la probabilidad de venta. Estas recomendaciones pueden formarse empleando diferentes técnicas y enfoques, particularmente la tecnología de agentes inteligentes específicamente los agentes de interfaz o personales puede ser utilizada para modelar este tipo de sistemas. 3.1 Agentes de Interfaz Debido a que no existe en la comunidad de Inteligencia Artificial una definición formal del concepto “Agente”, una manera conceptual de definirla es como un sistema de software (o hardware) que tiene las siguientes propiedades [22]: • Autonomía: operan sin la intervención directa de humanos u otros agentes, teniendo control sobre sus acciones y estado interno. • Sociabilidad: Interactúan con humanos y posiblemente con otros agentes, mediante algún protocolo de comunicación. • Reactividad: Responden ante eventos, tomando sus propias decisiones, incluso modificando su manera de operar, siempre teniendo en cuenta su razón de ser (objetivo). Estos eventos están ligados al ambiente donde operan, el cual puede ser el mundo físico, un usuario a través de una interfaz gráfica, otros agentes, Internet, o quizá una combinación de estos. • Pro-actividad: No actúan únicamente en respuesta a su ambiente, son capaces también tomar la iniciativa. Dentro del espectro de los agentes, se denominan “agentes de interfaz” o “agentes personales” a aquellos que proveen asistencia activa al usuario en sus tareas computacionales [23]. Los agentes de interfaz fueron concebidos para asistir de manera personalizada a los usuarios en las tareas realizadas sobre una aplicación. Son capaces de aprender los intereses, preferencias, prioridades, objetivos y necesidades de los usuarios, a fin de 22 brindarle asistencia proactiva y reactiva en el entorno de una aplicación computacional, incrementando de este modo la productividad de la misma. Así como una persona que brinda asistencia a otra, aprende a ser más competente en su trabajo, un agente de interfaz a medida que interactúa con el usuario, aprende de él y puede volverse cada vez más competente. El agente capta información de las preferencias del usuario a través de diversas fuentes: • Observación: Continuamente observando la interacción del usuario con la aplicación. El agente puede monitorear las actividades del usuario, mantener registro de las acciones realizadas durante un periodo de tiempo, encontrar regularidades, patrones recurrentes, y ofrecer asistencia de acuerdo a lo observado. • Feedback: El feedback del usuario puede ser implícito o explícito. El feedback implícito ocurre por ejemplo cuando el usuario ignora una sugerencia del agente y toma otro curso de acción. A su vez, el usuario puede proporcionar también su feedback explícitamente (ya sea negativo o positivo) evaluando la asistencia dada por el agente. • Instrucciones: Una tercera fuente de aprendizaje son las instrucciones dadas explícitamente por el usuario, este puede entrenar al agente dándole ejemplos hipotéticos de situaciones y diciéndole que es lo que debe realizar en tal caso. • Fuentes Externas: Finalmente, puede también adquirir conocimiento de las tareas o sugerencias realizadas por otros agentes que asistan a otros usuarios dentro del mismo marco de trabajo. Figura 4: Interacción usuario-agente de interfaz (adaptado de [23]) 23 Particularmente, un agente personal puede ser desarrollado para proveer recomendaciones, resumir y filtrar información, o incluso contemplar personas con gustos similares (agentes sociales). Los sistemas de recomendación son una clase específica de agentes sociales [45]. La manera de proceder de un sistema de recomendación es comparable a la de un agente de información debido a que el objetivo de ambos es descubrir información que sea interesante al usuario. En los sistemas de recomendación, la asistencia a los usuarios se basa fundamentalmente en la información capturada a través de la observación del comportamiento de los usuarios en la aplicación. De esta manera, el agente aprende las preferencias, intereses y hábitos de los usuarios, que son registrados en su perfil. Los agentes de interfaz han sido aplicados en diversidad de dominios incluyendo aplicaciones industriales, aplicaciones comerciales, comercio electrónico, y monitoreo. En síntesis, los agentes de interfaz permiten personalizar una aplicación para un usuario en particular, con el objetivo de facilitar las tareas del usuario sobre la aplicación. En nuestro caso de estudio, un sistema de recomendación de actividades para el usuario con el fin de mejorar su estado anímico, el agente debe ser capaz de estudiar las actividades que al usuario le agradan hacer, con su comportamiento histórico y el feedback provisto (recomendaciones aceptadas o rechazadas), con el fin de sugerir actividades a realizar para que sea más feliz. 3.2 Sistemas de Recomendación El término “sistema de recomendación” caracteriza a cualquier sistema que produce como salida recomendaciones individualizadas o a aquellos que guían al usuario de una manera personalizada a través de una aplicación o un sistema. Un sistema de recomendación mantiene una representación de los gustos y preferencias de los usuarios con el propósito de sugerir ítems que sean de su interés. Existen dos entidades básicas en cualquier sistema de recomendaciones, el usuario (a veces mencionado como cliente) y el ítem (mencionado también como producto u objeto). Un sistema de recomendación tiene dos objetivos principales: i) sugerir ítems en los que el usuario se espera que esté interesado, y ii) predecir la utilidad de un ítem específico para un usuario en particular. Los sistemas de recomendación difieren de otros sistemas de manejo de información en el hecho de que las recomendaciones se ajustan a las necesidades individuales de cada usuario. En un sistema de recomendación, las recomendaciones son 24 obtenidas personalizadamente en base al estudio de la interacción entre el usuario y la aplicación. Para lograr su propósito, los sistemas de recomendación mantienen conocimiento de las preferencias de los usuarios en lo que se denomina perfil de usuario. El éxito de un sistema recomendador se centra en el grado de concordancia que pueda obtener entre la representación de las preferencias del usuario y las verdaderas preferencias del usuario [24]. 3.2.1 Técnicas de Recomendación Si bien dentro de las técnicas propuestas para realizar sistemas de recomendación se destacan el filtrado colaborativo y las recomendaciones basadas en contenido, existen otros enfoques para el desarrollo de estos sistemas, tales como: las recomendaciones basadas en conocimiento, basadas en funciones de utilidad o en datos demográficos. En esta sección se detallan los aspectos principales de estas técnicas, junto a los enfoques híbridos que han surgido. 3.2.1.1 Recomendación Basada en Contenido Las recomendaciones basadas en contenido [25] [26], son una consecuencia y continuación de las investigaciones de filtrado de información realizadas por [27]. En estos sistemas los ítems interesantes son definidos mediante sus características asociadas. Un sistema basado en contenido aprende los intereses del usuario basándose en las características de los ítems que el usuario ha adquirido o se ha interesado en el pasado, con el objetivo de recomendar ítems similares que puedan resultar interesantes en el futuro. Por ejemplo, si se realiza una actividad con características similares (deporte: salir a correr, deporte andar en bicicleta, en cierto sentido se las podrían considerar similares, hay una clara tendencia del usuario a hacer deportes). Figura 5: Perfil de usuario basado en el contenido 25 Dado que esta técnica trabaja sugiriendo al usuario ítems que sean similares a los previamente contemplados en el pasado, el perfil debe ser capaz de mantener representaciones de tales ítems. Por ende, la representación del perfil se encuentra ligada a las características particulares de los ítems de cada dominio. Ventajas respecto a otros enfoques: • No agrega esfuerzo extra al usuario, es decir, el usuario no tiene que proveer opiniones acerca de los ítems. Simplemente se estudian las preferencias y se sacan conjeturas respecto a la similitud de un ítem con tales preferencias (teniendo en cuenta la descripción y características de los ítems). • Debido a que la información se encuentra en el ítem, no es necesario contar con la opinión o ratings de otros usuarios para efectuar recomendaciones. Sin embargo esta técnica presenta algunas desventajas: • Limitación respecto a la estructura del ítem: Este tipo de enfoque tiene el problema de encontrarse limitado por las características que están explícitamente asociadas con los ítems a recomendar. Esto hace que las recomendaciones queden a merced de la información descriptiva disponible. • Análisis de contenido limitado: Si existe más de un ítem con las mismas características, estos no pueden ser diferenciados con respecto a su calidad. Por ejemplo, en el caso de dos actividades con características similares, no puede evaluarse cuál de las dos actividades gustará más. • Tendencia a recomendar ítems similares (portfolio effect): Tiende a realizar sugerencias de ítems muy similares a los que el usuario ha adquirido previamente. Igualmente en este punto deben contemplarse las excepciones relativas al dominio de aplicación del recomendador, en nuestro dominio, puede pretenderse recomendar actividades similares a los que el usuario ha realizado anteriormente. • Problema de usuario nuevo: Al incorporarse un nuevo usuario al sistema, este deberá adquirir (o contemplar) un número suficiente de ítems antes de que el sistema tenga suficientes evidencias como para poder inferir las preferencias y realizar recomendaciones confiables. Varios proyectos de investigación han utilizado únicamente filtrado basado en contenido para realizar las recomendaciones. Entre ellos se encuentran: Woodruff [28] el cual es un sistema de recomendación de material de lectura digital; Krakatoa [29], un 26 periódico personalizado, donde el perfil de usuario es creado en base a un conjunto de palabras clave y ratings capturados tanto explícitamente como implícitamente. Para identificar el tema del artículo se hace un análisis de frecuencia para extraer las palabras clave. Si a un usuario le gusta un documento, los pesos de las palabras extraídas se añaden a los pesos de las palabras correspondientes en el perfil del usuario. Este proceso es conocido como retroalimentación de relevancia [30]. 3.2.1.2 Recomendación Colaborativa Estos sistemas se basan en las opiniones de otros usuarios y sugieren o predicen la utilidad de un cierto ítem para un usuario activo en base a esas opiniones [31]. Para cada usuario se crea un conjunto de "vecinos cercanos", usuarios cuyas evaluaciones anteriores tienen grandes semejanzas a las del usuario en cuestión. Los resultados para los elementos no calificados se predicen en base a la combinación de puntos (scores) conocidos de los vecinos cercanos. Figura 6: Vecinos cercanos con preferencias similares Un perfil de usuario típico en un sistema colaborativo consiste en un vector de ítems y sus ratings, el que será continuamente actualizado a medida que el usuario interactúa con el sistema. Los ratings de los usuarios pueden obtenerse tanto explícitamente como también puede darse el caso en el que la valoración de un ítem sea extraída implícitamente, es decir se extrae indirectamente infiriendo a través del comportamiento del usuario. Varias técnicas han sido propuestas para la creación de estos perfiles, incluyendo redes Bayesianas [43], y técnicas de clustering, las cuales identifican grupos de usuarios con preferencias similares. Al igual que en el caso de recomendaciones basadas en contenido, esta técnica crea un modelo a largo plazo, los perfiles de usuario son modelos que deben ser 27 actualizados a medida que aumentan las evidencias acerca de las preferencias del usuario a través de sus ratings. Varios son los factores que hacen que el filtrado colaborativo sea una buena técnica utilizada en los sistemas de recomendación: • Es completamente independiente de la representación de los ítems a recomendar y logra buen desempeño en dominios de ítems complejos tales como música, películas o gráficos, donde la variación de gustos es responsable de la variación de las preferencias ([32] denominan a esto como “correlación persona-persona”). • No necesita conocimiento del dominio para realizar recomendaciones. Los sistemas colaborativos confían sólo en los ratings de los usuarios y estos son usados para recomendar ítems sin ningún tipo de dato descriptivo. • El gran poder del enfoque colaborativo con respecto a los enfoques basados en contenido es su capacidad de brindar a los usuarios recomendaciones inesperadas (recomendaciones que no se darían si se estudiara solo los datos históricos del usuario). Puede darse el caso que exista un usuarios que le de placer hacer actividades al aire libre (picnic, ir a pescar) y que también disfrute de hacer deportes, pero en un sistema recomendador basado en contenido entrenado sobre las preferencias de un usuario que ha ido a pescar y hacer picnic, no será capaz de sugerir actividades para que realice deporte, ya que no tienen nada en común estos tipos distintos de actividades. Solo mirando más allá de las preferencias individuales aprendidas podrán realizarse otras sugerencias que puedan ser del interés del usuario. Sin embargo, esta técnica presenta algunas desventajas: • Problema de arranque (ramp-up problem) [33], [34]: Este término en realidad se refiere a dos problemas distintos, pero relacionados. a) Problema de un nuevo usuario: Debido a que las recomendaciones son formadas en base a la comparación de ratings entre un usuario objetivo y el resto de los usuarios, a los enfoques basados únicamente en acumulación de ratings se les dificulta categorizar a un usuario nuevo o a un usuario con poca cantidad de ratings.. b) Problema de un nuevo ítem: Cuando un nuevo ítem es agregado a la base de datos no existe manera que sea recomendado a un usuario hasta que no se tenga más información a través de otro usuario. Si un ítem no ha sido contemplado entonces no puede ser recomendado, esto se debe a que no existen evaluaciones de los usuarios sobre el ítem. Este problema se da particularmente en dominios de artículos periodísticos o noticias donde existe un flujo continuo de entrada de nuevos ítems y cada usuario califica solamente 28 algunos. Esto hace necesario a los sistemas recomendadores idear algún incentivo que estimule a los usuarios a proveer sus ratings. Para intentar solventar este problema, los sistemas de filtrado colaborativo utilizan alguna estrategia de recomendación inicial, ya sea recomendación basada en contenido, o estereotipos. Esto conlleva al desarrollo de enfoques de recomendación híbridos. • Problema de ratings dispersos (sparsity problem) [36]: Los sistemas recomendadores colaborativos están sujetos a la superposición de ratings entre los usuarios (las recomendaciones a un usuario dependen de los ratings de los demás usuarios) lo cual dificulta el desempeño de la técnica cuando el espacio de ratings es escaso. Si el conjunto de ítems cambia muy rápidamente, entonces los ratings viejos serán de poco valor a los usuarios nuevos. Si el conjunto de ítems es grande y los intereses del usuario apenas varían, entonces la probabilidad de coincidir con otros usuarios será menor. • Escalabilidad (Scalability) [35]: Un problema importante en sistemas de filtrado colaborativo se presenta cuando crece el número de ítems o de usuarios en el sistema, lo cual conlleva a incrementos en los cálculos para determinar el conjunto de usuarios similares. • Usuarios con gustos inusuales (the gray sheep problem) [34] [37]: Los sistemas de filtrado colaborativo logran su mejor desempeño cuando el usuario pertenece a un grupo con muchos vecinos de similares preferencias. De darse el caso, que un usuario tenga gustos inusuales se tendrá dificultad para encontrar otros usuarios con gustos similares y de este modo las recomendaciones pueden volverse pobres. • Tendencia a recomendar ítems similares (The portfolio effect) [38]: Existen dominios donde es deseable no recomendar un ítem que el usuario ya haya contemplado, como por ejemplo noticias que el usuario haya leído. • Otro problema que afecta al filtrado colaborativo es que si un usuario no utiliza regularmente el sistema y los gustos de este han variado, el sistema tenderá a seguir recomendando ítems en base a las preferencias del pasado. Algunos de los sistemas más importantes utilizan esta técnica, GroupLens [39] es un recomendador de noticias en el que los usuarios califican las noticias en una escala de 1 a 5, posteriormente se generan grupos de usuarios evaluando su similitud. Este es considerado como el primer sistema que ha empleado exitosamente filtrado colaborativo. Ringo [40] es un sistema en el que los usuarios brindan explícitamente sus ratings para obtener recomendaciones de CDs de audio. Este sistema compara los perfiles (ratings) para encontrar usuarios con gustos musicales similares. 29 Otros ejemplos de recomendadores colaborativos son el sistema de recomendación de libros Amazon.com y recomendador de películas MovieLens del grupo Grouplens. 3.2.1.3 Recomendación Basadas en Conocimiento Las recomendaciones basadas en conocimiento intentan sugerir ítems mediante la inferencia de las necesidades y preferencias del usuario. En algún sentido todas las técnicas pueden ser descritas como que realizan algún tipo de inferencia. Pero este enfoque se distingue en el hecho de que tiene conocimiento funcional aparte del conocimiento sobre los objetos a recomendar [34]. El conocimiento funcional es conocimiento acerca de cómo un ítem particular se ajusta a las necesidades del usuario, por consiguiente se puede razonar sobre la relación entre una necesidad y una posible recomendación. El sistema debe ser capaz de poder realizar el mapeo entre las necesidades del usuario y los ítems a recomendar. Estos sistemas tienen la ventaja de no requerir de ratings para realizar las recomendaciones. No obstante, tiene el problema de necesitar significativo esfuerzo para construir y mantener los modelos. El perfil de usuario puede ser cualquier clase de estructura de conocimiento que soporte inferencias del tipo que se necesiten. El conocimiento usado por un recomendador basado en conocimiento puede tomar muchas formas. Sistemas como Entree [41] utilizan conocimiento del arte culinario para inferir similitud entre restaurantes en base a las preferencias introducidas en la consulta del usuario. 3.2.1.4 Sistemas de Recomendación Demográficos Los sistemas de recomendación demográficos realizan recomendaciones en base a la categorización de los usuarios a través de sus atributos personales tales como edad, ocupación y estado civil [44]. La principal ventaja de este enfoque es que no crea un modelo de usuario a largo plazo como lo hacen las técnicas colaborativas o basadas en contenido. La información sobre las preferencias del usuario es inferida de acuerdo a la clase demográfica a la que pertenezca el cliente. Esta particularidad hace que esta técnica no cuente con el problema de un “nuevo usuario”. 30 3.2.1.5 Sistemas de Recomendación Basados en Utilidades Al igual que los sistemas de recomendación demográficos, los sistemas recomendadores basados en utilidades no son sistemas de aprendizaje a largo plazo en los que se trate de construir generalizaciones acerca de sus usuarios. Este tipo de sistemas basan sus sugerencias en función de la evaluación de la concordancia entre las necesidades del usuario y las opciones disponibles. Este tipo de enfoque realiza las sugerencias mediante el cómputo de la utilidad de un ítem con respecto al usuario. Claro está que el problema es cómo crear tal función de utilidad para el usuario [41]. Una ventaja es que pueden contemplarse dentro de la función de utilidad atributos no relacionados con el producto, tales como confiabilidad del proveedor y disponibilidad del producto, haciendo posible de este modo por ejemplo realizar cambios de precio de acuerdo a si el cliente necesita la entrega inmediatamente. Si bien los sistemas basados en utilidades son flexibles, por otra parte tienen fallas. El usuario debe construir o completar una función de preferencias, y por consiguiente debe pesar la relevancia de cada una de las posibles características. A menudo esto crea una interacción que es abrumadora para el usuario. Además, los cambios importantes en el espacio de productos en el que se maneja el cliente, implican un completo reajuste de la función de utilidad. 3.2.2 Captura de las Preferencias del Usuario Las preferencias o intereses de los usuarios son mapeadas en lo que se denomina perfil de usuario. Estos perfiles forman la base con la cual se generan las recomendaciones personalizadas de cualquier sistema de recomendación. Los algoritmos de aprendizaje del perfil deben lidiar con la tarea de reflejar los continuos cambios que puedan suscitarse en las preferencias de los clientes. Estos algoritmos pueden extraer conocimiento sobre las preferencias del usuario explícitamente, implícitamente o mediante una combinación de ambos enfoques [42]. Técnicas explícitas de construcción de perfiles requieren que el usuario sea quien especifique cuales son sus preferencias y gustos, para lo cual se utilizan técnicas como llenado de formularios o encuestas, autocategorización del usuario en alguna taxonomía predefinida o calificación de los ítems (frecuentemente encontrado en enfoques colaborativos). 31 Por otra parte, en las técnicas implícitas no se requiere cooperación por parte del usuario para obtener un esquema de sus preferencias. Este enfoque utiliza técnicas de machine learning, data mining, KDD (knowledge discovery in databases) o de recuperación de información para construir un modelo de las preferencias del usuario. Las técnicas explícitas proveen una mayor certeza sobre las preferencias del usuario a costa de una engorrosa actualización del perfil por parte del usuario, lo cual puede resultar tedioso y en el caso extremo puede llegar a suprimir su interacción con la aplicación. Contrariamente, las técnicas implícitas cuentan con la ventaja de liberar al usuario de la tediosa tarea de mantener actualizado su perfil a costa de un menor desempeño en las inferencias sobre sus gustos. 3.2.3 Dominios de Aplicación de los Sistemas de Recomendación Los sistemas de recomendación han llegado para quedarse. Han sido y están siendo utilizados en cada vez más campos de aplicación. Abarcando desde los más tradicionales (películas, libros, música) hasta otros más sofisticados (destinos turísticos, comercio electrónico, recorridos en bicicleta como Cyclopath, etc). Figura 7: Los sistemas de recomendación llegaron para quedarse La mayor parte de los sistemas de recomendación se encuentran implantados en sistemas de venta, donde el objetivo es tentar al usuario a comprar, es decir se utiliza como estrategia de marketing. De este modo se pueden desarrollar productos que se adapten a las características particulares de los clientes. También existen otros sistemas que no son de venta directa. Pero sí que poseen una masa crítica de gente, y obtienen generan ingresos monetarios haciendo publicidad en 32 la página. Tal es el caso de YouTube. Youtube no cobra suscripción, y el usuario percibe que el servicio es gratuito. Lo que en realidad hay de fondo es un sistema publicitario, donde cada determinada cantidad de tiempo y dependiendo de los videos que se desean ver. Se pasa un corto publicitario, orientado al perfil del usuario que está utilizando la aplicación. Donde se lo obliga a ver determinados segundos, para luego poder cancelar el video si así lo deseara el usuario. Otro caso muy conocido es la plataforma de videos on-line de Netflix. Netflix no solo que gasta millones de dólares en mejorar su algoritmo de recomendación de películas, sino que lo expresa libremente hacia la comunidad web. Demostrando el alto interés que tiene poder realizar una recomendación acertada al usuario, que está buscando en un mar de opciones algo para mirar. Según Netflix en relación a la naturaleza de sus usuarios, desarrolló una medida de tiempo de 2 minutos y medio, donde sabe que si el usuario no encuentra algo interesante para ver en ese lapso, sale de la plataforma. De más está decir que si eso es recurrente el usuario terminará cancelando la suscripción a la plataforma, impactando negativamente en la recaudación de Netflix. Netflix informó a principio del 2016 que está haciendo estudios constantes para mejorar las técnicas de recomendación. Puntualmente se espera en la próxima release del recomendador hacer uso de técnicas híbridas de recomendación, donde se tomará en cuenta los contenidos disponibles, el historial del usuario, la tendencia social, el horario de conexión a la plataforma, así como también del dispositivo que se está accediendo (tablet, smartphone, tv, pc). 3.4 Resumen En este capítulo se presentaron a los sistemas de recomendación como una clase de agentes personales, que realizan recomendaciones en base a las preferencias del usuario. Por otro lado, también se expusieron las diferentes técnicas de recomendación existentes más utilizadas, evidenciando sus fortalezas y debilidades. 33 4 Machine Learning Machine Learning es un tipo de inteligencia artificial (IA) que proporciona a las computadoras la habilidad de aprender sin ser programadas de forma explícita. Machine Learning se centra en el desarrollo de programas informáticos que pueden enseñar a sí mismos para crecer y cambiar cuando son expuestos a nuevos datos. 4.1 Aprendizaje supervisado versus no supervisado Machine learning es una rama de Inteligencia Artificial que usa algoritmos, por ejemplo, para encontrar patrones en los datos y predecir eventos futuros. En Machine Learning un dataset de observaciones llamado instancias es compuesto por un número de variables llamados atributos. El aprendizaje supervisado es el modelado de estos datasets que contienen instancias etiquetadas. En el aprendizaje supervisado, cada instancia puede ser representada como (x, y), donde ‘x’ es un conjunto de atributos independientes (pueden ser discretos o continuos) e ‘y’ es el atributo objetivo. El atributo objetivo ‘y’ puede ser continuo o discreto tambien; sin embargo la categoría de modelado es de regresión si contiene un objetivo continuo, y de clasificación si el objetivo es discreto (que también se llama etiqueta de clase). La tabla 2 muestra un dataset para aprendizaje supervisado con siete atributos independientes x1,x2, …, x7, y un atributo objetivo dependiente ‘y’. Más específicamente, x1, x2 ∈ {b, n} y x3, . . . , x7 ∈ R y el atributo objetivo ‘y’ ∈ {up,unchanged,down}. El atributo tiempo es usado para identificar una instancia y no es usado en el modelo. Los datasets de entrenamiento y prueba son representados de la misma manera, sin embargo, donde el conjunto de entrenamiento contiene un conjunto de vectores de valores de etiqueta conocida (y), las etiquetas para el conjunto de prueba son desconocidas. Tiempo x1 x2 x3 x4 x5 x6 x7 y 9:30 b n -0.06 -116.9 -21.7 28.6 0.209 up 9:31 b b 0.06 -85.2 -61 -21.7 0.261 unchanged 9:32 b b 0.26 -4.4 -114.7 -61 0.17 down 9:33 n b 0.11 -112.7 -132.5 -114.7 0.089 unchanged 9:34 n n 0.08 -128.5 -101.3 -132.5 0.328 down 34 Tabla 2: Ejemplo de dataset para aprendizaje supervisado. En aprendizaje no supervisado, el dataset no contiene un atributo objetivo, o una salida conocida. Como los valores de clase no son determinados a priori, el propósito de esta técnica de aprendizaje es encontrar similitudes entre los grupos o grupos intrínsecos dentro de los datos. Una demostración muy sencilla de dos dimensiones (dos atributos) se muestra en la Figura 8 con los datos particionados en cinco clusters. Un caso podría ser, sin embargo, tener que particionar los datos en dos clusters o tres, etc., La respuesta “correcta” depende en el conocimiento previo o sesgos asociados con el dataset para determinar el nivel de similitud requerido por el problema subyacente. Teóricamente, es posible tener tantos clusters como instancias de datos, aunque esto contradice al propósito del clustering. Dependiendo del problema y los datos disponibles, el algoritmo requerido puede seguir la técnica de aprendizaje supervisado o no supervisado. En esta tesis, el objetivo es predecir actividades para un usuario, que le genere un nivel de satisfacción tal que aumente el nivel de satisfacción objetivo en la proporción esperada. Dado que las actividades históricas del usuario son conocidas, esto requiere una técnica de aprendizaje supervisado. Adicionalmente, se decidió explorar el uso de diferentes algoritmos ya que alguno puede ser mejor que otro, dependiendo de los datos subyacentes. Figura 8: Ejemplo de la técnica de aprendizaje no supervisado – clustering 35 4.2 Algoritmos supervisados de aprendizaje 4.2.1 K vecinos más cercanos (Nearest-neightbor) El método de machine learning de los K vecinos más cercanos (kNN - k nearest neighbor) es uno de los más simples y generalmente se refiere a un aprendizaje perezoso ya que el aprendizaje no se implementa realmente hasta que la clasificación o la predicción es requerida. Este toma la clase más frecuente medida por la distancia euclídea ponderada (o alguna otra medida de distancia) entre los K ejemplos de entrenamiento más cercanos en el espacio de características. En problemas más específicos como la clasificación de texto, kNN ha mostrado que funciona tan bien como otros modelos más complejos [46]. Cuando hay atributos nominales presentes, generalmente se recomienda llegar a una “distancia” entre los distintos valores de los atributos [47]. Una desventaja de usar este modelo es los tiempos de clasificación lentos, sin embargo se puede mejorar la velocidad usando algoritmos de reducción de dimensionalidad; por ejemplo, reduciendo el número de atributos. Ya que el aprendizaje no se implementa hasta la fase de clasificación, este no es un algoritmo apto para utilizar cuando se necesitan decisiones rápidamente. 4.2.2 Naive Bayes El clasificador de tipo Naive Bayes, es un modelo probabilístico eficiente basado en el teorema de Bayes, el cual examina la probabilidad de que características aparezcan en las clases predichas. Dado el conjunto de atributos X = {x1, x2, . . . , xn}, el objetivo es construir la probabilidad a-posteriori para el evento Ck entre el conjunto de posibles clase resultado C = {c1, c2, . . . , ck}. Por lo tanto, con las reglas bayesianas P(Ck|x1, . . . , xn) ∝ P(Ck)P(x1, . . . , xn|Ck), donde P(x1, . . . , xn|Ck) es la probabilidad que el atributo X pertenezca a Cj, asumiendo independencia 1 podemos reescribir como: Una nueva instancia con un conjunto de atributos X es etiquetada con la clase Cj que logra la más alta probabilidad a-posteriori. 36 4.2.3 Tabla de decisión Un clasificador de tipo tabla de decisión se construye sobre la idea conceptual de una tabla de búsqueda. El clasificador retorna la clase mayoría del conjunto de entrenamiento si la celda de la tabla de decisión que coincide con la nueva instancia está vacía. En ciertos conjuntos de datos, se puede conseguir una mayor performance de clasificación usando tablas de decisión en vez de otros modelos más complejos. 4.2.4 Máquinas de soporte vectorial Las máquinas de soporte vectorial (Support Vector Machines), [48] durante mucho tiempo han sido reconocidas como capaces de manejar de manera eficiente los datos multidimensionales. Originalmente fueron diseñadas como un clasificador de dos clases, aunque pueden funcionar con más clases realizando múltiple clasificaciones binarias (una a una entre cada par de clases). El algoritmo funciona clasificando instancias basadas en una función lineal de la característica. Adicionalmente, las clasificaciones no lineales pueden ser realizadas utilizando un núcleo. El clasificador se alimenta con instancias pre-etiquetadas y seleccionando puntos como vectores de soporte, el SVM busca un hiperplano que maximice el margen. 4.2.5 Redes neuronales Artificiales Una red neuronal artificial (ANN - artificial neural network) es un grupo interconectado de nodos con la intención de representar la red de neuronas en el cerebro. Son muy usados en literatura, por su habilidad de aprender patrones complejos. Presentaremos una breve reseña de su estructura en esta sección. Una red neuronal artificial está comprendida por nodos (representados como círculos en la Figura 9), una capa de entrada representada como x1…, x6, una capa opcional oculta, y una capa de salida y. El objetivo de un ANN es determinar un conjunto de pesos w (entre la entrada, el oculto y la salida de nodos) esto minimiza la suma total de errores cuadrados. Durante el entrenamiento, estos pesos wi son ajustados de acuerdo el parámetro de aprendizaje λ ∈ [0, 1] hasta que las salidas sean consistentes. Los valores de λ altos pueden realizar cambios en los pesos que son demasiado drásticos, mientras que valores que son muy pequeños pueden requerir más iteraciones (llamadas epochs) antes que el modelo aprenda lo suficiente de los datos de entrenamiento. 37 La dificultad de usar redes neuronales es encontrar parámetros que aprendan de los datos de entrenamiento sin sobre ajuste (memorizar los datos de entrenamiento) y por lo tanto resulte en un mal desempeño con los datos que no fueron vistos. Si hay muchos nodos ocultos, el sistema puede sobre ajustar los datos actuales, mientras que si hay muy pocos, puede evitar que el sistema ajuste adecuadamente los datos de entrada. Además, una selección de criterio de parada tiene que ser elegida. Esto puede incluir la suspensión en función de cuándo el error total de la red cae por debajo de un cierto nivel de error predeterminado o cuando un cierto número de epochs (iteraciones) se ha completado. Figura 9: Ejemplo de una red neuronal artificial de multicapa tipo feed-forward 4.2.6 Árboles de decisión Los árboles de decisión son clasificadores muy utilizados debido a que el algoritmo crea reglas que son fáciles de entender e interpretar. Una de las formas más populares, el C4.5. Las mejoras son: 1) es más robusto al ruido, 2) que permite el uso de atributo continuo, y 3) que funciona con datos faltantes. El C4.5 comienza como un algoritmo de divide y conquista recursivo, en primer lugar con la selección de un atributo del conjunto de entrenamiento para colocarlo en el nodo raíz. Cada valor del atributo crea una nueva rama, con la repetición de este proceso de forma recursiva utilizando todos las instancias que llegan a esa rama. Un nodo ideal contiene todos (o casi todos) los atributos de una clase. Para determinar el mejor atributo a elegir para un nodo en particular en el árbol, la ganancia en entropía de la información de la decisión se calcula. 38 Figura 10: Ejemplo de un árbol de decisión 4.2.7 Ensambles Un ensamble (conjunto) es una colección de múltiples clasificadores base que toman un nuevo ejemplo, pasado a cada uno de los clasificadores base, y luego combina esas predicciones de acuerdo a algún método, como por ejemplo a través del voto. La motivación es que mediante la combinación de las predicciones, el conjunto es menos probable de clasificar erróneamente. Por ejemplo, la Figura 11.a muestra un conjunto con 25 clasificadores hipotéticos, cada uno con una tasa de error independiente de 0,45 (suponiendo un problema de dos clases uniforme). La probabilidad de obtener k clasificadores de votos incorrectos es una distribución binomial: La probabilidad de obtener 13 o más en error es de 0.31, la cual es menor que la tasa de error del clasificador individual. Esta es una ventaja potencial de usar múltiples modelos. Esta ventaja de usar múltiples modelos (ensambles) se da bajo la suposición que la tasa de error del clasificador individual es menor a 0.50. Si la tasa de error del clasificador independiente es 0.55, entonces la probabilidad de 13 o más en error es 0.69 - sería mejor no usar un conjunto de clasificadores. La Figura 11.b muestra la tasa de error del conjunto para tres tasas de error independientes, 0.55, 0.50, y 0.45 para conjuntos que contienen un número impar de clasificadores, desde 3 a 101. En la figura se puede observar que cuanto menor es la tasa de error del clasificador independiente, mayor el número de clasificadores en el conjunto, menor es la probabilidad de predicción incorrecta de la mayoría de los clasificadores. La idea de la independencia del clasificador puede ser poco razonable, teniendo en cuenta que los clasificadores pueden predecir de una manera similar debido al conjunto de entrenamiento. Obtener un clasificador base que genere errores tan des relacionados como sea posible es lo ideal. La creación de un conjunto diverso de clasificadores dentro del ensamble se considera una propiedad importante ya que la 39 probabilidad de que una mayoría de los clasificadores base clasifiquen erróneamente la instancia se reduce. Estos métodos promueven la diversidad mediante la construcción de clasificadores base en diferentes subconjuntos de los datos de entrenamiento o diferentes pesos de los clasificadores. Figura 11(a): Probabilidad de que precisamente n de 25 clasificadores están en el error (suponiendo que cada uno tiene tasa de error de 0,45). Figura 11(b): Tasa de error vs el número de clasificadores en el conjunto (empleando voto mayoritario) para tres tasas de error independientes. 4.3 Resumen En este capítulo se expuso el concepto de Machine Learning con sus dos enfoques de aprendizaje, supervisado y no supervisado. Por último se describieron y analizaron los algoritmos y técnicas de aprendizaje supervisado. 40 5 Aplicaciones Móviles Un dispositivo móvil es una unidad de tamaño reducido, fácil de transportar para el usuario que posee capacidades de procesamiento, conexión a internet, memoria, almacenamiento, etc. Se entiende por los mismos a los teléfonos celulares (smartphones), tablets y por último; en menor medida las PDAs y los eReaders. Figura 12: Dispositivos móviles Estos dispositivos, al igual que las computadoras, poseen un sistema operativo. El sistema operativo juega el rol de intermediario entre el usuario y el hardware de la unidad. El propósito del Sistema Operativo es crear un entorno en el que el usuario pueda ejecutar programas. En pocas palabras es un facilitador al usuario, abstrayéndolo de complicados procesos para llevar a cabo una tarea. Para determinar qué tipo de dispositivo se utilizará en el presente trabajo, se priorizó alcanzar una masa crítica de usuarios. Hoy día, la manera más simple de lograrlo es a través de una aplicación que corra en un dispositivo móvil. Estos últimos años, la tendencia indica que cada vez más personas acceden a la información a través de sus celulares, en vez de una computadora. Actualmente los sistemas operativos de dispositivos móviles que se encuentran dominando el mercado según la información recabada en el 2015 son: 41 Figura 13: Sistemas operativos móviles en el mundo y Argentina 2015 Puede verse una clara tendencia que los sistemas operativos móviles más utilizados en el mundo son al momento, IOS que utiliza el Iphone y los celulares con sistema operativo Android (sea la marca que fuera). A nivel mundial Android supera por 5 puntos al Iphone pero en Argentina la brecha se agranda obteniendo un total de 81.6% del mercado de uso de celulares en Argentina. Todo indica, que nuestra aplicación debe ser basada en un sistema operativo Android si deseamos que esté disponible para la mayor cantidad de personas. Tanto a nivel mundial como solamente de Argentina. 5.1 Android Android es un Sistema Operativo (SO), además de una plataforma de software, basado en el núcleo de Linux. Diseñada desde un principio para dispositivos móviles, permite controlar dispositivos por medio de bibliotecas desarrolladas o adaptadas por Google mediante el lenguaje de programación Java. Es una plataforma de código abierto. Esto quiere decir, que cualquier desarrollador puede crear, desarrollar aplicaciones y compilarlas a código nativo. Inicialmente, Android fue desarrollada por Google Inc. aunque poco después se unió Open Handset Alliance, un consorcio de 48 compañías de Hardware, Software y telecomunicaciones, las cuales llegaron a un acuerdo para promocionar los estándares de códigos abiertos para dispositivos móviles. 42 Figura 14: Logotipo del último OS Android (Nougat) Google sin embargo, ha sido quien ha publicado la mayoría del código fuente de Android bajo la licencia de Software Apache, una licencia de software libre y de código abierto a cualquier desarrollador. Arquitectura Android: Figura 15: Arquitectura Android La arquitectura interna de la plataforma Android, está básicamente formada por 4 componentes (Figura ). ● Aplicaciones (Applications). Todas las aplicaciones creadas con esta plataforma, incluirán como base un cliente de email (correo electrónico), calendario, programa de SMS, mapas, navegador, contactos, y algunos otros servicios mínimos. Todas ellas escritas en el lenguaje de programación Java. 43 ● Framework de Aplicaciones. Todos los desarrolladores de aplicaciones Android, tienen acceso total al código fuente usado en las aplicaciones base. Esto ha sido diseñado de esta forma, para que no se generen cientos de componentes de aplicaciones distintas, que respondan a la misma acción, dando la posibilidad de que los programas sean modificados o reemplazados por cualquier usuario sin tener que empezar a programar sus aplicaciones desde el principio. ● Bibliotecas. Android incluye en su base de datos un set de librerías C/C++, que son expuestas a todos los desarrolladores a través del framework de las aplicaciones Android System C library, librerías de medios, librerías de gráficos, 3D, base de datos, entre otros. ● Runtime de Android. Android incorpora un conjunto de librerías que aportan la mayor parte de las funcionalidades disponibles en las librerías base del lenguaje de programación Java. La máquina virtual está basada en registros, y ejecuta clases compiladas por el compilador de Java que anteriormente han sido transformadas al formato .dex (Dalvik Executable) por la herramienta ''dx''. ● Dalvik. Es la máquina virtual(VM - Virtual Machines) que utiliza el sistema operativo Android, la cual ejecuta las aplicaciones en los dispositivos con este SO. Los programas son escritos en el lenguaje JAVA y compilados a bytecode. Estos son luego convertidos desde archivos (compatibles con Java VM) “.class” hacia archivos, compatibles con Dalvik “.dex” (executables Dalvik) antes de instalarlos en el dispositivo. El formato Dalvik, compacto y ejecutable, fue diseñado para adecuarse a sistemas que están restringidos en términos de memoria y velocidad de procesador. La licencia de esta máquina virtual sigue la filosofía código abierto. A menudo Dalvik es nombrada como una máquina virtual Java, pero esto no es estrictamente correcto, ya que el bytecode con el que opera no es Java bytecode. Sin embargo, la herramienta dx incluida en el SDK de Android permite transformar los archivos class de Java compilados por un compilador Java al formato de archivos Dex. Dalvik fue diseñada para que un dispositivo pueda ejecutar múltiples instancias de la VM. 5.2 Generalidades de las aplicaciones Android En Android, las aplicaciones se encuentran escritas en el lenguaje de programación Java. Las herramientas del SDK de Android compilan el código – junto con cualquier archivo 44 de datos o recursos – en un Android package, un nuevo archivo con la extensión .apk. Todo el código en un .apk es considerado como una aplicación y es el archivo que los dispositivos con el sistema Android utilizan para instalar la aplicación. Una vez instalada la aplicación en el dispositivo, cada aplicación Android “vive” en su propio security sandbox: ● El sistema operativo Android es un sistema Linux multi-usuario, en el cual cada aplicación es un usuario diferente. ● Por defecto, el sistema asigna a cada aplicación un único ID de usuario de Linux (este es usado solo por el sistema y desconocido por la aplicación). El sistema asigna permisos para todos los archivos de la aplicación, de esta manera, solo el ID de usuario asignado a esa aplicación puede acceder a los mismos. ● Cada proceso tiene su propia máquina virtual (VM), por lo tanto, el código de una aplicación se ejecuta aislado del resto de las aplicaciones. ● Por defecto, cada aplicación se ejecuta en su propio proceso Linux. Android lanza el proceso cuando cualquiera de los componentes de la aplicación necesita ser ejecutado, luego mata el proceso cuando no es necesario o cuando el sistema debe recuperar memoria para otras aplicaciones. De esta manera, el sistema Android implementa el principio de privilegio mínimo (least privilege). Por lo tanto, cada aplicación por defecto, tiene acceso solo a los componentes que requiere para realizar su trabajo. Esto crea un ambiente muy seguro en el cual una aplicación no puede acceder a partes del sistema para las cuales no posee permisos. Sin embargo, hay formas de que una aplicación comparta datos con otras aplicaciones y para una aplicación para acceder a los servicios del sistema: ● Es posible determinar que dos aplicaciones compartan el mismo ID de usuario de Linux, en dicho caso ambas son capaces de acceder a los archivos de la otra. Para conservar los recursos del sistema, las aplicaciones con los mismos ID de usuario también se pueden ejecutar en el mismo proceso de Linux y compartir la misma VM (la aplicación también deberá ser firmada con el mismo certificado). 45 ● Una aplicación puede pedir permisos para acceder a datos del dispositivo, como los contactos del usuario, mensajes SMS, la cámara, entre otros. Todos los permisos de aplicación deben ser otorgados al momento de requerir usarlos. 5.3 Componentes de las Aplicaciones Los componentes de aplicación son la esencia de una aplicación Android. Cada componente es un punto distinto por el cual el sistema puede ingresar a la aplicación. No todos los componentes son puntos de entrada para el usuario y algunos tienen dependencias entre sí, pero cada uno existe como una entidad, juegan un rol específico; cada uno de ellos ayuda a definir el comportamiento general de la aplicación. Existen 4 tipos diferentes de componentes de aplicación. Cada tipo sirve a un propósito diferente y tiene su propio ciclo de vida que define como un componente es creado y destruido. Los 4 tipos de componentes de aplicación son: ● Activity/Fragment. Representa una única pantalla con una interfaz de usuario. Por ejemplo, una aplicación de email puede tener una actividad que muestre la lista de nuevos emails, otra actividad para componer un email, y otra actividad para leer emails. Aunque las actividades trabajan juntas para formar una experiencia de usuario cohesiva en la aplicación de email, cada actividad es independiente de las demás. Por esta razón, una aplicación diferente puede iniciar cualquiera de estas actividades (si la aplicación de email lo permite). Por ejemplo la aplicación de la cámara puede iniciar la actividad que compone un email, para que el usuario pueda compartir su foto. En versiones posteriores a 3.0 de Android, se introdujo el concepto de Fragment, el cual debe ser considerado como un componente de una Actividad, con su ciclo de vida y con la particularidad que pueden realizar invocaciones entre componentes. ● Service. Es un componente que se ejecuta en segundo plano para realizar operaciones de larga ejecución o para realizar trabajos para procesos remotos. Un servicio no provee una interfaz de usuario. Por ejemplo, un servicio puede reproducir música en segundo plano mientras el usuario se encuentra en una aplicación diferente, o puede recuperar datos desde la red sin bloquear la interacción del 46 usuario con una actividad. Otro componente, como una actividad, puede inicializar el servicio y dejarlo en ejecución o enlazarlo para interactuar con el. ● BroadcastReceiver. Es un componente que responde a mensajes de difusión en todo el sistema. Muchas emisiones (broadcast) se originan en el sistema; por ejemplo, una emisión anuncia que la pantalla se apagó, la batería está baja de energía, o una foto fue capturada. Las aplicaciones también pueden iniciar las emisiones- por ejemplo, para comunicar a otras aplicaciones que cierta información fue descargada al dispositivo y está disponible para ser usada. Aunque los broadcast receivers no muestran una interfaz de usuario, pueden crear una barra de estado de notificación para alertar al usuario cuando el evento de emisión ocurre. Comúnmente un broadcast receiver es solo un “portal” hacia otros componentes y está desarrollado para requerir una mínima cantidad de trabajo. ● ContentProvider. Gestiona un conjunto compartido de datos de aplicación. Se pueden almacenar los datos en el sistema de archivos, en una base de datos, en la web, o en cualquier lugar persistente de almacenamiento que la aplicación pueda acceder. A través del content provider, otras aplicaciones pueden acceder y hasta modificar los datos (si el content provider lo permite). Por ejemplo, el sistema Android provee un content provider que gestiona la información de los contactos del usuario. Por lo tanto, cualquier aplicación con los permisos necesarios podrá gestionar, a través de este contentProvider, la lectura o escritura de la información de un contacto en particular. Además los content provider, son útiles para leer y escribir datos que son privados a la aplicación. Todos estos componentes deben ser definidos en un archivo que toda aplicación Android debe especificar llamado "AndroidManifest.xml". El "Android Manifest" contiene información esencial necesaria sobre el sistema Android, información que además es mandatoria antes de poder ejecutar cualquier línea de código. Entre otras cosas el "Android Manifest" contiene lo siguiente: ● Nombre del paquete Java. Este nombre sirve como un identificador único de la aplicación. ● Describe todos los componentes de la aplicación (Actividades, Servicios, "Broadcast receivers" y "Content providers"). Nombre de cada clase y el componente que 47 implementa. De esta forma el sistema Android sabe que componentes hay y bajo qué condiciones se ejecutarán. ● Android Manifest también determina qué procesos contendrán los componentes de la aplicación. ● Determina que permiso tiene la aplicación para acceder a partes protegidas del API e interactuar con otras aplicaciones. ● También determina qué permisos tienen otros para acceder a los componentes de la aplicación. ● Lista las clases de instrumentación que proporcionan perfiles y otra información de ejecución. Esta declaración solo está presente en desarrollo y pruebas, cuando la aplicación es publicada se elimina. ● Declara el nivel mínimo del API Android. Un aspecto único del diseño del sistema Android es que cualquier aplicación puede iniciar un componente de otra aplicación. Por ejemplo, si el usuario desea capturar una foto con la cámara del dispositivo, existe una posibilidad de que otra aplicación haga eso y que nuestra aplicación lo reuse, en vez de desarrollar una actividad para capturar una foto. La aplicación no necesita incorporar o enlazar el código de la aplicación de la cámara. En su lugar, la aplicación simplemente puede iniciar la actividad en la aplicación de la cámara que captura la foto. Cuando se completa, la foto es retornada por un evento a la aplicación que la solicitó para su uso. El usuario ve como que la cámara es parte de su aplicación cuando en realidad se hizo uso de un componente. Cuando el sistema inicia un componente, se inicia el proceso de esa aplicación (si no está en ejecución en ese momento) e instancia las clases necesarias. Por ejemplo, si la aplicación inicia la actividad en la aplicación de la cámara que captura la foto, esa actividad se ejecuta en el proceso que pertenece a la aplicación de la cámara, no en el proceso de la aplicación que lo llama. Por este motivo, a diferencia de las aplicaciones en la mayoría de otros sistemas, las aplicaciones Android no poseen un solo punto de entrada (por ejemplo, no existe una función main()). Dado que el sistema ejecuta cada aplicación en un proceso diferente con permisos de archivos que restringen el acceso a otras aplicaciones, la aplicación no puede directamente activar un componente de otra aplicación. Esto se hace por medio del SO Android. Entonces, para activar un componente de otra aplicación, se debe enviar un 48 mensaje al sistema que especifique el intento(intent) de iniciar un componente en particular. Luego el sistema activa el componente. A continuación (Figura 16) se muestra el ciclo de vida de un componente y sus respectivos métodos que pueden ser sobrescritos para agregar la funcionalidad deseada. Figura 16: Ciclo de vida de una actividad en Android 49 5.4 Ventajas del uso de Android sobre otros sistemas operativos móviles ● Código abierto. El hecho de que Android esté liberado con licencia Apache y código abierto lo convierte en un sistema operativo totalmente libre para que un desarrollador no solo pueda modificar su código sino también mejorarlo. A través de esas mejoras puede publicar el nuevo código y con él ayudar a mejorar el sistema operativo para futuras versiones sin depender de fabricantes u operadoras para ver si se libera o no dicha mejora. Del mismo modo, al ser código abierto garantiza que, en caso de haber un bug o error, sea detectado y reparado con mayor eficacia al no existir ninguna traba legal para indagar en su interior ni depender de nadie para pedir autorización a su cambio. ● Libertad. Android da completa libertad al propietario de un teléfono a instalar lo que desee, sea desde Android Market como un ejecutable aparte (apk) no limitando la libertad del usuario ni imponiendo software propietario para poder instalar música, archivos, documentos directamente desde el cable USB como si de un disco externo se tratara. La misma libertad tienen los desarrolladores o empresas pudiendo realizar aplicaciones o complementos como Flash, Opera o cualquier otro software sin tener que pedir permiso a nadie para ofrecerlo a los usuarios que libremente podrán instalarlo. ● Sin fronteras. El desarrollo de Android no está apadrinado por determinadas operadoras, fabricantes o proveedores. Permite indagar en su código a través del SDK o desde el propio terminal así como modificar su Firmware de manera extraoficial (aunque esté permitido y no sea ilegal, en ocasiones conlleva a la pérdida de la garantía del teléfono) ● Comunidad. Android cuenta con una gran comunidad mundial de desarrolladores y también con multitud de eventos, concursos, competiciones y reuniones así como múltiples vías de comunicación como foros y chats oficiales para fomentar la participación y la colaboración para encontrar mejoras e ideas para futuras versiones. ● Coste y gustos. Precisamente por el hecho de que Android puede ser instalado en teléfonos de cualquier fabricante o incluso en otros dispositivos, esto permite poder disfrutar de una amplia gama de terminales de diferentes precios y para determinados poderes adquisitivos. Esto se da sin tener que forzar o limitar un sistema operativo o terminal a determinadas clases dando la opción de que toda 50 persona pueda adquirir el terminal que más le guste así como de diferentes características o costes o incluso fabricantes. ● Personalizable. Al ser abierto y libre, Android es completamente personalizable tanto por usuarios instalando fondos de pantalla, animaciones, widgets, skins o temas como para fabricantes con la posibilidad de crear sus propias capas como “MotoBlur” o “HTC Sense” permitiendo a unos y a otros poder customizar o personalizar sus teléfonos de la mejor manera posible y dando a elegir al usuario la interfaz más adecuada para su gusto evitando imponer un determinado estilo o interfaz. ● Multitarea. Android con su sistema de multitarea inteligente es capaz de gestionar varias aplicaciones abiertas a la vez dejando en suspensión aquellas que no se utilicen y cerrarlas en caso de resultar ya inútiles para evitar un consumo de memoria. ● No solo móviles. La libertad del código de Android ha hecho que en poco tiempo se implante en multitud de dispositivos electrónicos, desde móviles hasta ordenadores portátiles, netbooks, microondas, lavadoras, marcos digitales, navegadores GPS, entre otros. Esto convierte a Android en un sistema operativo multifunción y completamente escalable que garantizará su crecimiento y expansión así como ayudará a fabricantes a tener un motor inteligente para sus productos. 5.5 Resumen En este capítulo se expusieron los sistemas operativos móviles que se encuentran en el mercado, junto con la variedad de dispositivos que se encuentran en el mercado. Se relevó la información que se posee de cada uno de ellos tanto a nivel mundial como así también en Argentina. Luego, post decisión de optar por Android, fueron expuestas las generalidades de las aplicaciones Android, los componentes y por último las ventajas sobre otros sistemas operativos móviles. 51 6 Trabajos relacionados En este capítulo se reportan diferentes aplicaciones que realizan recomendaciones personalizadas o que se encuentran ligadas al ámbito emocional. Estas aplicaciones son utilizadas a través de dispositivos móviles, como así también a través de una página web. Se analizará cada aplicación por separado, considerando lo expuesto en los capítulos anteriores. 6.1 Google News (sesión de noticias de Google) Google News es una aplicación que recopila noticias de miles de fuentes y los muestra en una página web personalizada, y es importante para el presente trabajo ya que la tendencia de los usuarios de Google News es utilizar la aplicación, a través de su celular mientras están viajando a las oficinas de sus respectivos trabajos. El sistema de recomendación de Google News se desarrolló en 2007. Se trata de la implementación de un servicio de recomendación colaborativo [capítulo 3.2.1.2 del presente trabajo] de noticias en un entorno donde los elementos cambian rápidamente, con las limitaciones para una escalabilidad alta, considerando que existen millones de usuarios para millones de artículos. Este sistema se caracteriza por una elevada tasa de rotación de su catálogo de artículos: los artículos son noticias que tienen un flujo constante. Las últimas noticias son, a menudo, las más interesantes, por lo que el sistema debe regenerar el modelo de recomendación frecuentemente, aumentando el problema de escalabilidad [desventaja descrita en el capítulo 3.2.1.2]. Google News sólo utiliza retroalimentación implícita para construir un perfil de un usuario, cuando éste hace clic sobre los temas. El sistema es puramente colaborativo y se basa en los ID de noticias e ID de los usuarios, de modo que un usuario está representado por la lista de noticias a las cuales hizo clic. El método basado en la similitud utiliza sólo el recuento de aquellas visitas que un mismo usuario efectúa sobre una misma noticia al menos dos veces. El método basado en el modelo utiliza dos técnicas de agrupamiento, una probabilística: la indexación semántica latente PLSI, [49] y la otra MinHash [50]. PLSI es un método probabilístico para la representación factorial de los documentos y sus términos: los términos se sustituyen por los identificadores de usuario. En cambio, MinHash es un método de agrupamiento 52 probabilístico basado en la concatenación de p-firmas aleatorias extraídas de objetos al grupo: se considera a los objetos como usuarios, extrayendo de sus perfiles las firmas aleatorias. Con la finalidad de acelerar el cálculo de PLSI y MinHash, se utiliza un framework de paralelización de tipo MapReduce [51]. El sistema proporciona una puntuación total por un método híbrido ponderado [52]. La puntuación global de la noticia i está dada por ∑ W a rai con W a a el peso del algoritmo a y un rai la puntuación dada por el algoritmo de una de las noticias i. Los pesos se obtienen mediante un parámetro discreto predefinido. El sistema se utiliza como un ranking: para obtener una lista de las noticias que se recomienda, el sistema devuelve una lista ordenada con los pesos de cada noticia. La alta escalabilidad de la solución técnica y su adaptación a un catálogo con una tasa muy alta de actualización son las principales particularidades de este sistema de recomendación. Figura 17: Landing page de GoogleNews 6.2 XPod Xpod [53] es un reproductor de música móvil que selecciona canciones de acuerdo al estado emocional de los usuarios y las actividades que realizan. El reproductor utiliza una colección de datos fisiológicos externos al dispositivo llamado BodyMedia SensorWear. En comparación con las actividades que se consideraron en nuestro trabajo, las actividades consideradas en Xpod son más generales, y abarcan: reposo, pasiva y activa. XPod controla una serie de variables para determinar los niveles de la actividad y el movimiento del usuario para predecir qué música es adecuada en ese momento. Utiliza una 53 red de Bayes para inferir el estado emocional del usuario (deprimido, contento, exuberante, o ansioso/frenético) de información de contexto teniendo en consideración el clima, ruido, hora, género y edad. La música es luego recomendada de acuerdo al estado emocional inferido, usando etiquetas de estado emocional en cada canción disponible. El usuario Xpod entrena el reproductor para entender qué música prefiere bajo qué condiciones. Después del entrenamiento, Xpod puede predecir la conveniencia de una canción dado el contexto en el cual se encuentra el usuario. 6.3 Hulu “CF-NADE: Algorithm” Hulu es una plataforma online de películas y series on-demand, como es Netflix. La plataforma puede ser utilizada a través de cualquier dispositivo que posea conexión a internet como una computadora, una tablet o un smartphone. Investigadores de Hulu inventaron un original método de filtrado colaborativo basado en redes neuronales, denominado estimador neuronal autorregresiva de distribución para el filtrado colaborativo (CF-NADE en inglés). Los servicios en línea modernos dependen en gran medida de los sistemas de recomendación para ayudar a los usuarios a encontrar los ítems que podrían estar interesados y ofrecer experiencias personalizadas a través del establecimiento de relevancia entre los elementos y también entre los usuarios. En Hulu, el Personalized Masthead (Banner personalizado), como también el Watchlist y la lista Top Picks son en parte impulsados por el filtrado colaborativo. Figura 18: Pantalla de Hulu de recomendación de productos 54 CF-NADE [54] modela la distribución del vector de la valoración del usuario, optimizado mediante la maximización de la probabilidad conjunta de todos los vectores. Figura 19: Un ejemplo demostrativo de CF-NADE Considérese el siguiente ejemplo un usuario calificó 4 películas, "Transformers", "Bob Esponja", "Teenage Mutant Ninja Turtles" y "Interestelar", con puntuaciones de 4,2,3 y 5, respectivamente, en una escala de 5 estrellas. En CF-NADE, la probabilidad conjunta de vector (4,2,3,5) es factorizada como un producto de los condicionales por regla de la cadena, que son: 1. La probabilidad de que el usuario da "Transformers" 4 estrellas sin condicionamiento 2. La probabilidad de que el usuario da "Bob Esponja" 2 estrellas condicionado por dar 4 estrellas a "Transformers". 3. La probabilidad de que el usuario da "Tortugas Ninja" 3 estrellas, a condición de haber dado 4 estrellas, y de 2 estrellas a "Transformers" y "Bob Esponja", respectivamente. 55 4. La probabilidad de que el usuario da "interestelar" 5 estrellas, a condición de haber dado 4 estrellas, 2 estrellas y 3 estrellas a "Transformers", "Bob Esponja" y "Tortugas Ninja", respectivamente. Cada condicional se modela mediante una red neuronal feed-forward, y los parámetros de estas redes neuronales son compartidos entre todas las redes. CF-NADE se “entrena” para reducir al mínimo la probabilidad del vector de usuario, de entre todos los usuarios. Con un modelo entrenado, dado el historial de calificación de un usuario, podemos predecir su preferencia sobre una película sin clasificar. Figura 20: Top 5 de películas más similares recomendadas por el algoritmo La Figura 6.3.c representa los 5 primeros vecinos más próximos de las películas de entrada (columna más a la izquierda) utilizando similitud del coseno. En la imagen se puede ver que los mejores 5 películas más similares a "Star Trek VI" son otras películas de Star Trek; los mejores 5 películas más similares a "Sleepless in Seattle" son todas las películas románticas; y los mejores 5 películas más similares a "Rey León" son todas las animaciones. 56 6.4 PicFeel - A World of Feelings PicFeel [55] es una aplicación social para compartir emociones basadas en experiencias vividas. El usuario utiliza la app básicamente para sacar una foto, geo-ubicarla y compartir la emoción que experimentó en ese momento. Con PicFeel se pueden localizar emociones a través del mundo, encontrar los lugares más cercanos donde la gente sintió una emoción y encontrar una ruta para llegar a ese destino. Figura 21: Aplicación PicFeel Esta aplicación no posee recomendación directa de emociones a experimentar. Pero si permite ver a través de otros usuarios de la aplicación, las experiencias que vivieron. 57 6.5 Happiness Happiness [56] es una aplicación móvil que corre en celulares Iphone, es una especia de diario virtual, donde la persona ingresa su estado de ánimo en relación a la actividad que está realizando. Figura 22: Aplicación Happiness Adicionalmente, Happiness permite al usuario configurar recordatorios para incluir entradas en el diario. Figura 23: Recordatorio de la aplicación Happiness, para cargar una nueva entrada Happiness no dispone recomendación alguna en cuanto a que actividades realizar buscando como objetivo ser más feliz. Se lo puede considerar como un diario personal digital. Como punto negativo, se puede mencionar que al ser estar desarrollado solamente 58 en Iphone, dispone de un público muy específico. Ya que todos los otros smartphones son descartados 6.6 Resumen En este capítulo se presentaron algunas de las aplicaciones móviles, que realizan recomendaciones personalizadas a sus usuarios en sus ámbitos particulares. Por otro lado también se expusieron aplicaciones que juegan el rol de registro de la felicidad en base a la carga de datos del usuario en la aplicación. Es importante destacar que hasta el momento del presente trabajo, no se pudo encontrar una aplicación que combine el registro de actividades, con el estado de ánimo del usuario y una futura recomendación personalizada. 59 7 Enfoque En los capítulos previos se presentaron distintas técnicas para realizar recomendaciones personalizadas de actividades para que cada usuario de JoyMeter logre alcanzar un estado emocional positivo. Para materializar y evaluar este enfoque se ha construido una aplicación que interactúa con cada usuario en particular, para permitirle la carga de actividades, ver el historial de actividades, el nivel actual e histórico de felicidad, y realizar solicitudes de recomendaciones. En este capítulo se presentan los aspectos de diseño más relevantes de JoyMeter. En la sección 7.1 se describe la aplicación y sus principales requerimientos. En la sección 7.2 se detalla su funcionalidad y las decisiones de diseño involucradas. En la sección 7.3 se especifica el nivel subjetivo de felicidad y la propuesta de JoyMeter para obtenerlo. Finalmente, en la sección 7.4 se presentan las tareas desempeñadas por el recomendador. 7.1 JoyMeter JoyMeter es una herramienta de seguimiento de actividades personales junto con el nivel de satisfacción obtenido al realizar las mismas. El sistema permite cargar actividades, actualizarlas, consultarlas y ofrece un historial de los niveles de satisfacción del usuario a lo largo del tiempo. Adicionalmente incluye un sistema de recomendación, que se detallará más adelante. Se dispone de distintas reglas para contemplar la satisfacción otorgada por ciertas actividades predefinidas, y el feedback provisto por los usuarios de la aplicación. Para facilitar el acceso, la aplicación brinda la posibilidad de ser accedida desde múltiples dispositivos. Como funcionalidad adicional, la herramienta está integrada con Facebook para facilitar el Login del usuario con las credenciales de Facebook, así como también permite al usuario publicar en Facebook cada una de las actividades que este crea cuando así lo desee. A continuación se adjunta un diagrama nocional de los componentes de JoyMeter, las APIs externas y el usuario interactuando con el sistema. Cada componente en este diagrama se analizará en detalle a medida que las decisiones de diseño van siendo detalladas. 60 Figura 24: Diagrama nocional de los componentes de JoyMeter y las APIs externas con la interacción del usuario A continuación, se describen los requerimientos de alto nivel, los cuales definen la funcionalidad de la aplicación, para luego dar lugar a la descripción de las decisiones de diseño tomadas para poder cumplir con dichos requerimientos. 7.1.1 Actividades 1. Un usuario debe poder cargar una actividad que haya realizado, junto a su descripción, tipo de actividad y el nivel de satisfacción personal que ha alcanzado realizando la misma. 2. Un usuario debe poder consultar las actividades cargadas en un periodo de tiempo. 3. Un usuario debe poder editar una actividad creada previamente, editando los valores anteriormente guardados, este cambio se verá reflejado en el historial de actividades. 61 4. Un usuario debe poder eliminar una actividad previamente cargada, una vez eliminada no se verá en el historial de actividades. 5. El usuario puede seleccionar publicar la actividad que está siendo cargada . La misma será publicada en Facebook en el perfil del usuario. 7.1.2 Nivel de satisfacción 1. Un usuario debe poder obtener el nivel de satisfacción diario, obtenido en relación a las actividades del día en cuestión, como así también el nivel de satisfacción del dia previo con aplicando un factor de decaimiento. 2. En nivel de felicidad diario como el histórico de un usuario debe ser actualizado cuando este cargue, edite o elimine una actividad. 7.1.3 Sugerencia de actividades 1. El usuario debe poder solicitar que una actividad le sea sugerida, dicha actividad será sugerida en base a la interacción registrada del usuario con el sistema. El usuario podrá cargar la actividad tal cual le fue sugerida, editando parcialmente algún valor o en todo caso ignorar la sugerencia si no es de su agrado. 2. El usuario será notificado en el dispositivo que esté utilizando, la actividad sugerida por el sistema. 7.1.4 Autenticacion 1. El usuario debe autenticarse con el sistema, de modo que asegure su identidad para poder acceder a la información del mismo. El sistema solicitará al usuario que ingrese sus credenciales de Facebook, una vez validada la identidad del usuario, el mismo podrá acceder al sistema. 7.1.5 Accesibilidad 1. El usuario podrá acceder fácilmente al sistema y en cualquier momento para cargar aquella actividad que haya realizado. 62 2. Un usuario puede consultar el sistema y hacer actualizaciones en el mismo desde múltiples dispositivos, los cambios se verán reflejados en todos ellos, siempre y cuando dichos dispositivos posean conexión a internet. 7.1.6 Usabilidad 1. Un usuario sin experiencia previa en el uso del sistema debe poder operarlo correctamente. El usuario puede utilizar el sistema de manera intuitiva, accediendo a las funcionalidades sin complicaciones. La interfaz del sistema debe ser fácil de usar y debe seguir los estándares preestablecidos, para que el usuario la navegue con naturalidad. 7.1.7 Acceso offline y sincronización 1. El usuario puede consultar el historial, cargar, editar y/o eliminar actividades incluso cuando este se encuentre sin acceso a internet, sin notar diferencia alguna. Los cambios serán actualizados cuando se re establezca la conexión, propagando los cambios en cualquier otro dispositivo vinculado a la misma cuenta. 63 7.2 Diseño de Arquitectura Por ser JoyMeter un sistema que requiere ser accedido desde distintos dispositivos de manera distribuida, se optó por una arquitectura cliente/servidor. La diversidad de plataformas, en sistemas distribuidos han logrado poner esta arquitectura como pilar base de cualquier diseño arquitectónico que ataque dicho enfoque. En JoyMeter, el usuario accede a la aplicación a través de un dispositivo Android, que cumple el rol de cliente del sistema. Y se conecta a través de un protocolo de comunicación con el servidor de JoyMeter el cual le brinda servicios necesarios para la utilización de la aplicación a través de una API. Figura 25: Deploy general de Joymeter e integración con APIs externas 64 7.2.1 Servidor El servidor de JoyMeter, es un servicio web que expone una API REST con la funcionalidad requerida por el cliente, tanto como para consultar y persistir los datos, como para llevar el cálculo del nivel de felicidad histórico y la generación de las actividades a sugerir. El servidor de JoyMeter se encuentra dividido en una arquitectura por capas. La arquitectura basada en capas se enfoca en la distribución de roles facilitando la distribución de responsabilidades y un fácil mantenimiento/modificabilidad del sistema, ya que en caso que sobrevenga algún cambio, solo se atacará el nivel requerido sin tener que involucrar a las demás capas. En ambientes colaborativos, este patrón permite distribuir el trabajo por niveles. De este modo, cada grupo de trabajo estará abstraído del resto de los niveles, y solo bastará conocer la API que existe entre niveles. En estas arquitecturas, a cada nivel se le confía una misión simple, lo que permite el diseño de arquitecturas escalables. Las división en capas de la arquitectura del servidor de JoyMeter son Resource (presentacion), S ervice (lógica) y Repository (persistencia). En líneas generales, un componente de la capa Resource solicita a un componente de la capa service que le brinde la información necesaria para responder una solicitud que le ha llegado. El componente de la capa Service que atendió la solicitud, puede valerse de otro/otros componentes de la misma capa, para que le brinde los elementos necesarios para responder la solicitud o sino también puede hacer uso de uno/unos de los componentes de la capa inferior, Repository. Adicionalmente, el server cuenta con un componente que opera de manera transversal a las 3 capas, este componente es el ExceptionHandler y es el encargado de manejar las excepciones de la aplicación para retornar una respuesta http valida, con su status code correspondiente. La autenticación en la capa resource para el alta de un usuario utiliza la API de Facebook para validar las credenciales de facebook, las cuales fueron obtenidas previamente por el cliente. Mientras que la autorización de los recursos de un usuario se lleva a cabo, mediante un componente que intercepta los llamados que llegan a la capa Resource, y valida las credenciales del usuario verificando que sea una sesión válida para el recurso que se desea acceder. 65 Figura 26: Diagrama de componentes del servidor de JoyMeter Otra integración que se lleva a cabo en el servidor que es importante a destacar, es el uso de la API de Google GCM(Google cloud messaging) para la notificación en los dispositivos android asociados a la sesión del usuario. Figura 27: Flujo de alta y recepción de mensaje de un dispositivo con GCM El alta de un dispositivo Android se genera en los pasos 1, 2 y 3. Solicitando el token a GCM, obteniendolo y por último enviándolo al servidor que lo almacenará para cuando desee enviar una notificación al celular en cuestión. En ese caso, el servidor enviará un mensaje al servicio de GCM, con el token del dispositivo. El servicio de GCM le enviará al dispositivo de destino el mensaje (pasos a y b). De esta manera, cuando el usuario solicite que se le sugiera una actividad a realizar, el servidor recibe una petición de sugerencia, genera la sugerencia y la envía de vuelta al usuario a través de la API de Google, la cual genera una notificación en el dispositivo móvil. Para más detalle referido a la implementación del servidor, puede consultarse la sección B del apéndice. 66 7.2.2 Cliente Como punto de partida, pensando en el requerimiento de accesibilidad, el cual pretende facilitar la carga de actividades en cualquier momento del día en cualquier lugar, se ha desarrollado una aplicación para dispositivos móviles para la plataforma Android. A nivel de interfaz visual, el cliente incluye los siguientes componentes: ● LoginActivity: Página de bienvenida con los términos y condiciones. Al final de los términos y condiciones se encuentra el botón para iniciar la registración con las credenciales de Facebook. ● HistoryActivity: Página que despliega el historial de las actividades que el usuario realizó. A través de 2 botones permite agregar una actividad nueva y solicitar el gráfico del nivel de satisfacción respectivamente. ● ActivityListFragment: Fragmento que contiene la lista de todas las actividades realizadas por el usuario. Está contenida en la HistoryActivity. Cada elemento es clickeable y brinda la posibilidad de editarlo o eliminarlo. ● SingleActivity: Página donde se despliega toda la información correspondiente a una actividad. Podrá ser una actividad nueva, en ese caso el formulario estará vacío. O una actividad existente, en ese caso el formulario estará cargado con la información de la respectiva actividad. Al confirmar la página, se grabará la actividad nueva, o se actualizará la existente dependiendo de cada caso. ● ChartActivity: Página donde se despliega el gráfico del nivel de felicidad del usuario. Entre las decisiones de implementación de alto nivel, pueden detallarse los componentes visuales de la aplicación, la comunicación con el servidor que será a través de una API Rest, una base de datos local en el dispositivo y un bus de eventos que facilita la comunicación entre los componentes de la aplicación 67 Figura 28: Arquitectura del cliente de JoyMeter Como puede apreciarse en el diagrama, los componentes visuales solicitan al bus de eventos, la información necesaria para desplegar los elementos de la vista. Esa solicitud será atendida por el Presentador, que realizará la lógica necesaria (llamado a la API o consulta en la base de datos local) para retornar a través del bus, la información solicitada. JoyMeter requiere autenticación del usuario para asegurar el accesos de los mismo. Para lograr la integración con Facebook y GCM(Google Cloud Messaging), se tuvieron que integrar tanto el SDK de Facebook, como el servicio de mensajería de Google en el flujo de registración. El proceso de registración comienza solicitando un token de Facebook con las credenciales del usuario, luego se procede a dar de alta el dispositivo en el servicio de GCM para obtener el GCMToken con el cual se identificó al dispositivo. Por último con ambos datos (token de Facebook y token de GCM) se realiza un llamado a nuestro servidor donde se procede a dar de alta al usuario y se retorna un token de sesión para validar los llamados posteriores al servidor. En el siguiente diagrama se muestra el proceso completo, teniendo en consideración todos los componentes involucrados. 68 Figura 29: Flujo del alta de un usuario en JoyMeter y componentes involucrados Para simplificar el diagrama, las flechas representan llamados asincrónicos con callbacks asociados respectivamente. Esto es un principio de Android para evitar la espera ocupada y que los componentes visuales no se queden sin responder a la interacción con el usuario, se logra que la aplicación sea más fluida. También se han excluido los parámetros involucrados en cada llamada para que sea más simple el diagrama. Como por ejemplo el llamado a signup dispondrá del token de Facebook y también el token de GCM para dar de alta el usuario en el servidor de JoyMeter. Por último, el llamado que realiza el componente visual LoginActivity al componente HistoryActivity posee un llamado de “fantasía”. Esto en Android se realiza a través de un Intent que posee la referencia a la clase del componente HistoryActivity y ejecutando el método starActivity. Para más detalle referido a la implementación del servidor, dirigirse a la sección C del Apéndice 69 7.3 Cálculo del nivel subjetivo de felicidad El objetivo de este trabajo se enfoca en recomendar actividades que provoquen emociones positivas en el usuario repercutiendo en su bienestar y felicidad. Es asi que JoyMeter utiliza la información recopilada de las actividades cargadas por el usuario, para hacer el cálculo del nivel de felicidad relativo de este usuario por día, a medida que se extrae de los valores de satisfacción de las actividades antes mencionadas. La felicidad es un tema complejo, en efecto, pero en las últimas décadas se han desarrollado teorías y métodos de medida . Investigar acerca de la felicidad posee la dificultad que, a diferencia de otros temas, cada individuo tiene sus propios argumentos; y la felicidad es una opción individual que tiene que ver con los valores que cada persona reconoce o acepta. Esta definición tiene implicancias importantes para la medición de la felicidad. Si reconocemos que se trata de un fenómeno interior a cada persona, entonces parece más adecuado medirla con auto-reportes que con evaluaciones de expertos o pares. Es por eso que JoyMeter, obtiene el cálculo de una medida subjetiva de felicidad, basándose en los valores de satisfacción diarios evaluados por el mismo usuario. Si bien el valor generado por JoyMeter, no deja de ser un valor obtenido a través de una función heurística, sirve como punto de partida para evaluar el estado de un usuario en un día dado, para ser tomado como referencia a la hora de generar una recomendación que se adapte a las necesidades del usuario, buscando promover los estados emocionales positivos. Si se considera la felicidad como una un estado emocional que es alimentado por la realización de actividades que producen satisfacción hacerlas y que decae a medida que no se alimenta con nuevas actividades, podría modelarse la felicidad como un modelo de decaimiento. Si se observa cierta cantidad de felicidad, al paso del tiempo se puede verificar un cambio en dicha cantidad; la cantidad M de felicidad es una función del tiempo t, esto es M = M (t) . Al paso del tiempo ocurre una desintegración o decaimiento de la felicidad. En otras palabras, en cualquier tiempo, la rapidez de cambio de la cantidad M (t) es directamente proporcional a la cantidad de felicidad presente: δM(t)/δt = k.M(t) Donde δM(t)/δt es la variación de la felicidad con respecto al tiempo, k es la llamada constante de proporcionalidad. Debido a que es definió que a través del paso del tiempo, el nivel de felicidad va disminuyendo (decreciendo), esto permite concluir que k < 0 ya que 70 M (t) > 0 . Esta ecuación diferencial representa un modelo matemático con resolución a variables separables. En efecto δM/M = k.δt Integrando se tiene ∫ δM/M = ∫ k.δt ⇒ ln M = kt + C ⇒ M = ekt+c = ekt ec = ekt C Entonces la solución homogenea de la ecuación diferencial es: M (t) = Cekt Teniendo en consideración la felicidad del día anterior, más las actividades realizadas en el día {N(t)} la solución particular para esta ecuación diferencial es: M (t) = M (t−1) ek + N (t) Se toma el promedio del nivel de satisfacción del dia, el cual está compuesto por el promedio del nivel de satisfacción de las actividades realizadas ese dia junto con el nivel de satisfacción del dia anterior afectado por la función de decaimiento. 7.4 Recomendación de Actividades JoyMeter es un asistente personal, capaz de aprender de las actividades de interés de los usuarios, captando la información necesaria a través de la observación, monitoreando las actividades cargadas por el usuario y calculando el ya mencionado nivel de felicidad, del cual se ampliará más adelante. Adicionalmente el feedback implícito que es recolectado de las sugerencias hechas por JoyMeter que el usuario aceptó o rechazó es registrado por el agente. Con la información obtenida a través del proceso de observación y el feedback recolectado, JoyMeter trata de encontrar regularidades o patrones recurrentes en las actividades realizadas por un usuario, y asiste al mismo para realizar actividades las cuales generen un nivel de satisfacción tal que se incremente el nivel de felicidad del usuario. JoyMeter tiene como objetivo el cultivo de emociones positivas mediante la realización de actividades que ayuden a una persona a desarrollar áreas del cerebro asociadas al bienestar y la felicidad. Un sistema de recomendación tiene como objetivo 71 principal sugerir actividades en las que el usuario se espera esté interesado, el éxito del sistema de recomendación se centra en el grado de concordancia que pueda obtener entre la representación de las preferencias del usuario y las verdaderas preferencias del usuario. En el caso de JoyMeter, éste aprende de los intereses del usuario basándose de las características de las actividades que el usuario ha cargado en el sistema, con el objetivo de recomendar actividades similares que puedan resultar interesantes en el futuro. En este sentido, JoyMeter es un sistema de recomendación basada en contenido. Para el problema del usuario nuevo, JoyMeter resuelve con una estrategia de recomendación basado en sugerencias pre-establecidas. 7.4.1 Informacion captada para generar recomendaciones Como ya se mencionó, JoyMeter obtiene información para asistir al usuario recomendando una actividad a realizar que sea de su preferencia, mediante la observación de la interacción del usuario y la aplicación y el feedback implícito obtenido a partir del resultado de las sugerencias propuestas al usuario. De la información capturada de la interacción del usuario con JoyMeter, se registran todas las actividades realizadas por el usuario. Figura 30: Perfil de usuario De estas actividades, los datos que se utilizan para la generación del perfil del usuario son: 1. Si la actividad se realizo un dia laboral o no laboral: WorkingDay o WeekendDay 2. El momento del día en el que se realizó la actividad: Morning, Evening o Night 3. Nivel de satisfacción obtenido al realizar la actividad: valor entre 1 y 5 4. El tipo de actividad: Ocio, Deporte, Profesional y Estudio 72 Cuando un usuario solicita que el sistema le sugiera una actividad a realizar, se registra el feedback implícito derivado de la acción del usuario al aceptar o rechazar la actividad propuesta por JoyMeter. En el sistema, se registra: ● Cada sugerencia realizada ● La actividad en la cual se basó la sugerencia ● Si la sugerencia fue aceptada o no1 ● El identificador de la nueva sugerencia, si es que el usuario aceptó y cargó la nueva actividad. 7.4.2 Clasificadores Para la implementación de estas recomendaciones que utilizan mecanismos de Machine Learning, se utiliza la biblioteca Weka, la cual provee un gran número de algoritmos de clasificación en Java. El componente en JoyMeter que utiliza el clasificador provisto por Weka es ActivityBaseClassifier, y es el encargado de entrenar el clasificador y generar el modelo. El clasificador se utiliza para predecir un tipo de actividad basándose en los atributos que fueron definidos de entrada (tipo de dia, momento del dia y nivel de satisfacción). JoyMeter ofrece 4 tipos de actividad, a saber: Ocio, Deporte, Profesional y Estudio. El clasificador debe ser entrenado con las preferencias del usuario obtenidas mediante un proceso de observación, para luego generar un modelo (perfil de usuario) a partir de los datos de las actividades realizadas por el usuario que se encuentran persistidas en la base de datos. Periodicamente se ejecuta un proceso, para todos los usuarios, el cual obtiene las actividades del usuario y genera el modelo el cual es persistido para su posterior uso por el clasificador. Adicionalmente, cuando un usuario solicita una sugerencia, se verifica si posee ya un modelo asociado. De existir dicho modelo, y si no se encuentra “vencido” (superó los 30 días desde su generación), este el modelo ha de ser usado por el recomendador. En caso que el usuario no posea un modelo y posea suficientes actividades para crearlo o se trate de un modelo vencido, el modelo es re-generado y se persiste previamente al proceso de recomendación. En caso de que no posea suficientes actividades para generar el modelo, se utiliza una estrategia de recomendaciones preestablecidas. Al realizar una sugerencia, el sistema la persiste con el estado “No aceptada”. Si el usuario la acepta luego manteniendo el tipo de actividad, el sistema persiste la relación de la nueva actividad con la sugerencia y le cambia el estado a “Aceptada” 1 73 7.4.3 Estrategias de recomendación Joymeter propone dos estrategias de recomendación, una denominada “Basic Activity Recommender” y la otra “Filter Activity Recomender”. Estas estrategias toman la información histórica del usuario, y generan una predicción que se ajuste a los gustos del mismo. La principal diferencia entre ambas estrategias radica en que “Filter Activity Recomender” utiliza el feedback implícito del usuario (recomendaciones realizadas anteriormente que fueron aceptadas o rechazadas). Figura 31: Estrategias de recomendación Como parámetros de entrada se toma el perfil del usuario, para el cual se obtiene el nivel de felicidad objetivo, el dia de la semana (dia laborable o fin de semana) y el momento del día (mañana, tarde o noche) llamados de ahora en más, atributos independientes. Con esa información, el recomendador entrega una actividad a sugerir, la cual se espera sea del agrado del usuario. Ambas estratégias de recomendación, utilizan el componente ActivityBaseClassifier de JoyMeter, el cual delega internamente en un clasificador de Weka. ActivityBaseClassifier provee 2 métodos para la realización de las estrategias de recomendación a partir de los atributos independientes. Estos son suggestActivity que resuelve un tipo de Actividad a sugerir, y getActivityTypeDistribution el cual retorna la distribución de probabilidad de los tipos posibles de actividad dependiendo los atributos de entrada. A continuación se presenta un ejemplo. Figura 32: Sugerencia del tipo de Actividad en base a los atributos independientes 74 Figura 33: Distribución de probabilidad de tipos posibles de actividad Basic Activity Recommender Las instancias generadas a partir de todos los niveles de satisfacción que cumplen la condición, son clasificadas por medio del ActivityBaseClassifier, resultando en un listado de tipos de actividad sin duplicados, y finalmente se devuelve uno de los elementos de la lista de tipos resultado de manera aleatoria. Una vez que se cuenta con el tipo de actividad a recomendar, se obtienen todas las actividades del usuario que se condicen también con los atributos independientes y se resuelve una descripción aleatoria de estas actividades. De no existir una actividad que cumpla con estas caracteristicas, se obtiene la descripción de una de las actividades preestablecidas que coincidan con el tipo a sugerir. Finalmente se genera el Advice, que no es más que la actividad generada a partir de los datos antes mencionados.. Figura 34: Basic Activity Recommender 75 Filter Activity Recommender (filtro basado en el feedback del usuario) Este enfoque, a diferencia del primero, no solo genera recomendaciones al usuario basándose en lo aprendido a través de la observación, sino que también toma el feedback implícito introducido por el usuario (recomendaciones realizadas anteriormente que fueron aceptadas o rechazadas) y lo utiliza para filtrar aquellas actividades. Se utilizan los atributos independientes para obtener la distribución de probabilidad de tipos de actividad, para el/los niveles de felicidad objetivo. La distribución de probabilidades promedio obtenida se ordena de mayor a menor (Ranker), y se toma el acumulado con una cota superior de 0.7 de probabilidad (ABC2). De esta manera se da prioridad a los tipos de actividad con mayor probabilidad de acierto. Finalmente, se filtran los tipos de actividad que fueron menos aceptados por el usuario en recomendaciones previamente realizadas. Para esto, se arma un vector acumulado a partir de obtener el porcentaje de sugerencias aceptadas (sugeridas/realizadas) para cada uno de los tipos restantes, y se calcula la incidencia de cada tipo, ponderando el nivel de aceptación con la probabilidad de acierto sobre la sumatoria de todos los niveles ponderados: n F (t) = %a(t) * p(t) / ∑ (%a(i) * p(i)) i=1 Donde a(t) es la cantidad de aciertos, p(t) es la probabilidad de acierto, n el total de tipos de actividad a ponderar Una vez generado el vector acumulado, con las probabilidades de cada tipo ponderadas según la probabilidad de acierto y el porcentaje de aceptación, de manera aleatoria se obtiene el tipo de actividad (random entre cero y uno). De este modo, los tipos con mayor valor ponderado, tienen más probabilidad de ser seleccionados. 2 https://docs.google.com/viewer?a=v&pid=sites&srcid=YWx1bW5vcy5leGEudW5pY2VuLmVkdS5hcnxpb nZvcHxneDozZGFkOGExZWVhMzMzZDU1 76 Una vez adquirido el tipo de actividad a recomendar, se obtienen todas las actividades del usuario que se condicen también con los atributos independientes y se resuelve una descripción aleatoria de estas actividades, con la que se genera el Advice a sugerir al mismo. Figura 35: Filter Activity Recommender Figura 36: Feedback Filter 77 Recomendación basada en sugerencias Preestablecidas La estrategia de recomendación basada en sugerencias preestablecidas es utilizada por las dos implementaciones existentes de Activity Recommender, en los casos que se trate de un usuario que no posea suficientes actividades3 para generar un perfil de usuario. Este modelo de sugerencia utiliza un conjunto de actividades predefinidas a sugerir y las actividades cargadas por el usuario, si existiera alguna. Esta estrategia es utilizada cuando se trata de un usuario nuevo, el cual no tiene información previamente cargada como para generar el perfil del usuario y ser usado por el clasificador para predecir una actividad que sea de las preferencias del mismo. Esta simple estrategia toma de forma aleatoria una actividad entre un conjunto compuesto de actividades base y las actividades cargadas por el usuario hasta el momento. Se optó por crear 19 actividades tratando de contemplar actividades genéricas para un usuario común. Estas actividades son: ● Tomar una cerveza con amigos. Tipo de la actividad, Ocio. ● Caminar por el centro. Tipo de actividad, Deporte. ● Ir a pescar. Tipo, Ocio. ● Ir de camping. Tipo de la actividad, Ocio. ● Trabajar. Tipo de la actividad, Profesional. ● Ir a la playa. Tipo de actividad, Ocio. ● Tomar mate en la plaza. Tipo de actividad, Ocio. ● Leer un libro.Tipo de la actividad, Ocio. ● Ver una película.Tipo de la actividad, Ocio ● Jugando un juego de mesa.Tipo de la actividad, Ocio ● Tomarse un café.Tipo de la actividad, Ocio ● Ver la television.Tipo de la actividad, Ocio ● Ir de compras.Tipo de la actividad, Ocio. ● Cocinar algo para comer luego.Tipo de la actividad, Ocio ● Caminata.Tipo de la actividad, Deporte ● Permanecer en la cama.Tipo de la actividad, Ocio ● Reunión de trabajo.Tipo de la actividad, Profesional ● Visitar a la familia.Tipo de la actividad, Ocio ● Estudiando.Tipo de la actividad, Estudio El modelo de weka (parte del perfil del usuario) se genera si el usuario tiene actividades y ya tiene más de un mes de uso de la aplicación. 3 78 7.5 Resumen En este capítulo se describieron los requerimientos de alto nivel, los cuales definieron la funcionalidad de la aplicación y las decisiones de diseño tomadas desde las de más alto nivel, entrando en decisiones más específicas del lado del servidor y del cliente. Se describió la integración con las APIs de Facebook y GCM para el login y la mensajería. Por último se presentaron los dos enfoques para la realización de recomendaciones una con y otra sin el feedback implícito del usuario de recomendaciones posteriores. Al final se describió la integración con la librería de Weka para la inclusión de técnicas de Machine Learning. 79 8 Evaluación Experimental En el Capítulo 7 se expusieron los diferentes enfoques para obtener recomendaciones basadas en contenido con técnicas de machine learning. El primer enfoque con una técnica de clasificación pura, y el segundo con una técnica de clasificación más un filtro basado en el feedback del usuario. Este capítulo se analizarán los clasificadores provistos por weka, ambas técnicas de recomendación y el resultado de las pruebas. El capítulo se encuentra organizado de la siguiente manera. En la sección 8.1 se prueban los distintos tipos de clasificadores provistos por Weka y se analizará cuál es el más conveniente para este trabajo. En la Sección 8.2 se presentan las aclaraciones a ser consideradas para analizar las estrategias de recomendación. En la Sección 8.3 se presentan los perfiles de usuario utilizados para el análisis de las técnicas de recomendación. En la sección 8.4 se realiza la comparación y análisis de los resultados para ambas técnicas de clasificación y se concluye cual se recomienda a utilizar. 8.1 Clasificadores provistos por Weka Como se mencionó con anterioridad, la biblioteca de Weka provee una serie de técnicas de clasificación con algoritmos de Machine Learning en Java. En esta sección, con los datos de entrada generados durante la primer iteración de JoyMeter (dataset generado con usuarios que utilizaron la aplicación con recomendaciones aleatorias), entrenando el clasificador con el 66% de los datos de entrada (89 instancias) y evaluando con el 33% restante, arrojaron los siguientes resultados: ● NaiveBayes: 70% accuracy, 30% error, precision avg4 (68%), recall avg5 (70%) ● SimpleLogistic 66% accuracy 33% error, precision avg (61,5%), recall avg (66%) ● DecisionTable 60% accuracy 40% error, precision avg (57%), recall avg (60%) 4 Precision average: precision media por cada atributo de clase (Ocio, Deporte, Estudio, Profesional) Recall average: recall medio por cada atributo de clase (Ocio, Deporte, Estudio, Profesional) idem accuracy 5 80 Dados los resultados de las pruebas de estos 3 algoritmos, se concluyó en la elección del algoritmo de Naive Bayes, ya que provee la mejor cantidad de instancias correctamente clasificadas. 8.2 Consideraciones Para analizar las estrategias de recomendación, se tuvieron una serie de consideraciones que se describen a continuación: ● JoyMeter realiza 3 recomendaciones diarias, una por cada momento del día (mañana, tarde y noche) para cada usuario. El usuario adicionalmente puede solicitar más recomendaciones cuando así lo desee. ● Las dos técnicas de recomendación van siendo alternadas a medida que se realizan las sugerencias de las actividades. Con este enfoque, basado en AB testing6, se busca que las técnicas de recomendación no se vean afectadas por el cansancio del usuario al utilizar la aplicación, o al menos se vean afectadas por igual. ● La técnica utilizada para la recomendación (con y sin filtro), es registrada en conjunto con la sugerencia realizada para futuro análisis. ● Se utilizó un dataset generado previamente por cada usuario (actividades realizadas), para entrenar al clasificador. ● Para la estrategia con filtrado en base al feedback del usuario. Se tomarán las sugerencias aceptadas por los usuarios previamente (sugerencias hechas con una estrategia random) Con el clasificador entrenado para cada perfil de usuario, se hizo el seguimiento de dos usuarios particulares, en el uso de JoyMeter, a fin de analizar la información obtenida anteriormente sobre la precisión teórica del clasificador en contraste con la precisión real, obtenida en base al uso de la aplicación sobre los usuarios aceptando/rechazando las sugerencias dependiendo de cada técnica y las métricas obtenidas. 6 https://en.wikipedia.org/wiki/A/B_testing 81 8.3 Perfiles de usuario anteriores a la utilización de las técnicas de recomendación Los perfiles que se encuentran en esta sección corresponden a los dos usuarios que más activos se encuentran en JoyMeter. Perfil de usuario A: El usuario A, posee un total de 82 actividades cargadas en JoyMeter al momento de realizar el análisis de los clasificadores de Weka. Los gráficos a continuación brindan la información inherente a sus preferencias que darán como resultado el perfil de dicho usuario. Figura 37: Usuario A, distribución por tipo de actividad Para este usuario, en el gráfico de torta se ve una clara tendencia de las preferencias del usuario en base al tipo de Actividad, el tipo de actividad recurrente es “Ocio”, luego lo sigue “Profesional”, “Deporte” y por último “Estudio”. 82 Figura 38: Usuario A, distribución por momento del día En cuanto a la preferencia de en cual momento del día realiza actividades están bastante equilibradas: por la mañana 43,4%, por la tarde 27,7% y por la noche 28,9%. Figura 39: Usuario A, distribución por tipo de día Las actividades de este usuario, tiene mayor tendencia a ser realizadas en un día laboral (Lunes a Viernes) que en el fín de semana. 83 Figura 40: Usuario A, distribución por nivel de satisfacción Dentro de todas las actividades que realizó, para la puntuación de satisfacción de las actividades, el usuario utilizó todo el rango provisto por JoyMeter, las puntuaciones más recurrentes fueron “Cuatro”, “Cinco” y “Tres” en ese orden. En una considerable menor medida “Uno” y “Dos” fueron utilizados en muy pocos casos. Existe una clara tendencia en este perfil, de no cargar actividades que no le son de agrado o no generan una satisfacción considerable. Perfil de usuario B: El segundo usuario a ser considerado para el experimento es el usuario B, este usuario posee más actividades cargadas que el usuario A, con total de 99 actividades. Los gráficos a continuación brindan la información que describe las preferencias del usuario. 84 Figura 41: Usuario B, distribución por tipo de actividad Según el tipo de actividad, para el usuario B, el más frecuente es “Ocio”, con el 51% de las actividades. Los tipos de “Estudio”, “Profesional” poseen el mismo porcentaje 18.4% y en último lugar se encuentra el tipo de actividad “Deporte” con un 12,2% Figura 42: Usuario B, distribución por momento del día El momento en el cual el usuario B realiza las actividades que carga en JoyMeter es por la noche (36,7%) y en menor medida por la tarde (34,7%). Por último, por la mañana con un 28,6%. 85 Figura 43: Usuario B, distribución por tipo de día Al igual que con el usuario A, el usuario B también posee una tendencia a realizar actividades los días de semana que no están comprendidos como fin de semana. Figura 44: Usuario B, distribución por nivel de satisfacción Para la puntuación de satisfacción de las actividades, el usuario B utilizó todo el rango provisto por JoyMeter, las puntuaciones “Cuatro” y “Tres” fueron las más utilizadas con un porcentaje de 26,5% y 25,5% respectivamente. Luego siguen las puntuaciones “Dos” (17,3%), Uno (16,3%) y Cinco (14,3%).En una considerable menor medida “Uno” y “Dos” fueron utilizados en muy pocos casos. Existe una clara tendencia en este perfil, de no cargar actividades que no le son de agrado o no generan una satisfacción considerable. 86 8.4 Información posterior al período de experimentación con las técnicas de recomendación Esta sección se encuentra cronológicamente ubicada, pasado un mes desde que se implementaron las técnicas de recomendación. Usuario A: Para el usuario A, luego del tiempo de prueba, se capturó la siguiente información. El total de recomendaciones realizadas fue 111. Figura 45: Usuario A, aceptación total de recomendaciones Del total de recomendaciones realizadas, un 63,1% fue aceptado y las demás fueron descartadas. Considerando solamente las sugerencias aceptadas, el gráfico de porcentaje de aceptación de cada técnica es el siguiente Figura 46: Usuario A, técnicas de recomendación aceptadas 87 La técnica que mayor aceptación tuvo fue la que posee el filtro que considera el feedback del usuario, con un total de 50,7%. En menor medida, con solo tres centésimas de diferencia se encuentra la técnica con clasificación pura. Descartando con un 1,5% correspondiente a la técnica de random realizada en la iteración anterior. Considerando las recomendaciones aceptadas, el porcentaje y el número total de actividades por tipo se puede apreciar en el siguiente gráfico. Figura 47: Usuario A, actividades aceptadas por tipo La cantidad de Actividades aceptadas por tipo, coinciden con el perfil del usuario, ya anteriormente a la fase de recomendaciones, se pudo apreciar que este tiene una clara tendencia a realizar actividades de ocio por sobre las demás. En el siguiente gráfico, se muestra la distribución de aceptación de recomendaciones, dependiendo el momento del día. Figura 48: Usuario A, actividades aceptadas por momento del día 88 Existe una tendencia a no aceptar recomendaciones por la noche. Ya que el número de aceptadas decrece considerablemente tomando en consideración los otros momentos del día, Mañana y Tarde. Utilizando la biblioteca de Weka, y extendiendo la funcionalidad que posee para probar un clasificador para ver su tasa de efectividad. Se hicieron las corridas con ambas técnicas arrojando los siguientes resultados para el usuario A Con filtro basado en feedback Deporte Profesional Estudio Ocio Deporte 1 2 2 7 Profesional 0 3 0 2 Estudio 0 0 0 0 Ocio 3 3 1 18 Tabla 3: Usuario A, matriz de confusión de estrategia con filtro. Los aciertos con esta técnica arrojaron un 52,4% de aciertos Con clasificador Deporte Profesional Estudio Ocio Deporte 3 1 0 5 Profesional 0 0 1 2 Estudio 0 0 0 0 Ocio 1 7 2 20 Tabla 4: Usuario A, matriz de confusión de estrategia de clasificación. Los aciertos con esta técnica arrojaron un 54,8% de aciertos Se realizaron dos iteraciones posteriores consecutivas a los valores obtenidos con el fin de considerar si existen cambios significativos en la efectividad de los clasificadores. Para la técnica con el filtro basado en el feedback del usuario, los valores en cada prueba resultaron: aciertos: 22/42 (52,4%), aciertos: 22/42 (52,4%), aciertos: 21/42 (50%) 89 Para la técnica con el clasificador de Weka, los valores en cada prueba resultaron: aciertos: 23/42 (54,8%), aciertos: 22/42 (52,4%), aciertos: 21/42 (50%) Usuario B: Para el usuario B, el total de recomendaciones realizadas fue 100. Figura 49: Usuario B, aceptación total de recomendaciones Del total de recomendaciones realizadas, un 53% fue aceptado y las demás fueron descartadas. Considerando solamente las sugerencias aceptadas, el gráfico de porcentaje de aceptación de cada técnica: Figura 50: Usuario B, técnicas de recomendación aceptadas 90 La técnica que mayor aceptación tuvo fue la que posee el filtro que considera el feedback del usuario, con un total de 52,8%. En menor medida, con solo seis centésimas de diferencia se encuentra la técnica con clasificación pura. Considerando las recomendaciones aceptadas, el porcentaje y el número total de actividades por tipo se puede apreciar en el siguiente gráfico. Figura 51: Usuario B, actividades aceptadas por tipo La cantidad de Actividades aceptadas por tipo, coinciden con el perfil del usuario, ya que este tiene una clara tendencia a realizar actividades de ocio por sobre las demás. En el siguiente gráfico, se muestra la distribución de aceptación de recomendaciones, dependiendo el momento del día. Figura 52: Usuario B, actividades aceptadas por momento del día 91 El usuario B, a diferencia con el usuario A, posee una distribución aproximadamente equitativa en relación a en cuál momento del día fue realizada una recomendación. Por la tarde con un 37,7%, por la noche con un 32,1% y por la mañana con un 30,2%. Al igual que con el usuario A, se hizo uso de la biblioteca de Weka para obtener tasa de efectividad. Se hicieron las corridas con ambas técnicas arrojando los siguientes resultados para el usuario B Con filtro basado en feedback Deporte Profesional Estudio Ocio Deporte 0 0 0 0 Profesional 2 7 0 0 Estudio 2 0 2 1 Ocio 4 4 6 18 Tabla 5: Usuario B, matriz de confusión de estrategia con filtro. Los aciertos con esta técnica arrojaron un 58,7% de aciertos Con clasificador Deporte Profesional Estudio Ocio Deporte 0 0 0 0 Profesional 2 5 1 2 Estudio 1 1 2 5 Ocio 5 5 5 12 Tabla 6: Usuario B, matriz de confusión de estrategia de clasificación. Los aciertos con esta técnica arrojaron un 41,3% de aciertos Se realizaron dos iteraciones posteriores a los valores obtenidos con el fin de considerar si existen cambios cambios significativos en la efectividad de los clasificadores. Para la técnica con el filtro basado en el feedback del usuario, los valores en cada prueba resultaron: aciertos: 27/46 (58,7%), aciertos: 24/46 (52%), aciertos: 25/46 (54%) 92 Para la técnica con el clasificador de Weka, los valores en cada prueba resultaron: aciertos: 19/46 (41,3%), aciertos: 20/46 (43,4%), aciertos: 19/46 (41,3%) 8.5 Comparación y análisis de resultados Luego de la fase de experimentación, con los usuarios seleccionados para el análisis, la información capturada arroja resultados positivos en ambas técnicas de recomendación. Como se dijo anteriormente, las técnicas fueron siendo alternadas a fin de evaluarlas por igual considerando el mismo período de tiempo y el mismo desgaste que el usuario puede percibir al ser recomendado tres veces al día, con sugerencias personalizadas de actividades a realizar. En este contexto se deberá analizar para futuros ciclos, el momento preferible para realizar la recomendación a cada usuario dependiendo su perfil, a fin de evitar el descarte de recomendaciones por parte del usuario. La tasa de descarte de recomendaciones fue en promedio 41,95%, para el usuario A 36,9% y para el usuario B 47%. Por muy poco margen, la técnica de recomendación con filtro basado en el feedback del usuario, posee mejor índice de aceptación. Para el usuario A 50,7%, y para el usuario B 52,8%. Si bien el margen no es significativo, en comparación con la tasa de acierto que tuvo cada estrategia utilizando la librería de Weka para obtener la aceptación de cada técnica. Por más que el usuario B tuvo menor tasa de acierto con la estrategia del filtro en comparación con la estrategia de clasificación pura, en la práctica, fue la técnica que más acepto. Es por ello que se concluye con el muestreo de usuarios realizado, en el período comprendido, que la técnica con el filtro basado en el feedback del usuario es la técnica ha de ser considerada para futuros trabajos. 8.6 Resumen En este capítulo se analizó a través de experimentación y tasa de acierto, cuál es el clasificador más conveniente para este trabajo de los que provee la biblioteca de Weka. Se recabó la información de los perfiles de usuario antes de la fase de experimentación para una vez concluida, analizar los resultados entre cada estrategia y dar como conclusión cuál es la estrategia más conveniente. 93 9 Conclusiones Como se vio en capítulos precedentes, JoyMeter es un agente de recomendaciones de actividades personales, que basa sus predicciones en una técnica de recomendaciones basadas en contenido con el objetivo de obtener recomendaciones de actividades de manera personalizada de acuerdo a las preferencias de cada usuario. La implementación de los dos algoritmos de recomendación propuestos requiere de dos componentes distintos en el perfil de usuario. El primer componente consta de un conjunto de actividades personales previstas por el usuario. Y el segundo componente consta del feedback indirecto previsto por el usuario al aceptar o rechazar una actividad sugerida. Esta información es utilizada por el algoritmo de recomendación con filtro para priorizar aquellas actividades que han sido del agrado del usuario en el pasado. Ambos algoritmos de recomendación utilizan un clasificador provisto por Weka para la predicción de actividades a sugerir. La evaluación de la propuesta se realizó en dos etapas. En la primera etapa, se utilizaron los datos obtenidos de actividades cargadas por un conjunto de usuarios junto con sugerencias realizadas por una heurística de selección aleatoria de actividades. Con estos datos se obtuvieron métricas sobre las actividades cargadas por cada usuarios y se realizaron pruebas de precisión a los algoritmos de clasificación provistos por la biblioteca Weka. Entre los clasificadores con los cuales se experimentó se optó por el clasificador de redes de Bayes, Naive Bayes, ya que fue el que obtuvo mejor desempeño. En una segunda etapa, llevada a cabo luego de la interacción de los usuarios con el sistema de recomendaciones, se evaluó la efectividad de ambas estrategias de recomendación sobre una muestra de usuarios y se obtuvieron métricas de los niveles de aceptación sobre las recomendaciones realizadas con ambas estrategias. Los resultados obtenidos muestran que ambas técnicas de recomendación tuvieron aproximadamente el mismo grado de aceptación, obteniendo en promedio una diferencia porcentual que se inclina al clasificador con filtro. Adicionalmente, dicha decisión fue reafirmada al comparar ambas técnicas de clasificación para un perfil de usuario donde la técnica con clasificación pura arrojaba mayores aciertos, pero en la práctica, el porcentaje de aceptación fue superior con la estrategia de recomendación con filtro basado en el feedback implícito. 94 9.1 Ventajas A continuación se listan las principales ventajas del desarrollo propuesto en el presente trabajo: ● Recomendaciones personalizadas mediante métodos no invasivos: Ambos enfoques personalizan las recomendaciones individuales construyendo los perfiles desde la interacción con JoyMeter, aprendiendo del comportamiento de los usuarios individuales. ● Provisión de una técnica interactiva: En ambos enfoques, la concepción de los perfiles de usuarios no es estática sino que se actualiza de acuerdo a una determinada periodicidad. Esta característica permite que las recomendaciones se realicen sobre las preferencias y gustos actuales de un usuario. ● Transparencia al cambio de estrategias: El cambio de estrategia de recomendación, permite obtener métricas de la efectividad de las mismas sin afectar a la percepción del usuario en cuanto al uso de la herramienta ● Uso de un dispositivo móvil: Las personas disponen hoy día sus dispositivos móviles a su alcance en cada momento. Como JoyMeter se basa en la captura de actividades por parte del usuario. Fué imprescindible que JoyMeter haya sido realizado para dispositivos móviles para estar siempre al alcance de la mano del usuario. ● Integración con Facebook: La integración de JoyMeter con Facebook es un punto positivo ya que existen usuario que hacen uso constante de esta famosa red social para contar su jornada. JoyMeter brinda la posibilidad que el usuario comparta en Facebook la actividad que está realizando, fomentando indirectamente el uso de JoyMeter. ● Decisiones de Diseño: JoyMeter se encuentra íntegramente desarrollado en Java, con frameworks y estructuras extensibles para poder agregar o modificar componentes sin que impacten en todo el diseño. Por ejemplo, algunas de las funcionalidades extensibles son: probar distintas técnicas de recomendación significa extender la funcionalidad base definida de un solo componente; o cambiar la estrategia por la cual se calcula subjetivamente la felicidad que el usuario posee significa extender la funcionalidad del componente LevelOfJoyService y definir su nueva lógica. 95 9.2 Limitaciones Dado que JoyMeter es aún un prototipo, su implementación posee limitaciones, algunas de las cuales se mencionan a continuación: ● Evaluaciones particulares: El número de usuarios que se utilizó en el sistema no fue lo suficientemente grande todavía, como para una evaluación más real de las técnicas de recomendación utilizando métodos o métricas tradicionales. ● Evaluaciones parciales: La captura de datos se realizó durante un período limitado. Es necesario todavía monitorizar las actividades durante un periodo más amplio, en el cual contemplar un mayor aprendizaje del agente, comprobando como el recomendador evoluciona su comportamiento en el tiempo. ● Formato limitado: El recomendador se encuentra acoplado al formato de las actividades, el cual fijo. Si pudiera desacoplarse a través del uso de palabras claves (como es planteado en la sección próxima, trabajos futuros), el recomendador lograría autonomía en su definición para el aprendizaje. 9.3 Trabajos Futuros En base a las experiencias con JoyMeter, posibles extensiones del enfoque son: ● La priorización de actividades (por ej., de la más reciente sobre la más antigua), para mejorar el filtrado, evitando recomendar aquellas actividades que dejaron de ser del agrado del usuario. ● Adecuar el agente, de manera que actúe de manera más “proactiva”, de manera que en base al nivel felicidad (nivel del día/histórico) decida sugerir (sin intervención del usuario) una actividad que le genere un nivel de satisfacción dado que ayude a subir su nivel de felicidad. Por ejemplo, si el nivel de felicidad viene decreciendo, y llega a una cota/nivel crítico, el agente podría enviar una sugerencia al usuario de una actividad a recomendar. ● Incluir recordatorios periódicos y amigables para incentivar el registro de las actividades que está realizando el usuario. ● Recomendaciones colaborativa a través de la integración con Facebook, observando las actividades que realizan los círculos de amigos de Facebook que también utilizan JoyMeter. ● Recomendación de actividades basada en la captura de palabras claves en la descripción de la actividad y no en un tipo predefinido. Por ejemplo, en vez de crear 96 una actividad que tenga el tipo deporte y en descripción “jugar a la pelota”. El usuario responderá la simple pregunta de “qué estás haciendo?” y de esa oración a través de técnicas de data-mining se podrá saber qué tipo de actividad está realizando y con qué criterio se tendrá en cuenta para realizar una recomendación. 97 Apéndice Apéndice A: Escalas de felicidad 1. Escalera de felicidad de Gallup: Propone valorar la felicidad en base a la metáfora de una escalera con escalones numerados, donde el escalón de más alto (valor 10) representa la mejor vida posible y el más bajo la peor vida posible. El individuo debe responder a la pregunta ¿en qué peldaño de la escalera siente que se encuentra actualmente? 2. Escala de satisfacción con la vida de Diener: Propone 5 afirmaciones sobre la satisfacción del individuo con respecto a su vida y sus logros, el individuo debe responder el nivel de adhesión con respecto a cada afirmación, con valores entre 1 y 7, donde 7 significa “Totalmente de acuerdo” y 1 significa “Totalmente en desacuerdo” 3. Escala de la felicidad subjetiva de Lyubomirsky: Propone 4 preguntas con respecto al nivel de felicidad general del individuo, a las cuales se debe responder entre 7 valores los cuales van desde “Poco Feliz” hasta “Muy Feliz”. 4. Satisfacción en áreas específicas: Se propone calificar el nivel de satisfacción con respecto a 7 áreas específicas, como salud, situación económica y amistades, calificando entre 10 posibles valores, donde 1 corresponde a completamente insatisfecho y 10 a completamente satisfecho. 5. Reconstrucción del día: En este método las personas reconstruyen su día previo, con un cuestionario autoadministrado. Por ejemplo, la encuesta propuesta por Kahneman et al. (2004) se divide en cuatro módulos. El primer módulo incluye las preguntas mínimas para medir la felicidad, pero agrega preguntas por estados de ánimo. El segundo módulo pide reconstruir el día de ayer como si escribiera un diario de vida: ¿dónde estaba?, ¿qué hizo y experimentó? y ¿cómo se sintió? Estas preguntas permiten que el entrevistado recuerde las actividades realizadas, horas de inicio y término, y el grado de satisfacción personal asociado a ellas. El tercer módulo profundiza en la descripción y sentimientos asociados a cada episodio del día anterior. El cuarto módulo incluye preguntas generales sobre cómo fue el día de ayer, cómo se sintió el entrevistado y cómo lo percibe que lo vio el resto. 6. Escala de Fredrickson: Propone veinte adjetivos que describen cada emoción a niveles de intensidad diferente con una escala de 5 grados de intensidad. Para computar una razón o ratio de positividad, el individuo debe indicar en qué nivel ha experimentado (usando una escala de 0 a 4 donde 0 es nada y 4 es mucho) cada una de las veinte emociones. Se debe contar con un uno todas las emociones positivas en el que hayas contestado un nivel de intensidad 98 igual o mayor de 2. Contar con un uno todas las emociones negativas en el que hayas contestado hayas contestado un nivel de intensidad igual o mayor a 1. y finalmente dividir el total de emociones positivas por el de negativas (o por 1 en caso de ausencia de emociones negativas). Apéndice B: Tecnologías utilizadas en el Servidor de JoyMeter Para la implementación del servidor, se optó por la tecnología JEE, utilizando el framework Spring, el cual simplifica y facilita el desarrollo de aplicaciones web (entre otras), junto con Jersey para exponer los distintos endpoints y JPA/Hibernate para la persistencia de datos. Entre las ventajas de utilizar JEE, Spring y Jersey frameworks: ● Se consiguen plataformas para el despliegue en la nube sin costo ● Spring ofrece una amplia gama de soluciones para facilitar y agilizar el desarrollo de servicios web. ● Spring IoC containers e inyección de dependencias, facilitan el desarrollo y delega la creación de objetos a el framework ● Jersey facilita el desarrollo de servicios web Restful, permitiendo exponer los servicios con gran variedad de representaciones de datos (media types) ● Jersey ofrece su propia API que se extienden al conjunto de herramientas JAX-RS con las características y utilidades adicionales para simplificar aún más el servicio REST y desarrollo de clientes El uso de Hibernate/JPA: El desarrollo es más productivo, el ORM ayudará a disminuir el tiempo requerido para la implementación de una aplicación de forma exponencial, al eliminar la necesidad de profundizar en la codificación de mecanismo de mapeo objeto/relacional. Bien diseñado: ORM es un patrón de un diseño arquitectónico efectivo, ya fue implementado y bien probado durante un período de tiempo. No tenemos que gastar nuestro tiempo para hacer de nuevo algo que ya está hecho, probado y utilizado por muchos años. Hibernate es independiente del motor de base de datos Ya que Hibernate es Orientado a objetos, la curva de aprendizaje es mucho más corta. 99 Estructura del servidor Una aplicación de servicios web estándar desarrollada con spring se encuentra estructurada en capas, es por eso que el servidor de JoyMeter se encuentra dividido en una arquitectura por capas. La arquitectura basada en capas tiene se enfoca en la distribución de roles lo cual facilita la distribución de responsabilidades y un fácil mantenimiento, ya que en caso que sobrevenga algún cambio, solo se atacará el nivel requerido sin tener que involucrar a las demás capas. En ambientes colaborativos, permite distribuir el trabajo por niveles. De este modo, cada grupo de trabajo estará totalmente abstraído del resto de los niveles, solo bastará conocer la API que existe entre niveles. Spring ofrece gran número de soluciones siguiendo este patrón, invitando a extender/implementar sus interfaces y hacer uso de las mismas. Manejo de excepciones Adicionalmente, el server cuenta con un componente que opera de manera transversal a las 3 capas, este componente es el ExceptionHandler, propio del framework Jersey. Este componente es el encargado de manejar las excepciones de la aplicación para retornar una respuesta http valida, con su status code correspondiente. Por ejemplo, en la capa de presentación, nos podemos topar en tiempo de ejecución con un request mal formado, por lo que se lanzara una excepcion JoymeterBadRequestException la cual por 100 extender de WebApplicationException será manejada por el exception handler de Jersey, generando una respuesta con status code 400 (Bad Request). Las excepciones correspondientes serán descritas con un mayor nivel de detalle en la capa de presentación, por cada llamado a la api. Capa Resource - Capa de presentación La capa Resource, expone los recursos que el servidor de JoyMeter brinda a sus clientes. Para lograr este objetivo, el servidor utiliza http como protocolo de comunicación a través de una API de servicios REST. Se optó por utilizar Jersey ya que es la API oficial de RESTful de Oracle. Un Sistema RESTful ofrece beneficios adicionales como el desacoplamiento, permitiendo un sistema altamente escalable.Se puede escalar muy ampliamente mediante la adición de nodos de servidor adicionales con un balanceador de carga. Al poseer una interfaz uniforme beneficia que no debamos documentar por cada recurso, las operaciones básicas de la API. Cada recurso se expone a través de una URI con los cuatro métodos (GET, POST, UPDATE, DELETE) para referirse a nuestros recursos, lo que asegura que cualquier herramienta que pueda trabajar con HTTP (de los cuales hay muchas) puedan comunicarse con nuestro servidor. Cuando se hace correctamente, esto significa que el cliente no necesita comprender nada más que el formato de datos. En particular, no es necesario entender la estructura URI del servidor. Idealmente, una API REST será consumida por un conjunto de clientes, que comprendan los formatos de datos (que hablen el mismo idioma). 101 JoyMeter, expone tres apis para la interacción con los clientes. Estos son: SessionResource: ● Método POST ({joymeter.uri}/sessions) para atender la solicitud de alta de un usuario, con la información necesaria para identificar al mismo y el dispositivo con el cual se registró. En respuesta a esta solicitud, se retornará la credencial que identifica al usuario con el dispositivo, la cual deberá ser utilizada para posteriores consultas al servidor. UserResource: ● Método GET ({joymeter.uri}/users/me) para atender la solicitud de obtener la información de un usuario. ● Método PUT ({joymeter.uri}/users/me) para atender la solicitud de actualizar la información de un usuario. ● Método GET ({joymeter.uri}/users/me/loj) para atender la solicitud de obtener el historial de nivel de felicidad de un usuario en el transcurso de n días. ● Método GET ({joymeter.uri}/users/me/suggest) para atender la solicitud de un usuario que desea que se le sugiera una actividad a realizar. La representación gráfica de resftulObjects de los resource Session y User quedaría de la siguiente manera: ActivityResource: ● Método GET ({joymeter.uri}/activities) para atender la solicitud de obtener todas las actividades realizadas por el usuario en cuestión. 102 ● Metodo POST ({joymeter.uri}/activities) para atender la solicitud de agregar una nueva actividad para un usuario determinado. ● Método GET ({joymeter.uri}/activities/{id}) para atender la solicitud de obtener en detalle una actividad en particular (identificada por su id). ● Método PUT ({joymeter.uri}/activities/{id}) para atender la solicitud de actualizar la información de una actividad en particular (identificada por su id). ● Método DELETE ({joymeter.uri}/activities/{id}) para atender la solicitud de borrar una determinada actividad (identificada por su id). ● Método POST ({joymeter.uri}/activities/syncup) para atender la solicitud proveniente del cliente para actualizar el servidor con los últimas actividades del usuario (cuando el cliente no puede conectarse con el servidor por problemas externos a la aplicación, el cliente guarda temporalmente estos cambios y la informa al servidor una vez establecida nuevamente la conexión). La representación gráfica de ActivityResource se muestra a continuación: A continuación se presenta las posibles respuestas de error propias de JoyMeter por cada operacion en la API: Resource Operation Descripcio n de la operación Caso de error HTTP Status code Excepción que dispara el error Joymeter error code 103 sessions activities POST signUp de usuario Token de facebook invalido 400 - Bad request JoymeterBadReques tException 100 Token de facebook vencido 400 - Bad request JoymeterBadReques tException 101 GET Obtiene el listado de todas las actividades del usuario autenticado N/A N/A N/A N/A POST Agrega una actividad al usuario autenticado N/A N/A N/A N/A GET Obtiene la actividad con identificado r <id> de la actividad Identificador de actividad inválido 400 - Bad request JoymeterBadReques tException 102 El usuario autenticado no tiene permisos para acceder a la actividad de identificador <id> 401 Unauthori zed JoymeterUnauthoriz edException 99 Elimina la actividad con identificado r <id> de la actividad Identificador de actividad inválido 400 - Bad request JoymeterBadReques tException 102 El usuario autenticado no tiene permisos para acceder a la actividad de identificador <id> 401 Unauthori zed JoymeterUnauthoriz edException 99 Modifica la actividad con identificado r <id> de la actividad Identificador de actividad inválido 400 - Bad request JoymeterBadReques tException 102 El usuario autenticado no tiene permisos para acceder a la actividad de identificador <id> 401 Unauthori zed JoymeterUnauthoriz edException 99 GET Obtiene la representac ión del usuario autenticado N/A N/A N/A N/A PUT Modifica los datos del usuario autenticado N/A N/A N/A N/A users/me/s uggest GET Sugiere una actividad al usuario autenticado N/A N/A N/A N/A users/me/l oj GET Obtiene el histórico de nivel de felicidad para el usuario autenticado N/A N/A N/A N/A activities/{i d} DELETE PUT users/me 104 Adicionalmente todas las operaciones son interceptadas por JoymeterSecurityInterctor (cuyas responsabilidades son descritas en la sesión) quien valida a partir de las credenciales previstas si es un usuario previamente autenticado. Los errores derivados de esta validación se describen en la siguiente tabla: Caso de error HTTP Status code Excepción que dispara el error Joymeter error code No se pasan las credenciales en el request 401 Unauthorized JoymeterUnauthorizedEx ception 99 Token de sesión inválido 400 - Bad request JoymeterInvalidSessionE xception 98 Seguridad en la capa de presentación: Para asegurar el acceso de clientes autenticados a los distintos recursos expuestos, y asegurar que únicamente el cliente autenticado y autorizado para un usuario dado puede acceder únicamente a los recursos de ese usuario. HTTP Basic es el mecanismo de seguridad elegido para proteger el server de llamados no autorizados. Como HTTP no posee estado, hay que enviar las credenciales en cada petición. Las credenciales son incluidas agregando un header del tipo Authorization, con el formato Authorization: Bearer {joymeterSessionId}. Siendo joymeterSessionId la credencial que identifica a un usuario utilizando un dispositivo en la aplicación. Si se intenta acceder a un recurso protegido sin la cabecera Authorization, el servidor responde con un status 400 Bad request y la descripción del error en formato JSON. A favor y en contra del HTTP Basic: ● A favor: 105 ● ○ Estándar HTTP, funciona out-of-the-box. ○ Es RESTfull, no obliga a mantener estado en el servidor. En contra: ○ La credencial del usuario se transmite sin cifrar. Para solucionar el punto que posee en contra, se utilizará HTTPs para el cifrado de cada solicitud. De esta manera se protegerá la información sensible de JoyMeter. El único método que no se encuentra protegido es el que atiende la solicitud de alta de un usuario. Ya que claro está, no existe al momento del llamado, las credenciales del usuario en cuestión. Capa Service - Capa de lógica Es la capa que a partir de una petición de la capa de presentación, se encarga de la lógica de negocio de la aplicación, y de la comunicación con la capa de Repository para la persistencia de los datos. La capa service, puede hacer uso de otros componentes del mismo nivel para llevar a cabo su tarea. Aquí, se encuentran validación y verificaciones relacionadas a la lógica del negocio, cálculos, manipulación de datos, y como ya se mencionó, el acceso y persistencia de los datos a través de la capa repository. JoyMeter Server tiene en su capa de lógica los siguientes servicios: ● UserService ● ActivityService ● SessionService ● NotificationService ● RecomendationService ● LevelOfJoyService User service: User service es el encargado de toda la lógica relacionada a las acciones que se pueden hacer para un usuario, como actualizar un usuario, obtener una actividad sugerida para ese usuario o obtener el Level of Joy histórico del usuario. Este servicio, se sirve de otros servicios como NotificationService, LevelOfJoyService y RecomendationService para completar la funcionalidad de cada método. Asi como también hace uso del repositorio UserRepository para persistir los datos del usuario una vez completadas con las acciones de cada método. 106 Activity service: Se ocupa de la lógica relacionada a las actividades de un usuario como: obtener una actividad en base a su identificador, agregar una nueva actividad de un usuario, borrar una actividad y actualizar una actividad. Este servicio hace uso del LevelOfJoyService ,para actualizar los niveles de felicidad en base a los cambios en las actividades. El nivel de felicidad de un día dado, se calcula en base a la totalidad de las actividades de ese día, la satisfacción alcanzada por cada una de estas y el nivel del día anterior. Es por esta razón que cada nueva actividad, cada actualización o eliminación, afecta al cálculo del nivel cada día. Adicionalmente, activity service hace uso del ActivityRepository, para persistir las actividades y sus cambios. Session service: Es responsable de la lógica de autenticación y generación de sesiones. Este servicio, tiene un solo método signUp, el cual se comunica con la API de facebook usando el token del usuario, valida el mismo contra facebook, si este no es un usuario válido de facebook retorna una excepción, la cual será manejada posteriormente por un exception handler de jersey y devuelta como un error Bad Request. Si el usuario es un usuario de facebook, y el token no ha expirado, en base a el email que nos retorna facebook, se valida si el usuario es un usuario de JoyMeter y se genera una session para el mismo, caso contrario, se crea un usuario de joymeter y se genera la session para este. Para lograr la comunicacion con facebook, se usa el modulo de spring “Spring Social”. Para la persistencia de las sesiones se usa el SessionRepository, mientras que la validación de la existencia del usuario y la persistencia de un nuevo usuario se hacen a través de UserRepository. Notification service: Es el encargado de la lógica para notificar al usuario sobre una actividad sugerida. Este servicio sigue el patrón strategy, facilitando la implementación de distintas estrategias para la notificación de actividades. Para poder enviar notificaciones a los clientes, el servidor debe ser dado de alta en al API de GCM de google. Google provee una clave para al Servidor, de esta manera se reconoce que 3rd party server está haciendo cuál llamado. 107 Dentro de llamado deberá incluirse a quien será dirigido el mensaje (en el campo “to” , irá el GCM Token id del cliente cuando se registró a la api) y en “data” puede ir cualquier objeto en formato JSON, este será el mensaje en sí. { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "data" : { ... }, } Para enviar el mensaje, la implementación actual, utiliza el default client de Jersey para hacer un llamado post, con la información necesaria para ejecutar el envío de mensaje satisfactoriamente. Este servicio es utilizado, por el servicio UserService. 108 Recommendation service: Es el servicio encargado de elegir una actividad para sugerir a un usuario. Este servicio sigue el patrón strategy, permitiendo implementar nuevas estrategias para la elección de la actividad a recomendar. Hoy se ofrece una implementación simple, la cual toma las dos estrategias de recomendación mencionadas en el capítulo 7 - enfoque. Este servicio es utilizado, por el servicio UserService. Level of Joy service: Es el responsable de mantener el cálculo del nivel de felicidad histórico. El nivel de felicidad se actualiza para cada día, en cada cambio en las actividades del usuario, ya sea una nueva actividad, una actividad que se elimina o una que se actualiza. Es importante re calcular los niveles de satisfacción históricos en cada cambio de actividad porque el nivel de felicidad de un día dado se calcula en base al nivel del día anterior, aplicando un factor de decaimiento, y aplicando el nivel obtenido de las actividades del dia: F (t) = F (t−1) × d + A(t) F: función nivel de satisfacción en el día t D: factor de decaimiento A: función nivel de satisfacción promedio en actividades del día t El servicio Level Of Joy, sigue el patrón template method, permitiendo implementar distintas alternativas para el cálculo de la función A y el factor de decaimiento d Por defecto, el cálculo se hace sacando el promedio del nivel de felicidad de las actividades del día, y se aplica como factor de decaimiento el valor 0.99 109 LevelOfJoyService hace uso de ActivityRepository para obtener la información de las actividades, y del LevelOfJoyRepository para persistir los cálculos de los niveles de felicidad históricos, como para obtener el historial y ser retornado en el método getLastEntriesByUser. Capa Repository - Capa de persistencia La capa repository, es la capa encargada de persistir los datos, y obtener los datos de forma transparente a la capa superior (capa de servicio). Esta capa sigue el patrón de strategy, permitiendo la implementación de distintas alternativas para la persistencia de datos sin afectar a la capa superior, abstrayendo y encapsulando la implementación de la persistencia, de esta manera, podemos persistir ya sea en una base de datos relacional, por medio de un ORM como Hibernate, o consumiendo un servicio REST externo, sin necesidad de modificar los llamados hechos en la capa de servicio. 110 Se eligió persistir los datos en una una bd relacional, MySQL. Donde se guardarán el perfil de los usuarios, las actividades que el usuario va realizando, así como también el historial de felicidad del usuario y las sugerencias. La persistencia, como se mencionó anteriormente se realiza utilizando la implementación JPA de Hibernate. Por ejemplo para el caso del UserRepository, el cual es utilizado por los servicios SessionService y UserService. La interfaz UserRepository, define todos los métodos para obtener la información del usuario y para persistir los cambios del mismo. La implementación actual, implementa estos métodos definidos en la interfaz por medio de JPA/Hibernate. Contamos con cinco repositorios: ● ActivityRepository 111 ● ● ● ● AdviceRepository LevelOfJoyRepository SessionRepository UserRepository Cada uno encargado del acceso a datos de una entidad determinada, estas entidades hoy se encuentran mapeadas uno a uno con una tabla de la base de datos, las tablas son: Apéndice C: Tecnologías utilizadas en el Cliente de JoyMeter ● Facebook SDK: El SDK de facebook para Android, integra cualquier aplicación Android que se desarrolle con la famosa red social. Luego de la integración, se podrá hacer inicio de sesión, compartir contenido, enviar mensajes, invitaciones a la aplicación, etc. Para más información https://developers.facebook.com/docs/android/ ● GCM (Google Cloud Messaging): es el servicio gratuito de google para enviar mensajes en varias plataformas, como Android, iOS y Chrome. Por ejemplo, un servidor puede enviar mensajes directamente a dispositivos individuales, grupos de dispositivos o dispositivos suscritos a temas. Además, la aplicación en un dispositivo 112 puede enviar mensajes directamente a un servidor y a los dispositivos que pertenecen al mismo grupo. Para más información https://cloud.google.com/ ● Otto: Otto es un proyecto de código abierto diseñado para implementar un bus de eventos, donde los componentes pueden publicar y suscribirse a eventos de su interés. Utilizando Otto se logra desacoplar las diferentes partes de la aplicación al mismo tiempo que les permite comunicarse de manera eficiente. Otto hace uso solamente de 2 métodos. Lo cual lo hace muy simple para manejar. El método register acepta por parámetro un componente el cual desea registrarse al bus de eventos. (en este caso this es un componente visual). A través de la anotación @Subscribe, se definen en el componente que se subscribió, los métodos que se ejecutarán en caso de que un evento de su interés sea ejecutado. Cuando un evento se dispare con el DTO que el componente interesado define en su clase, se atenderá el evento disparado. Por último, el componente que desee disparar este evento en el Bus, deberá hacerlo con el método post de la siguiente manera Para más información http://square.github.io/otto/ ● Retrofit: Retrofit es el HTTP client creado para Android por square. Retrofit convierte una HTTP API en una interfaz de Java. 113 En este ejemplo puede verse la declaración de la interfaz GitHubService, con un método listRepost() el cual arriba de la declaración del método, tiene una anotación que dicho método se refiere a un llamado GET al path “users/{user}/repos” donde {user} es un Path param en la url, definido tanto en la anotación, como en el método. La clase Retrofit genera la implementación de la interface GitHubService Cada llamada a los métodos creados en la interfaz, podrán ser sincrónicos (busy waiting) o asincrónicos (definiendo un callback). En nuestro caso hacemos uso de los llamados asincrónicos, justamente para evitar una espera ocupada y lograr así, una aplicación más fluida a vista del usuario. ● GreenDao: greenDAO es una biblioteca de código abierto para Android que proporciona una interfaz fácil de usar para bases de datos SQLite para ayudar a los desarrolladores a manejar datos de manera eficiente mediante mapeo de objetos Java a tablas de la base (a menudo llamadas ORM). De esta manera se puede almacenar, actualizar, eliminar y realizar queries para los objetos Java usando una API orientada a objetos simples. Para poder utilizar greenDAO en cualquier proyecto Android, es necesario crear un proyecto secundario, el cual generará el código específico para el proyecto que se está trabajando en cuestión (creando las respectivas entidades con las relaciones y restricciones pertinentes). Esta funcionalidad se desacopló del uso de la base, en relación a la construcción de la misma, por cuestiones de practicidad, modelamiento y performance. 114 Para más información http://greenrobot.org/greendao/documentation/introduction/ ● MPAndroidChart: es una librería para desplegar todo tipo de gráficos en aplicaciones Android, estos pueden ser gráficos de linea, de barra horizontales o verticales, gráficos de torta, gráficos de vela, gráficos de burbuja, gráficos del tipo radar, etc. Todos customizables y con la posibilidad de adaptarlos a la interfaz visual de cualquier aplicación android. Solamente bastará indicar el tipo de gráfico, los índices, la escala y el contenedor visual donde se desplegará. Para más información https://github.com/PhilJay/MPAndroidChart Autenticación con JoyMeter (Login) Al estar JoyMeter integrado con Facebook, el usuario que desee utilizar la aplicación por primera vez se encontrará con una página de Login, que le informará los términos y condiciones de la aplicación, así como también los permisos necesarios para integrarse con Facebook. El usuario se autenticará con las credenciales de facebook. Y posteriormente pasará a estar registrado en JoyMeter. Hay dos modos de implementar el inicio de sesión con Facebook en Android: ● Clase LoginButton: proporciona un botón que puedes agregar a tu interfaz de usuario. Sigue el token de acceso actual y tiene la capacidad de iniciar y cerrar sesiones. ● Clase LoginManager: permite comenzar inicios de sesión sin usar ningún elemento de la interfaz de usuario. 115 JoyMeter, hace uso del botón de Login en la pantalla inicial. Para que el botón sea visible al usuario solamente bastará asociar al layout de la pantalla de Login la clase correspondiente al Botón de Facebook, y una acción al ser seleccionado por el usuario (FacebookCallback). En esta porción del código se puede apreciar que al botón “loginBtn” se le registra un callback del tipo FacebookCallback<LoginResult>. Se creará una clase anónima con dicha interfaz y se definirán los métodos “onSuccess”, “onCancel” y “OnError” para cada resultado respectivamente. Para identificar cada dispositivo Android que es usado para utilizar JoyMeter debemos incluir el alta del dispositivo en GCM, en el proceso de registración del usuario que ya poseíamos con facebook. El flow completo para el login del usuario sería: 116 JActivityService - Presentador de Actividades Puede considerarse la capa de lógica que involucra todas las operaciones que pueden llegar a realizarse con las actividades del usuario (crear, modificar, consultar, eliminar), teniendo en cuenta la interacción con la base de datos local del cliente y la actualización con el server, cuando así se requiera. Veamos cada caso particularmente. ● Obtener las actividades correspondientes al usuario ○ Obtener las actividades de la base local ○ En caso que no exista ninguna solicitarlas al servidor ○ Al obtener la respuesta del servidor actualizar la base local ○ Disparar un evento con las actividades del usuario Diagrama flujo - obtener localmente las actividades realizadas 117 Diagrama flujo - solicitar las actividades al servidor ya que localmente no existen ● Agregar una actividad nueva. ○ Agregar la actividad en la base local ○ Llamar al servidor para agregar la actividad en el servidor. ○ En caso de no haber conexión o falla de conexión con el servidor, se guardará localmente la acción para sincronizar el servidor posteriormente. Diagrama de flujo - agregar una actividad local y en el servidor Diagrama de flujo - servidor inaccesible, se guardará la acción para sincronizar luego 118 ● Actualizar una actividad existente ○ Actualizar la actividad en la base local ○ Llamar al servidor para actualizar en el servidor la actividad modificada. ○ En caso de no haber conexión o falla de conexión con el servidor, se guardará localmente la acción para sincronizar el servidor posteriormente. ○ Disparar un evento con la actividad actualizada. Diagrama de flujo - actualizar una actividad local y en el servidor Como puede verse en el diagrama, si existe conexión a internet se envía la información al servidor de JoyMeter para actualizar la actividad. En caso de que el resultado del llamado al servidor sea un success, como ya se encuentra en la base local, no se realiza ninguna acción. En caso de que el servidor nos retorne un error. Se guardará la acción, para actualizar el server más tarde. En caso de que no haya conexión a internet. El flujo sería el siguiente Diagrama de flujo - servidor inaccesible, se guardará la acción para sincronizar luego En caso de que el connectivityHelper retorne que no existe conección a internet. Se procederá a guardar temporalmente la acción para sincronizar con el servidor cuando la conexión se re-establezca. ● Eliminar una actividad existente. 119 ○ ○ ○ ○ Eliminar la actividad en la base local. Llamar al servidor para eliminar la actividad en el servidor. En caso de no haber conexión o falla de conexión con el servidor, se guardará localmente la acción para sincronizar el servidor posteriormente. Disparar un evento con la actividad eliminada. Al igual que en el flujo de actualizar una actividad, la respuesta satisfactoria del server se desestima, ya que localmente se eliminó. En caso que el servidor de JoyMeter retorne un error. Se procederá a guardar la acción correctora para cuando se restablezca la conexión. ● Sincronizar información con el servidor ○ Para enviar la información necesaria para sincronizar la información del cliente al servidor, hay que tener unas consideraciones necesarias. Ya que el usuario puede estar interactuando con el celular, creando, eliminando y modificando actividades, que luego deberán o no, -depende de la acción que se realizó- ser informada al servidor. Por ejemplo, si mientras el usuario no posee conexión a internet crea una nueva actividad y luego la modifica. Al servidor habrá que enviarle solamente el alta de una nueva actividad con los valores de la actualización. También existe el caso en que primero cree una actividad, luego la modifique, y al final la elimine. En ese caso, no habrá que enviar información alguna de dicha actividad al servidor. El payload para la api de sincronización corresponde al formato: 120 Donde syncupActionMethod podrá ser “SAVE”, “UPDATE” o “DELETE” y activity es toda la información contenida de la actividad. Cuando el endpoint de syncup responde con un SUCCESS, confirmando que la base de datos del server se actualizó correctamente, se procede a eliminar toda la información temporal del celular. Compartir con Facebook El código necesario para publicar una actividad recién realizada se encuentra centralizado en el siguiente método: Si el usuario seleccionó compartir en facebook la actividad, ya sea creada o actualizada recientemente. Se inicializa el SDK de facebook, se crea el callbackManager, y el contenido ShareContent de facebook a compartir. 121 Se creó la clase ShareUtils, para centralizar y simplificar la lógica para crear el contenido a compartir en facebook, a través de la actividad pasada por parámetro. Con el método show, se desplegará la ventana de facebook para compartir el contenido, permitiendo al usuario la opción de etiquetar personas, indicar en qué ubicación está realizando la actividad. Así como también escribir un comentario personalizado en base a la publicación Apéndice D: Manual de usuario Pantalla inicial/principal de JoyMeter Una vez que el usuario se haya autenticado a través de facebook, se accede a la pantalla de inicio. En la misma se encuentran el listado de las últimas actividades, el botón se utiliza para crear nuevas actividades y un botón para poder acceder al gráfico de satisfacción de los últimos días. 122 Cómo agregar una nueva actividad Para cargar una nueva actividad, se debe presionar el botón , se abrirá un formulario de carga, en el cual se podrá cargar: ● El título de la nueva actividad ● El tipo de actividad (Trabajo, Entretenimiento, Recreación, Descanso, etc) ● La descripción de la actividad ● El nivel de satisfacción (de 1 a 5, representado con estrellas) ● Fecha y hora de inicio de la actividad ● Duración de la actividad ● Si se desea compartir esta actividad en Facebook Una vez cargados estos campos, se debe presionar el botón ubicado en la esquina superior derecha para confirmar la creación de la actividad. Una vez guardada la actividad se retorna a la pantalla principal. En caso que el usuario seleccione que desea compartir la actividad en Facebook, antes de retornar a la pantalla principal se abrirá una pantalla de facebook para publicar en la red social la actividad que está realizando el usuario. La misma tendrá una descripción pre-cargada. El usuario podrá modificar/agregar el detalle de lo que va a publicar cómo agregar una imagen a la misma publicación, como así también etiquetar amigos, mostrar dónde se encuentra. 123 Cómo editar una actividad En la pantalla principal de JoyMeter se listan las actividades más recientes del usuario, manteniendo presionada la actividad deseada, se despliega un menú con las opciones Editar y Eliminar. Si se selecciona la opción Editar, se abrirá la página con un formulario con los mismos campos que el formulario de carga, con los valores de la actividad precargados: ● El título de la actividad ● El tipo de actividad ● La descripción de la actividad ● El nivel de satisfacción ● Fecha y hora de inicio de la actividad ● Duración de la actividad ● Si se desea compartir esta actividad en Facebook Una vez actualizados los campos deseados, se debe presionar el botón ubicado en la esquina superior derecha. Una vez guardada la actividad actualizada con los nuevos valores se retorna a la pantalla principal. Al igual como en el caso de creación de una nueva actividad. En caso que el usuario haya seleccionado que desea compartir la actividad en Facebook, se abrirá de la misma manera anteriormente descrita la pantalla de facebook para compartir en la red social la actividad. 124 Cómo eliminar una actividad En la pantalla principal de JoyMeter, manteniendo presionada la actividad deseada, se despliega un menú con las opciones Editar y Eliminar. Si se selecciona la opción Eliminar , se eliminará la actividad mostrando una notificación de que se eliminó correctamente. Gráfico de Satisfacción En la pantalla principal de JoyMeter, al presionar el botón , se desplegará un gráfico que representa el nivel actual de felicidad que el usuario posee, así como también el historial de los últimos N días de cómo fue variando el nivel de felicidad. Esta variación se calcula en base a las actividades que el usuario fue realizando y el nivel de satisfacción que fue cargando en cada actividad. Sugerencia de Actividades Al final de la vista anterior, se puede apreciar el botón que el usuario puede utilizar para solicitar a JoyMeter, le sugiera una actividad a realizar. La recomendación es informada al usuario a través de una push-up notification. 125 Al hacer clic en la notificación se abre la aplicación de JoyMeter y se carga la actividad que fue sugerida para ser finalmente aceptada por el usuario o descartada. 126 11 Referencias [1] Daniel Goleman - Inteligencia Emocional - 1996. [2] Martin Seligman - Authentic Happiness -2002. [3] Fredrickson, B. L. - What good are positive emotions? - 1998. [4] Fredrickson, B. L. The role of positive emotions in positive psychology: The broaden-and-build theory of positive emotions. - 2001. [5] Lucas, R.E., Diener, E., Larsen, R.J. - Measuring positive emotions - 2003. [6] Diener, Ed; Smith, Heidi; Fujita, Frank - The personality structure of affect - 1995. [7] Csikszentmihalyi, M. - Society, culture and person: a systems view of creativity - 1988. [8] Fredrickson, B. L.; Joiner, T. - Positive emotions trigger upward spirals toward emotional well-being - 2002. [9] Oros, L. B.; Richaud, M.C.;Vanucci,V. - Desarrollo de emociones positivas en la niñez. Lineamientos para la intervención escolar. - 2011. [10] Derryberry, D. y Tucker, D. M. - Motivating the focus of attention. - 1994. [11] Isen, A. M. - Positive effect and decision making. - 2000. [12] Isen, A. M. y Daubman, K. A. - The influence of affect on categorization. - 1984. [13] Isen, A. M., Daubman, K. A. y Nowicki, G. P. - Positive affect facilitates creative problem solving. - 1987. [14] Isen, A. M., Johnson, M. M. S., Mertz, E. y Robinson, G. F. - . The influence of positive affect on the unusualness of word associations. - 1985. [15] Lyubomirsky, S., Sheldon, K. M., & Schkade, D. - Pursuing happiness: The architecture of sustainable change - 2005. [16] Fredrickson, B. L. - The value of positive emotions - 2003. [17] Fredrickson, B. L. y Levenson, R. W. - Positive emotions speed recovery from the cardiovascular sequelae of negative emotions. - 1998. [18] Fredrickson, B.L., Mancuso, R.A., Branigan, C. y Tugade, M.M. - The undoing effect of positive emotions - 2000. [19] Fredrickson, B. L. - Cultivating positive emotions to optimize health and well-being. 2000 [20] Fridja, N.H. - The emotions. - 1986. [21] Salovey, P., Stroud, L.R., Woolery, A. y Epel, E. - Perceived emotional intelligence, stress reactivity, and symptom reports: further explorations using the trait meta-mood scale. - 2002. [22] M. Wooldridge and N. R. Jennings - Intelligent agents:Theory and practice - 1995. [23] Maes, P. - Agents that reduce work and information overload- 1994. [24] Denis Lemongew Nkweteyim. - A Collaborative Filtering Approach To Predict Web Pages of Iterest from Navigation Patterns of Past Users Within an Academic Website. 2005. [25] Pazzani M. J., Muramatsu J., Billsus D.: Syskill & Webert: Identifying Interesting Web Sites. - 1996. [26] Lang, K. - Newsweeder: Learning to filter news. - 1995. [27] Belkin, N. and Croft, B. - Information filtering and information retrieval. - 1992. 127 [28] A. Woodruff, R. Gossweiler, J. Pitkow, E.H. Chi, and S.K. Card. - Enhancing a Digital Book with a Reading Recommender. - 2000. [29] Kamba, T. Bharat, K. Albers, M.C. - The Krakatoa Chronicle: An Interactive, Personalized Newspaper on the Web - 1995. [30] Balabanović, M. Shoham, Y. - Fab: Content-Based, Collaborative Recommendation 1997. [31] Sarwar, B. M., Karypis, G., Konstan, J. A., and Riedl, J. - Item-based Collaborative Filtering Recommender Algorithms. - 2001. [32] Schafer, J. B., Konstan, J. and Riedl, J. - Recommender Systems in E-Commerce 1999. [33] Konstan, J. A., Riedl, J., Borchers, A. and Herlocker, J. L. - Recommender Systems: A GroupLens Perspective. - 1998. [34] Burke, R. Hybrid Recommender Systems: Survey and Experiments. User Modeling and User-Adapted Interaction. - 2002. [35] Ungar, L. H., and Foster, D. P. - Clustering methods for collaborative filtering. - 1998. [36] Konstan, J., Miller, B., Maltz, D., Herlocker, J., Gordon, L., and Riedl, J. GroupLens:Applying Collaborative Filtering to Usenet News. - 1997. [37] Claypool, M., Gokhale, A., Miranda, T., Murnikov, P., Netes, D. and Sartin,M. Combining Content-Based and Collaborative Filters in an Online Newspaper - 1999. [38] Towle, B. and Quinn, C. - Knowledge Based Recommender Systems Using Explicit User Models - 2000. [39] Resnick, P., Iacovou, N., Suchak, M., Bergstrom, P. and Riedl, J. - GroupLens: An Open Architecture for Collaborative Filtering of Netnews - 1994. [40] Shardanand, U., and Maes, P. Social Information Filtering: Algorithms for Automating 'Word of Mouth'. In Proceedings of CHI '95. Denver, CO - 1995. [41] Burke, R. Hybrid Recommender Systems: Survey and Experiments. User Modeling and User-Adapted Interaction. 12(4), pages 331-370. [42] Hanani, U., B. Shapira, and P. Shoval, ‘Information filtering: Overview of issues, research and systems’. User Modeling and User Adapted Interaction 11 - 2001. [43] Breese, J. S., Heckerman, D. and Kadie, C - ‘Empirical analysis of predictive algorithms for collaborative filtering’. In: Proceedings of the 14th Annual Conference on Uncertainty in Artificial Intelligence - 1998. [44] Krulwich, B -‘Lifestyle Finder: Intelligent User Profiling Using Large-Scale Demographic Data’. Artificial Intelligence Magazine 18 (2) - 1997. [45] Middleton, S.E. "Capturing knowledge of user preferences with recommender systems", Mini-thesis, University of Southampton - 2001. [46] Yiming Yang and Xin Liu. A re-examination of text categorization methods. In Proceedings of the 22nd Annual International ACM SIGIR Conference on Research and development in information retrieval - 1999. [47] Ian H Witten, Eibe Frank, and Mark A Hall. Data Mining: Practical Machine Learning Tools and Techniques: Practical Machine Learning Tools and Techniques. Elsevier - 2011. [48] Vladimir Vapnik. The Nature of Statistical Learning Theory. Springer - 1995. [49] Hofmann - Probabilistic latent semantic indexing - 2004. [50] E. Cohen, M. Datar, S. Fujiwara, A. Gionis, P. Indyk, R. Motwani, J. Ullman, and C. Yang. Finding Interesting Associations without Support Pruning. In Proc. of the 16th Intl. Conf. on Data Engineering - (ICDE 2000). 128 [51] J. Dean, and S. Ghemawat., ”MapReduce: Simplified Data Processing on Large Clusters.”, In Proc. of 6th Symposium on Operating Systems Design and Implementation (OSDI) - 2004. [52] Burke, R: Hybrid recommender systems: Survey and Experiments. User Modeling and User-Adapted Integration - 2007 [53] XPod https://www.researchgate.net/publication/234779704_A_Human_Activity_Aware_Learning_ Mobile_Music_Player [54] CF-NADE - http://tech.hulu.com/blog/2016/08/01/cfnade.html. [55] PicFeel - http://www.emotional-apps.com/picfeel. [56] Happiness - http://babypl.pl/spyappsiphone/track-your-happiness-iphone-app. [57] Miriam Rocha Díaz - 2014 - Emociones, Estados de Ánimo e Inteligencia Emocional https://miriamrochadiaz.wordpress.com/2014/05/06/emociones-estados-de-animo-e-intelige ncia-emocional/ [58] Ahmad Ramsés Barragán Estrada y Cinthya Itzel Morales Martínez - 2014 -PSICOLOGÍA DE LAS EMOCIONES POSITIVAS: GENERALIDADES Y BENEFICIOS [59] Enrique García Fernández Abascal - - Disfrutar de las emociones positivas: Psicología 129