AlexGonRo/Instance-Selection-Algorithms-Spark

Implementación del algoritmo LSH-IS

Closed this issue · 8 comments

Originally reported by: Alejandro González Rogel (Bitbucket: agr00095, GitHub: Unknown)


Se realizará la implementación del algoritmo de selección de instancias LSH(Locality-sensitive hashing) para funcionar sobre Spark de manera paralela.

El código del algoritmo será escrito en Scala por razones ya mencionadas en el apartado de la memoria correspondiente.

De momento, se va a preparar el algoritmo para que funcione con conjuntos de datos numéricos .


Original comment by Alejandro González Rogel (Bitbucket: agr00095, GitHub: Unknown):


Tendré en cuenta las correcciones sobre la práctica para trabajar sobre ellas.

Acabo de realizar un commit (0db07cf) con simplemente un par de modificaciones que afectaban al correcto funcionamiento del clasificador. Ahora sí funciona perfectamente.

Simplemente se han modificado dos lineas, aunque consideraba necesario subirlo antes de la reunión del spring:

  • En EuclideanHash la manera en la que se calculada la variable "offset" en el caso de ser width<1 era errónea y daba siempre el resultado 0.

  • En HashTable, al generar las funciones de hash se utilizaba siempre la misma semilla, en lugar de usar una semilla diferente cada vez. Era realmente el culpable de que el conjunto de datos resultante fuera erróneo.

Me he dado cuenta de que en un comentario se me ha colado un comando de consola que estaba usando para invocar a Weka. Ya ha sido corregido para el siguiente commit.

Original comment by Carlos López (Bitbucket: clopezno, GitHub: clopezno):


Adjunto algunos comentarios de diseño y de revisión de código para intentar hacerlo mejor su cabe ;-)

Me parece buena idea definir una superclase común para todos los algoritmos de selección de instancia, ésta es la idea del patrón de diseño estrategia. Puede faltar por ajustar de forma precisa alguno de los participantes definitivamente (nombre del método del algoritmo, parámetros del método...). Ten en cuenta esta consideración de diseño sobre todo en la siguiente implementación del otro algoritmo. Si en las diferentes implementaciones puedes evolucionar al patrón método plantilla mucho mejor, aunque de momento lo puedes dejar para futuras refactorizaciones de diseño.

Una cuestión de diseño que no me ha gustado es que el main(), no debería encargarse ni de leer, ni de presentar los datos. Esta funcionalidad debería estar incluida en clases de utilidad en tu propia biblioteca para poder ser utilizada o bien desde la propia estrategia o desde el cliente.

Respecto al código he visto demasiados comentarios (bad smell exceso de comentarios). El código debería ser más autodocumentado con los identificadores utilizados para nombrar entidades código (clases, métodos, parámetros, variables...). Te indico algún caso concreto donde identifico este problema: "class EuclideanHash" en la documentación indicas "Vector de valores aleatorios destinado..." , es una hash o es un vector.

Original comment by Alejandro González Rogel (Bitbucket: agr00095, GitHub: Unknown):


Añadida la primera versión del algoritmo LSHIS en el commit 96f242d

Como expliqué a Álvar durante la anterior reunión el anterior commit era un simple prototipo rápido. Aunque la lógica del algoritmo no ha cambiado desde aquella vez, vale la pena mencionar los siguientes cambios:

  • La estructura de ficheros ha cambiado y es la que espero utilizar a lo largo del TFG. Contaremos con un paquete dentro de "InstanceSelection" para cada clasificador y lo más probable es que todos ellos hereden de una clase abstracta que he subido también.

  • Ahora existe una clase principal que contiene el main y que será a la que llamaremos para probar nuestros algoritmos. Esta clase realiza labores de lectura de datos y presentación del resultado, dejando en la clase de los algoritmos de selección de instancias únicamente la taréa de aplicar el algoritmo.

  • Existen diferentes aspectos que creo que deberían incluirse en algún momento antes de la entrega del proyecto. Están indicados con la etiqueta "//TODO". El más importante y que espero incluir para el próximo commit es poder elegir, a la hora de lanzar la aplicación, que algoritmo queremos ejecutar.

  • Queda pendiente también revisar los comentarios de los atributos de clase.

Original comment by Álvar Arnaiz (Bitbucket: alvarag, GitHub: alvarag):


Democratic Instance Selection

Original comment by Álvar Arnaiz (Bitbucket: alvarag, GitHub: alvarag):


Artículo de revista del LSH-IS

Original comment by Álvar Arnaiz (Bitbucket: alvarag, GitHub: alvarag):


Las clases en las que debes fijarte para el algoritmo de LSH son las del paquete weka.filters.supervised.instance.hash

  • HashTable: Contiene un array de EuclideanHash y combina los hash individuales con hashCode de la clase Arrays.

  • EuclideanHash: Fijarse en la creación del vector aleatorio y el cálculo de la función hash al que se le pasa una instancia.

Puedes ver el código del método Arrays.hashCode en http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java#Arrays.hashCode%28int[]%29

Original comment by Álvar Arnaiz (Bitbucket: alvarag, GitHub: alvarag):


Paquete de selección de instancias para utilizar con Weka
(Descargar Weka de la página oficial)

Original comment by Álvar Arnaiz (Bitbucket: alvarag, GitHub: alvarag):


Código fuente en Java