Escolar Documentos
Profissional Documentos
Cultura Documentos
INSTITUTO DE MULTIDISCIPLINAR
Apresentado por:
Aprovado por:
Gostaria de dedicar essa vitoria aos meus pais João Francisco e Maria das Graças
que devo absolutamente tudo que tenho na minha vida, são as minhas referências,
meus avós Aldevina, José, Rosa, avós que são como meus pais mais velhos, aos meus
tios José, Tânia, Elisia, Helena, Regina, Paulo, Sílvia, Edison, Sílvio que também
são como meus pais, meus primos que considero todos meus irmãos, os que cresceram
comigo como Lucas e Gabriel, os que hoje são meus vizinhos como a Márcia e Pedro,
esse por sinal é meu primo, vizinho e ainda é amigo do curso de graduação. Minha
prima Juliana, uma pessoa que cresceu junto comigo, passamos pelas mesmas fases
da vida juntos, ela é minha irmã gêmea que nasceu alguns dias antes. Minhas primas
Mariana e Marina que de distante só as nossas casas.
Não poderia deixar de agradecer aos meus amigos, que sempre estiveram junto
comigo, aos meus amigos do Ferreira Viana, Luana, Daniel , Michael, Jessica, Kevyn,
Jonathan, amigos tive o prazer conviver durante aqueles belos anos de ensino médio.
Ao Kleyton, Raul, Michel, Larissa, Rafael, Egberto, Jéssica, Jamile, Victor Pedro,
Liliane, Ygor, Alexsander, Júlio, Suzane, amigos que fiz no curso de Ciência da
computação, amigos que muito se esforçaram, pouco dormiram em cada sofrido
final de período junto comigo durante esse curso, mas todo esse esforço que muito
valeu a pena. A Danielle, Victor e o Pedro Henrique, amigos que muito me fizeram
crescer como pessoa e como profissional, nos anos que estivemos juntos no fundão.
i
RESUMO
Recsys.jl: Um framework de Sistemas de Recomendação
Hugo Diniz Rebelo
Fevereiro/2016
Este trabalho tem como objetivo contribuir com a pesquisa na área de sistemas
de recomendação, criando uma ferramenta na qual facilite o uso e o desenvolvimento
de técnicas de recomendação baseadas em filtragem colaborativa, de forma a torna
a pesquisa de novas técnicas na área de sistema de recomendação mais ágil, sendo
um framework modular e já tendo algorítimos clássicos implementados. Além disso
ele deve ser elaborado de forma que seja fácil sua utilização de forma que possa ser
utilizado por um professor em sala de aula.
ii
ABSTRACT
Recsys.jl: Um framework de Sistemas de Recomendação
Hugo Diniz Rebelo
Fevereiro/2016
iii
Lista de Figuras
iv
Lista de Tabelas
Tabela 2.1: Tabela com notas de filmes valendo de 1 a 5 dados por um con-
junto de 5 usuários . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Tabela 4.8: Tabela com Resultados para o experimento K-Fold K-NN para
Recsys, LibRec e Lenskit . . . . . . . . . . . . . . . . . . . . . . . 37
v
Lista de Códigos
vi
Lista de Abreviaturas e Siglas
vii
Sumário
Agradecimentos i
Resumo ii
Abstract iii
Lista de Figuras iv
Lista de Tabelas v
Lista de Códigos vi
1 Introdução 1
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Sistema de Recomendação 4
viii
2.1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Recsys.jl 16
3.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.1 MyMediaLite . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.2 Lenskit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.3 Mahout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.4 LibRec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.5 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4.1 Modelagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4.1.1 Model . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4.1.2 Experiment . . . . . . . . . . . . . . . . . . . . . . . 22
3.4.1.3 Dataset . . . . . . . . . . . . . . . . . . . . . . . . . 23
ix
3.4.2.1 Tipos desenvolvidos a partir do Experiment . . . . . 24
4 Experimentos 28
4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.1.3 Dataset . . . . . . . . . . . . . . . . . . . . . . . . . 31
x
4.2.2.7 K-Fold e RegularizedSVD em relação a outras bibli-
otecas . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5 Conclusões 38
Referências 40
xi
Capítulo 1
Introdução
1.1 Motivação
1.2 Objetivo
• A criação de novos módulos deverá ser feita com o mínimo de esforço possível
para o criador desse modulo.
• O framework precisa ser elaborado de forma que seja fácil sua utilização de
forma que possa ser utilizado por um professor em sala de aula.
Sistema de Recomendação
Hoje nós vivemos em uma sociedade conectada de forma global e em tempo real,
na qual produzimos informações como nunca. Em toda a história da humanidade
foram produzidos pelo menos 32 milhões de livros, 750 milhões de artigos, 25 milhões
de músicas, 500 milhões de imagens, 500 mil filmes, 3 milhões de vídeos e programas
de TV, e cerca de 100 bilhões de páginas na web, sendo que, a maior parte dessa
produção é referente aos últimos 50 anos de nossa história[37].
rências. Através desses filtros os e-mails são selecionados e somente serão enviados
para aqueles usuários que estiverem de acordo ao respectivo filtro. Os criadores do
sistema Tapestry, Utilizaram a frase "filtragem colaborativa"visando designar um
tipo de sistema específico no qual a filtragem de informação era realizada com o
auxílio humano, ou seja, pela colaboração entre os grupos de interessados, mas o
autor [30] preferiu utilizar o termo "sistema de recomendação"mais geral por duas
razões. A primeira é que os recomendadores podem não explicitamente colaborar
com os beneficiários, e a segunda razão é que as recomendações podem sugerir itens
particularmente interessantes, além de indicar aqueles que devem ser filtrados.
c ∈ C, i ∈ I, ic = argmax(c, i) (2.1)
Tabela 2.1: Tabela com notas de filmes valendo de 1 a 5 dados por um conjunto de
5 usuários
2.1.1 Introdução
O problema de um novo item surge devido ao fato de que os novos itens intro-
duzidos em um sistema de recomendação, geralmente não têm avaliações já feitas,
portanto, eles não serão recomendados [26]. Por sua vez, um item que não é reco-
mendado passa despercebido por grande parte dos usuários do sistema e como eles
não têm conhecimento de aquele item pode ser interessante para ele, ele não irá
utiliza-lo e avalia-lo. Desta forma, podemos entrar em um ciclo vicioso no qual um
conjunto de itens do sistema de recomendação são deixados de fora do processo de
recomendações.
2.1. FILTRAGEM COLABORATIVA 9
ainda não lançaram nenhum voto, eles não podem receber quaisquer recomendações
personalizadas com base na Filtragem Colaborativa. Umas das formas comuns de
resolver o problema do novo usuário é incentivar ele a dar notas a possíveis itens
já conhecidos por ele ou o sistema utilizar usuários no qual já tenham avaliado um
numero mínimo de itens.
a sua similaridade [2]. O sucesso deste método depende, entre outros fatores, da
escolha dos pesos que cada vizinho contribuirá para a predição das avaliações des-
conhecidas, esse peso é dado a partir de um calculo de quão similar é o vizinho de
um determinado elemento, esse calculo de similaridade será explicado nas próximas
seções.
A predição Pui ,tal que u é usuário alvo e i é o item alvo é dado por uma media
ponderada entre o somatório de similaridade(u, u0 ), onde u é usuário alvo e u0 é
vizinho k vizinhos mais próximos do usuário alvo, multiplicado pela preferencia
Nu0 i
A segunda é a recomendação baseado no item, essa forma tenta prever qual será
a preferência de um item i para usuário u a partir de n itens similares.
0
P
i0 V similaridade(i , i)Ni0 u
Piu = P 0
(2.3)
u0 V similaridade(i , i)
2.1. FILTRAGEM COLABORATIVA 12
A predição Piu ,tal que u é usuário alvo e i é o item alvo é dado por uma media
ponderada entre o somatório de similaridade Similaridade(i, i0 ), onde u é item alvo
e i0 é vizinho k vizinhos mais próximos do item alvo, multiplicado pela preferencia
Ni0 u
0 yty0
cos(y, y ) = (2.4)
kyk ky 0 k
(y − ȳ)(y 0 − ȳ 0 )
P
0
correlacaoP earson(y, y ) = p (2.5)
(y − ȳ)2 (y 0 − ȳ 0 )2
O autor [10] utilizou o SVD para propor uma simplificação do modelo de regres-
são e a utilização do SVD para construção do modelo. Com isso, surgiu uma classe
de algoritmos baseada em modelos que utiliza o conceito de variáveis latentes para
a construção de um modelo para recomendação [38, 10].
Modelos que utilizam os fatores latentes são abordagens que tentam explicar a
preferência de um item para um usuário caracterizando os mesmos em fatores. Um
exemplo disso é no caso de um sistema de recomendação de filmes, nós podemos
interpretar os valores latentes de um filme o tão próximo ele é de uma determinada
categoria. Já no caso do usuário seria a preferência deste sobre estas categorias.
rui = qiT ∗ pu
O maior desafio é que a matriz de notas é esparsa e com isso existem diversos valores
faltantes na realização da decomposição. Uma forma de superar esse desafio é após
a decomposição, a realização de um procedimento de aprendizado. No trabalho [10]
foi utilizado o algoritmo do gradiente descendente, com o objetivo de minimizar
o erro quadrático da soma. Simon Funk propôs-se a utilização da constante λ a
2.1. FILTRAGEM COLABORATIVA 15
regularização da função.
X
min (rui − qiT Pu )2 + λ(kqi k2 + kpu k2 )
qi ,pu
(u,i)
Erro da soma quadrático utilizando o modelo sugerido por Simon Funk (2.9)
eui = ru i − qiT ∗ Pu
qi ← qi + γ(eui Pu − λqi )
pu ← pu + γ(eui qi − λpu )
Improved Regularized SVD é uma versão Modelo de Regressão usando SVD, que
segundo o [27] foi adicionado no Modelo de Regressão usando SVD dois pesos para
a Nota aproximada, o parâmetro ci para cada usuário e o parâmetro dj para cada
filme.
rui = dj + ci + qiT ∗ pu
ci ← qi + γ(eui − λ(ci + dj − media_global))
dj ← pu + γ(eui − λ(ci + dj − media_global))
Recsys.jl
3.1 Motivação
Com o ideal de um framework que pudesse ser modulável para facilitar o reuso,
tornando a pesquisa de novas técnicas mais ágil e que o código gerado no desenvolvi-
mento nessas técnicas tivessem um alta legibilidade, o desenvolvimento do framework
foi primeiramente focado na modelagem, e como deveria ser o desenvolvimento das
técnicas no framework.
A partir disso foi pesquisado uma linguagem que melhor se encaixava com o
projeto sendo que deveria ser uma linguagem com desempenho alto, com um nível
relativamente alto de abstração e mais próximo possível da linguagem humana.
Utilizando esses critérios, foi escolhida a linguagem Julia, uma linguagem cientifica
3.2. TRABALHOS RELACIONADOS 17
com um nível alto abstração, linguagem muito próxima da linguagem humana e com
desempenho comparável a linguagens de mais baixo nível como o C.
3.2.1 MyMediaLite
A biblioteca oferece algoritmos no estado da arte para essas duas tarefas. A API
também contém métodos para atualizações em tempo real de carga e armazenamento
dos modelos de recomendação já treinados. MyMediaLite é open-source, distribuído
nos termos da GNU General Public License (GPL) e foi desenvolvida em C. [11]
3.2.2 Lenskit
• LensKit é escrito em Java, por isso, é acessível a uma ampla gama de progra-
madores e de fácil utilização em muitos ambientes, e podendo ter algorítimos
escritos em Groovy, facilitando o uso e a validação da biblioteca.
3.2.3 Mahout
O projeto Mahout foi criado por várias pessoas envolvidas na comunidade Apache
Lucene, com um interesse no aprendizado de máquinas e um desejo de ter imple-
mentações escaláveis de algoritmos de aprendizado de máquina para agrupamento e
categorização, com uma ótima documentação. [19]
3.2.4 LibRec
LibRec4 é software Java licenciado sob GPL 2 (versão 1.7 ou superior necessário).
Ele facilita o estudo dos dois problemas clássicos de sistemas de recomendação, ou
seja, previsão e ranking de itens. O LibRec consiste em três componentes principais,
ou seja, interfaces genéricas, datasets e algoritmos de recomendação. [11]
• uma plataforma para que outros possam contribuir mais códigos-fonte de ou-
tros algoritmos como uma biblioteca de código aberto.
3.2.5 Conclusão
Julia teve a sua primeira versão (0.1) lançada em fevereiro de 2012 e tem como
seus principais desenvolvedores o Jeff Bezanson, Stefan Karpinski, Viral Shah, e Alan
Edelman. Esse projeto foi desenvolvido Instituto de Tecnologia de Massachusetts
(MIT). [34] Hoje Júlia esta na versão 0.42. [6]
Julia foi desenvolvida sobre a licença MIT, que é uma licença que da ao usuário
o uso gratuito do software, o uso para fins comerciais, sua distribuição e a sua modi-
ficação, você pode conceder uma sublicença para modificar e distribuir o software a
terceiros não incluídos nessa licença. O software é fornecido sem nenhuma garantia
sendo então autor não responsabilizada por uma eventual perda ou dano. [20]
e mais próximas da “lógica humana”, o Júlia foi desenvolvido utilizando essas carac-
terísticas de uma linguagem de alto nível.
3.4.1 Modelagem
3.4.1.1 Model
3.4.1.2 Experiment
A interface Experiment, como próprio nome já diz, ela faz o papel de ser o
experimento, é a interface das classes que implementam uma forma validação do
Model utilizando um Dataset qualquer. O método run da interface tem por obje-
tivo a execução do experimento retornando os resultados das métricas utilizadas no
experimento.
7 this = new ()
8 this.run = function()
9 return zeros(10)
10 end
11
12 return this
13 end
14
15 end
3.4.1.3 Dataset
27 return createMatrix(this);
28 end
29
30 return this
31 end
métrica utilizada para o calculo de similaridade, essa métrica é um método que tem
por entrada dois arrays cada um com as notas dadas dos respectivos usuários dados
para os respectivos itens. Foram implementados as métricas Correlação de Pearson
e Calculo de Similiaridade por Cosseno chamadas de pearsonCorrelation e cosine.
Essas técnicas tem como entrada no método construtor o Dataset, o K que é o nu-
mero de features, γ que é taxa de aprendizagem, λ que é a constante de regularização
da função e o δ é o coeficiente de erro. Caso não seja passado os valores na chamada
da função, os valores que são assumidos por padrão para o RegularizedSV D são:
K = 10 γ = 0.001 λ = 0.02 δ = 0.1. Já para o ImprovedRegularizedSV D são:
K = 10 γ = 0.016 λ = 0.05 δ = 0.001
Mean Absolute Error (Erro absoluto médio) é uma das mais populares métricas
de avaliação de sistemas de recomendação. [16] A técnica do calculo do MAE envolve
basicamente comparar a nota real com a nota da predição assim obtendo a diferença
entre elas (essa diferença sera chamada de erro). A partir dos erros obtidos na
comparação das notas reais com as notas da predição se faz uma media desses erros
obtendo o índice do MAE.
3.4. O PROJETO RECSYS.JL 27
P
|notaReal − notaP revista|
M AE = (3.1)
quantidadeN ota
Root Mean Square Error (Erro médio quadrado), assim como o MAE ele utiliza
erro das notas reais para a predição, a diferença do MAE para RMSE é a magnitude
do erro, o RMSE penaliza o maior discrepância entre o valor real e o valor predito.
A técnica do calculo do RMSE envolve basicamente obter os erros na comparação
das notas reais com as notas da predição, elevar esse erro ao quadrado obter media
e tirar raiz quadrada da media. [3]
qX
RM SE = (notaReal − notaP revista)2 /quantidadeN ota (3.2)
Capítulo 4
Experimentos
4.1 Introdução
Além da passagem de parâmetros, foi implementado uma função que cria o objeto
KNN nessa função foi utilizada o Construtor do KNN com o parâmetro da entrada
função dataset, e o parâmetro de qual tipo do KNN a ser utilizado, o valor do K
e tipo de similaridade a ser utilizada. Para a execução do experimento foi preciso
passar a função de criação do KNN e qual fold a ser executado.
4.1. INTRODUÇÃO 29
A facilidade que o Recsys.jl teve em relação ao fato do código ser legível e simples
é porque ele foi implementado linguagem Julia que é de altíssimo nível, proporcio-
nando o código do Recsys.jl curto e simples na hora de definir os parâmetros para
execução da abordagem escolhida, como as outras bibliotecas tem seus código escri-
tos em Java, eles escolheram duas formas de tornar o código mais simples: Utilizando
uma linguagem script para execução da biblioteca que foi o caso do Lenskit, que
utilizou o Groovy para tornar a escrita de códigos mais simples e mesmo assim a
passagem de parâmetro para abordagem escolhida é feita por chamada de uma fun-
ção, podendo se utilizada varias vezes, tornando o arquivo longo e difícil de ser lido,
ou a utilização de um arquivo de configuração no qual foi o caso do Librec.
4.1. INTRODUÇÃO 30
4.2.1.3 Dataset
Para a execução dos experimentos foi utilizado uma maquina virtual no Google
Cloud Computing, sendo a configuração: 2.5 GHz Intel Xeon E5 v2, 13Gb de ram,
10Gb (Não contando com S.O), Sistema operacional Ubuntu 14.04 e foi utilizado a
versão 0.42 da linguagem Julia.
Tabela 4.7: Tabela com Resultados para o experimento K-Fold Regularized para
Recsys, LibRec e Lenskit
Tabela 4.8: Tabela com Resultados para o experimento K-Fold K-NN para Recsys,
LibRec e Lenskit
Conclusões
Este trabalho propôs um framework que fosse elaborado de forma modulável, com
o objetivo de quando for implementado uma nova abordagem, os códigos utilizados
nessa nova abordagem e que já tenham sido implementados em outra abordagem,
não precisem ser reimplementados. Este framework precisava também ser elaborado
de forma que fosse simples a sua utilização no ensino e pesquisa, sendo possível sua
utilização por um professor em sala de aula.
Para o framework ser elaborado de forma simples de forma ser possível a sua
utilização no ensino em sala de aula, foi utilizado uma modelagem simples e escolhi
do a linguagem Julia para seu desenvolvimento, uma linguagem de altíssimo nível
que torna o código muito simples de ser lido e curto.
5.2. LIMITAÇÕES E TRABALHOS FUTUROS 39
[13] Goldberg, D., Nichols, D., Oki, B. M., e Terry, D. Using collaborative
filtering to weave an information tapestry. Communications of the ACM 35, 12
(1992), 61–70.
[17] Hilbert, M., e López, P. The world’s technological capacity to store, com-
municate, and compute information. science 332, 6025 (2011), 60–65.
[22] Kohavi, R., e others. A study of cross-validation and bootstrap for accuracy
estimation and model selection. In Ijcai (1995), vol. 14, pp. 1137–1145.
[23] Konstan, J. A., Miller, B. N., Maltz, D., Herlocker, J. L., Gordon,
L. R., e Riedl, J. Grouplens: applying collaborative filtering to usenet news.
Communications of the ACM 40, 3 (1997), 77–87.
[26] Park, S.-T., e Chu, W. Pairwise preference regression for cold-start re-
commendation. In Proceedings of the third ACM conference on Recommender
systems (2009), ACM, pp. 21–28.
[29] Resnick, P., Iacovou, N., Suchak, M., Bergstrom, P., e Riedl, J.
Grouplens: an open architecture for collaborative filtering of netnews. In Pro-
ceedings of the 1994 ACM conference on Computer supported cooperative work
(1994), ACM, pp. 175–186.
REFERÊNCIAS 43
[32] Sarwar, B., Karypis, G., Konstan, J., e Riedl, J. Item-based collabora-
tive filtering recommendation algorithms. In Proceedings of the 10th internati-
onal conference on World Wide Web (2001), ACM, pp. 285–295.
[38] Teevan, J., Dumais, S. T., e Horvitz, E. Personalizing search via auto-
mated analysis of interests and activities. In Proceedings of the 28th annual
international ACM SIGIR conference on Research and development in infor-
mation retrieval (2005), ACM, pp. 449–456.
Apêndice A
32 // run algorithm
33 LibRec librec = new LibRec();
34 librec.setConfigFiles(configDirPath + configFile);
35 librec.execute(args);
36
37 long tempoFinal = System.currentTimeMillis();
38 Long tempoTotal = tempoFinal−tempoInicio;
39 System.out.println(tempoTotal);
40
41 }
42 }
32 file = open("100KKFoldRegularedSVD.result","w")
33 write(file,string(result))
34 close(file)
35
36 println("100K Recsys.HoldOut Recsys.ImprovedRegularedSVD")
37 result = expHoldout100k.run(createModelImprovedRegularedSVD)
38 file = open("100KHoldOutImprovedRegularedSVD.result","w")
39 write(file,string(result))
40 close(file)
41
42 println("100k Recsys.KFold Recsys.ImprovedRegularedSVD")
43 result = expKfold100k.runAll(createModelImprovedRegularedSVD)
44 file = open("100KKFoldImprovedRegularedSVD.result","w")
45 write(file,string(result))
46 close(file)
47
48 println("100K Recsys.HoldOut Recsys.KNN")
49 result = expHoldout100k.run(createModelKNN)
50 file = open("100KHoldOutKNN.result","w")
51 write(file,string(result))
52 close(file)
53
54 println("100k Recsys.KFold Recsys.KNN")
55 result = expKfold100k.runAll(createModelKNN)
56 file = open("100KKFoldKNN.result","w")
57 write(file,string(result))
58 close(file)
59
60 end
61
62 testAll()