Você está na página 1de 5

PRCTICA 1: Creacin de Recomendaciones basado en Filtrado Colaborativo

Martes 27 de Septiembre y Jueves 29 de Septiembre 2011


Esta prctica se basa en el Captulo 3 (apartados 3.1, 3.2.1 y 3.2.2) sobre Creacin de Sugerencias y Recomendaciones del libro de Marmanis y Babenko (2009). El libro proporciona cdigo Java para ensear paso a paso el desarrollo de varias Aplicaciones Inteligentes de Web. El cdigo Java se puede probar en un entorno de scripting llamado BeanShell (vase apartado 1). El objetivo de esta prctica es, a travs de cdigo Java, la asimilacin del algoritmo bsico para la creacin de recomendaciones con FC basado en tems o en usuarios. La prctica se puede hacer individualmente, o en grupos de dos (de tres NO).

1 Entrega
1.1 Qu
Hay que entregar lo siguiente: 1) una memoria con las respuestas a las tareas 1 a 6 con capturas de pantalla que muestran los resultados obtenidos en las diferentes ejecuciones, 2) el fichero dataset.ser, 3) la implementacin de Jaccard de la tarea 3.

1.2 Cuando
El Jueves 6 de Octubre antes de la sesin de prctica.

1.3 Como
Cada miembro del grupo entrega la prctica en un zip en el Moodle.

2 Instalacin del entorno BeanShell


BeanShell es un lenguaje de scripting compatible con el lenguaje Java. Ejecuta de manera dinmica sintaxis Java estndar y lo extiende con algunas funcionalidades convenientes de los lenguajes de script, como comandos de sistema (i.e., cambio de carpeta con cd(C:/);) y tipos opcionales (i.e., no hace falta decir que i es un int para usarlo, BeanShell lo adivina). Adems, con BeanShell, al contrario de Java, podemos ejecutar cdigo sin necesidad de escribir un mtodo main, lo que lo hace ms flexible y rpido para ir probando cdigo. Bajar el fichero iWeb2.zip y descomprimirlo. El fichero README.txt explica como lanzar BeanShell con la instalacin de la carpeta bajo la unidad C:, pero se puede cambiar esto modificando la variable IWEB2_HOME dentro de deploy/bin/bsc.bat. O sea que hay que cambiar el IWEB2_HOME y luego seguir los pasos de README.txt teniendo en cuenta el nuevo camino que se ha escogido. Una vez aparece el prompt de BeanShell en la lnea de comandos, se pueden probar algunos comandos Java, como: bsh% nombre = Nadjet; bsh %System.out.println(Hello +nombre); Hello nadjet

Se ve que no hace falta declarar los tipos de las variables. Ya estamos listos para probar el cdigo de M&B!

3 Visualizacin y edicin del cdigo


La ejecucin del comando ant ha creado un jar iweb2.jar a partir del cdigo mquina del Captulo 3 de M&B. Si queremos modificar el cdigo de M&B, hace falta crear un nuevo jar llamado iweb2.jar y meterlo bajo la carpeta deploy/lib. Se puede crear un proyecto en su IDE favorito (Netbeans o Eclipse) cuyo cdigo fuente es el cdigo fuente del a carpeta src. Hay que aadir al proyecto creado los jars de la carpeta deploy/lib. A partir de ah, se puede compilar y hacer builds del cdigo fuente.

4 Conceptos de distancia y similitud


M&B proponen la implementacin de un sistema de recomendaciones y sugerencias sencillo basado en Filtrado Colaborativo para un sistema de venta de msicas online. Los conceptos bsicos modelizados son los items (= canciones), usuarios y ratings (de 1 a 5). Los datos modelados para probar el cdigo son los siguientes:
Mozart: Beethoven: Fiddler Symphony Symphony on the #41 No 9 in D Roof What a wonderful Let it world be Sunday, Bloody Sunday

Tears in Heaven

La Bamba

Mrs Wizard Robinson Yesterday of Oz

Frank Constantine Catherine

5 5 1

5 5 2

4 1

5 4

4 5

5 5 3 4 5 2 1

Es decir que tenemos 3 usuarios y 11 canciones. A primera vista Frank y Constantine son ms similares que Catherine. Vamos a cargar los ejemplos y probar la similitud entre los usuarios con el siguiente cdigo (copiar y pegarlo en el BeanShell), donde el ndice 0 se corresponde al usuario Frank, el ndice 1 a Constantine y el ndice 2 a Catherine. MusicUser[] mu = MusicData.loadExample(); mu[0].getSimilarity(mu[1],0); mu[0].getSimilarity(mu[1],1); mu[0].getSimilarity(mu[2],0); mu[1].getSimilarity(mu[2],0); mu[2].getSimilarity(mu[1],0); mu[0].getSimilarity(mu[0],0); mu[0].getSimilarity(mu[0],1); Figura 1: prueba de similitud El mtodo esttico loadExample de la clase MusicData carga los datos (usuarios, con sus ratings de cada cancin). La clase MusicData con su implementacin de loadExample se encuentra en el paquete iweb2.ch3.collaborative.data.

El mtodo getSimilarity(usuario,tipoDeSimilitud) de la clase MusicUser devuelve la similitud entre el usuario actual y el usuario pasado en argumento. La similitud implementada en el cdigo es la similitud basada en la Distancia Euclidiana 1) normalizada y 2) que usa la funcin de suavizacin tanh. Si el tipo de similitud es 1, entonces la similitud se ajusta por el ratio de

tems comunes. Si es 0, entonces no hay ajuste. Revisar el cdigo de getSimilarity en MusicUser para ver como se implementa. TAREA 1:: Decir qu resultado se espera de las llamadas en la Figura 1 y por qu, y comprobar que su prediccin es correcta en la ejecucin del cdigo. Modificar el cdigo de MusicData para aadir un nuevo usuario Alexandra, que tiene valoraciones para una sola cancin, Tears In Heaven, que valora a 1. Hay que ampliar el tamao del array de usuarios. Compilar y hacer un build del cdigo, luego copiar el jar bajo nombre iweb2.jar a la carpeta deploy/lib de iWeb2. Salir de beanshell y volver a entrar para que se cargue de nuevo el jar. TAREA 2: Qu devuelve el mtodo getSimilarity entre los usuarios Catherine y Alexandra? Por qu? Le parece justo este resultado, y por qu? Qu ajuste/modificacin propondras a la medida de similitud usada? La medida Jaccard calcula la similitud entre dos objetos basndose en atributos binarios. La formula es as: Coeficiente Jaccard = f 11 / ( f01 + f10 + f 11 ) Donde f 11 serian los tems valorados por ambos usuarios, f01 y f10 los tems valorados por un usuario pero no el otro. O sea que la medida Jaccard es la interseccin de valoraciones de tems sobre la unin. Para tener en cuenta atributos no binarios, existe la medida Jaccard Extendida, llamada Tanimoto, que se calcula as: Tanimoto(x,y) = x y / ( || x ||2 + || y ||2 - x y ) Donde ||x|| es la longitud del vector y x y el producto escalar. TAREA 3: Implementar la medida de similitud Jaccard extendida (Tanimoto) en el mtodo getSimilarity de MusicUser. Qu diferencia observa con las otras similitudes y por qu? No hay que olvidar sustituir el iweb2.jar por el nuevo build despus de la implementacin de la medida Jaccard extendida.

5 Filtrado colaborativo basado en usuarios similares


Probar el siguiente cdigo en el BeanShell: BaseDataset ds = MusicData.createDataset(); ds.save("C:/dataset.ser"); Delphi delphi = new Delphi(ds,RecommendationType.USER_BASED); MusicUser mu1 = ds.pickUser("Bob"); delphi.findSimilarUsers(mu1); MusicUser mu2 = ds.pickUser("John"); delphi.findSimilarUsers(mu2); delphi.recommend(mu1); delphi.recommend(mu2); Figura 2: creacin de recomendaciones basado en usuarios similares El mtodo createDataSet de MusicData crea un conjunto de dato segn los siguientes principios: - Para cada usuario definido, escoge de manera aleatoria un conjunto de canciones que corresponde al 80% de todas las canciones disponibles. - Para cada cancin escogida, genera un rating de forma aleatoria, que puede ser 4 o 5 si el nombre del usuario empieza con la letra A hasta D (inclusivo), y 1,2 o 3 en los dems casos. De esta manera se han creado dos grupos de usuarios con preferencias similares. Eso permite evaluar de manera rpida los resultados de nuestro motor de recomendaciones.

El conjunto de datos as creado se guarda en un fichero para poder volver a cargarlo y usarlo de nuevo ms adelante. Observa como los usuarios similares a Bob tienen nombres que empiezan por una letra entre A y D, al contrario de los usuarios similares a John. Tambin observa que las predicciones de ratings para las canciones recomendadas oscilan entre 4 y 5 para Bob, y entre 1 y 3 para John. Adems, aunque los ratings son nmeros enteros, las predicciones de ratings son nmeros reales, ya que indican el grado de la valoracin.

5.1 Calculo de la similitud entre usuarios


Para encontrar los usuarios similares al usuario escogido, el programa computa una matriz usuario*usuario para guardar la similitud entre cada par de usuario. El cdigo est definido en el mtodo calculate de la clase iweb2.ch3.collaborative.similarity.UserBasedSimilarity. Este mtodo utiliza la propiedad de simetra de la similitud para optimizar el clculo de la matriz y calcula para cada par de usuario distinto su similitud Jaccard, usando la clase RatingCountMatrix, que permite de calcular y almacenar de forma compacta la distribucin de acuerdo entre dos usuarios (o tems).

5.2 Calculo de la prediccin de rating de un usuario


El mtodo predictRating(usuario,item) devuelve la prediccin de valoracin de un tem para un usuario llamando al mtodo estimateUserBasedRating(user,tem) para el caso del filtrado colaborativo basado en usuario. Este mtodo sigue el algoritmo que se explic en la clase de teora, ponderando las valoraciones del tem a valorar de cada usuario por su similitud con el usuario activo, sumando estas valoraciones ponderadas y dividiendo por la suma de similitudes.

5.3 Creacin de recomendaciones


El mtodo recommend(user) llama a recommend(user,topN), que devuelve los topN tems con predicciones ms altas para el usuario, calculando las predicciones de cada tem no valorado por el usuario con el mtodo predictRating. TAREA 4: Hacer una traza del siguiente cdigo de la Figura 2: Delphi delphi = new Delphi(ds,RecommendationType.USER_BASED); MusicUser mu1 = ds.pickUser("Bob"); delphi.recommend(mu1); Es decir explicar paso a paso qu hace el cdigo, qu mtodos se llaman, que hace cada mtodo, qu devuelve, las estructuras de datos involucradas, etc. Todo esto se ha de presentar en una memoria. Se ha de entregar tambin el fichero dataset.ser.

6 Filtrado colaborativo basado en items similares


Tambin se puede crear un sistema de recomendaciones de FC basado en tems como demuestra el cdigo de la Figura 3. Se usa el mismo conjunto de datos que para el FC basado en usuarios similares (Figura 2).

BaseDataset ds = BaseDataset.load("C:/dataset.ser"); Delphi delphi = new Delphi(ds,RecommendationType.ITEM_BASED); delphi.setVerbose(true); MusicUser mu1 = ds.pickUser("Bob"); delphi.recommend(mu1); MusicItem mi = ds.pickItem("La Bamba"); delphi.findSimilarItems(mi); Figura 3: creacin de recomendaciones basado en items similares

TAREA 5: Qu diferencia hay entre las recomendaciones de Bob con FC basado en tems vs con FC basado en usuarios?

TAREA 6: Hacer una traza del siguiente cdigo de la Figura 3: Delphi delphi = new Delphi(ds,RecommendationType.ITEM_BASED); MusicUser mu1 = ds.pickUser("Bob"); delphi.recommend(mu1); Comentando con detalle sobre todo los mtodos que cambian con respeto al cdigo de FC basado en usuarios ya comentado en la tarea 4.

Você também pode gostar