Métodos de evaluación
4. Diseño e implementación
En el presente capítulo se lleva a cabo un análisis detallado de los requerimientos funcionales de la extensión, las decisiones de diseño tomadas para satisfacerlos y la implementación de las soluciones a los mismos. Adicionalmente, se incluyen los diagramas necesarios para comprender de qué forma fue agregada la nueva funcionalidad, intentando detallar al máximo sus componentes.
Como se ha mencionado en secciones anteriores, la extensión no solo debe contar con herramientas para la predicción de enlaces sobre una determinada red social sino que también dispondrá de funciones adicionales para intentar mejorar la eficiencia de los resultados.
Por otra parte, una de las principales restricciones de diseño es mantener una solución flexible, respetando los módulos ya existentes, con el fin de facilitar la modificación o integración de futuras mejoras.
Con respecto al desarrollo de la solución, se incluyen aquellos algoritmos que mayor relevancia poseen dentro de la extensión, junto con un análisis detallado de sus instrucciones. También se vió necesario agregar todas aquellas consideraciones o decisiones importantes a nivel de implementación que se tomaron, explicando los motivos de las mismas.
4.1 Requerimientos funcionales
Teniendo en cuenta la extensión que se debe realizar e ignorando las funciones con que ya cuenta la herramienta tomada como base, es posible elaborar una lista de requerimientos funcionales a satisfacer durante el desarrollo presente trabajo. En ese sentido, el sistema deberá permitirle al usuario realizar las acciones que se detallan a continuación:
● Cargar cualquier tipo de grafo permitido sobre la herramienta. ● Soportar métricas basadas en diferentes tipos de información. ● Ejecutar sin problemas cualquiera de las métrica disponible.
● Configurar los parámetros correspondientes a la predicción de enlaces. ● Configurar los parámetros adicionales de cada una de las métricas. ● Combinar las métricas individuales (si las mismas son compatibles). ● Visualizar los resultados de forma sencilla.
● Guardar los resultados de una métrica hasta su próxima ejecución. ● Aplicar la técnica de clustering en base a una métrica específica. ● Generar datos sobre una métrica en base a la red en el instante inicial. ● Exportar la información de las métricas dentro de las tabla de datos.
4.2 Lógica de Link Prediction
Como se describió en capítulos anteriores, la arquitectura con la que ya cuenta la herramienta tomada como base es de tipo modular, donde cada uno de los módulos que la compone tiene un rol bien definido y actúa de forma colaborativa con los demás. Por lo tanto, la primer decisión que debió considerarse para diseñar la solución es identificar la existencia de algún módulo representativo de la predicción de enlaces, o bien, la necesidad de crear uno nuevo. Teniendo en cuenta que el problema a tratar cuenta con diferentes métricas las cuales brindan resultados que pueden ser tratados como estadísticas, se decidió por integrar la nueva funcionalidad dentro del módulo Statistics API (mencionado en la sección 3.2 “Estructura de la herramienta elegida”) asociado a las mismas.
Inicialmente, el módulo de estadísticas de la herramienta contaba con la opción de correr distintas métricas sobre el grafo del espacio de trabajo, con el fin de obtener resultados de diferente índole. Las métricas se encontraban distribuidas en cuatro categorías de acuerdo a la información que tenían en cuenta. Por ejemplo, podían basarse en nodos, aristas, redes estáticas o dinámicas. A continuación se puede observar las diferentes clases junto con las métricas dentro de ellas:
El módulo se encontraba dividido en dos. Por un lado estaba “StatisticsPlugin”, el cual era el encargado de toda la lógica de cada una de las estadísticas que se podían ejecutar y, por otra parte, “StatisticsPluginUI” quien se ocupaba de lo relacionado a la interfaz gráfica asociada a la pestaña, así como también de la visualización de los resultados obtenidos por la métrica que se haya decidido ejecutar.
Por ejemplo, para el caso de “Grado medio” de un grafo, la métrica se encarga de calcular cuál es el grado de cada uno de los nodos, y luego calcular el promedio, donde el grado de un nodo es la cantidad de aristas que inciden en él. Luego, la sección correspondiente a la gráfica, se encarga de visualizar los resultados dentro de un reporte HTML, ya que en este caso no es necesario una pantalla previa de configuración de parámetros.
Como se puede observar, el tipo de funcionalidad se encontraba asociada al módulo de estadísticas difiere con el funcionamiento general de la predicción de enlaces explicado en sección anteriores, haciendo que éste último no se encuadre en ninguna de las categorías descritas anteriormente. Por consiguiente, fue necesario incluir un nuevo conjunto de funcionalidades que se denominó “Link Prediction
”, al
cual se le cargarán posteriormente cada una de las métricas a implementar. Para llevar a cabo esa inclusión, dentro de la clase “StatisticsPanel” se ubicó el método que inicializa las categorías y se creó una nueva clase a la cual se le define un nombre y una posición dentro de la lista. Aquí se decidió por agregarla en el último lugar, para así respetar la estructura original de la herramienta.
Luego, se debieron implementar las distintas métricas de predicción de enlaces que fueron seleccionadas para formar parte de éste trabajo. Más allá de que en cada una de ellas varía la forma de calcular la similitud entre dos usuarios, el algoritmo general de predicción de enlaces que las utiliza es similar en todos los casos. A partir de allí, surgió la idea de implementar una clase abstracta, con los métodos de predicción de enlace dentro de ella, y que cada una de las métricas concretas implemente sólo la función para calcular la similitud entre dos nodos. De esta forma, se busca obtener una solución flexible, con un alto grado de modificabilidad, y evitar duplicar código fuente en cada una de las métricas.
La nueva clase abstracta fue llamada “PredictorAbs”, e implementa la interfaz “Statistics” tal cual lo hacen el resto de las métricas ya existentes. Se puede considerar a la clase como abstracta dado que posee una serie de métodos para ser implementados por clases concretas, entre ellos lógicamente se destaca el encargado de obtener la similitud entre dos nodos, y el acceso tanto al título como a la descripción de cada uno de los algoritmos a desarrollar.
Con respecto a la funcionalidad propia de PredictorAbs, al implementar una interfaz es necesario redefinir cada uno de los métodos dentro de ella, por lo que toda la lógica de la predicción se encuentra definida aquí. El método principal de la clase implementada es “execute”, el cual se invoca al momento de presionar la opción de ejecutar en cualquier métrica presente dentro de la interfaz de la aplicación. A
continuación se muestra un pseudocódigo del método “execute”, redefinido por la clase abstracta, el cual posee las funciones más importantes relacionadas a la técnica de predicción:
1 Identificar tipo de grafo cargado 2 Si el grafo es estático
3 Filtrar nodos del grafo de acuerdo a los parámetros cargados 4 Por cada uno de los nodos filtrados
5 Obtener todos los enlaces del nodo actual
6 Calcular la cantidad de enlaces a ocultar según el parámetro correspondiente 7 Guardar los N enlaces a borrar
8 Remover los N enlaces del nodo
9 Obtener predicciones para el nodo actual
10 Ordenar las predicciones de acuerdo al valor de similitud
11 Filtrar las predicciones de acuerdo al parámetro correspondiente
12 Calcular eficiencia y recall en base a las predicciones y los enlaces ocultos 13 Regenerar los enlaces ocultos
14 Generar un ranking ordenado de acuerdo a la similitud de predicciones 15 Calcular la eficiencia y recall promedio
16 Sino
17 Llamar a execute dinámico
Si bien el método cuenta con una serie de funciones auxiliares para llegar a los resultados finales, es posible obviar las mismas para describir en detalle el funcionamiento general para el cálculo de las predicciones sobre un determinado nodo, ya que se encuentra fuertemente relacionado con la técnica que se intenta describir. Básicamente el comportamiento para obtener la lista de predicciones sobre un nodo es el siguiente:
1 Por cada nodo N de todos los elementos del grafo 2 Si N es distinto al nodo actual
3 Si N no es vecino del nodo actual
4 Obtener similitud entre N y nodo actual 5 Si la similitud es distinta de nula
6 Crear una predicción entre los dos nodos y el valor de similitud
7 Si la predicción no existe dentro de las ya agregadas 8 Agregar predicción a la lista
9 Retornar la lista de predicciones del nodo
De esta forma se puede apreciar el algoritmo de predicción de enlaces para un único nodo de forma clara y libre de funciones externas. Con respecto a sus
instrucciones,
se predicen uniones entre un nodo y aquellos que no se encuentran
vinculados a él, para luego ser devueltos dentro de una lista. Cabe destacar que fue necesario crear una clase “Prediction”, la cual se utiliza para obtener o almacenar determinados datos como el nombre de los dos nodos en cuestión y la similitud calculada entre ellos. Una consideración tomada en este punto, fue redefinir el método “equals” propio de Java, para determinar el caso en que dos predicciones sean iguales. De esta forma, se evita que en grafos no dirigidos se agregue dos veces el mismo enlace, tal como podría suceder si el nodo N1 predijo un enlace con N2 y luego el algoritmo tome la misma decisión para N2 con respecto a N1. En este caso se descartaría el vínculo por considerarse repetido, debido a que ya existirá el enlace dentro de las predicciones.
Por otra parte, el resto de las funciones presentes dentro de la técnica de predicción de enlaces como por ejemplo el filtrado de los nodos o el cálculo de resultados, se detallarán en secciones posteriores donde se hará referencia a la parte gráfica de cada uno de ellos.