Esse é um projeto da matéria de Algebra Linear e Teoria da Informação do Insper para o curso de Ciência da Computação.
Neste projeto, trabalharemos com o The Movies Dataset, que possui a avaliação de usuários em relação a filmes. Utilizando o csv ratings_small.csv
, presente neste dataset.
Enunciado: Um problema que existe hoje em dia com as grandes empresas de streaming (Netflix, Spotify, etc.) é que elas têm um acervo de conteúdo muito grande, e os usuários tendem a gostar, cada um, de uma pequena parte desse acervo. Então, como poderíamos escolher quais filmes vão aparecer tela inicial do seu streaming?
O projeto consiste em fazer a implementação de um sistema preditor de nota de filmes por usuário, o sistema projetado deve ser avaliado usando um histograma dos erros ao longo de várias estimativas. O número de estimações deve ser, no mínimo, mil.
O modelo matemático utilizado para o desenvolvimento do projeto foi baseado na ideia de que o sistema de recomendação utiliza "perfis" típicos de usuários. Os perfis, são vetores que mostram que notas são tipicamente atribuídas para cada filme por usuários daquele perfil.
No notebook da aula 5, vimos que os autovetores e autovalores são conceitos importantes para a visualização de dados em uma matriz. Nesse projeto, usamos esses conceitos para fazer recomendações de filmes.
Primeiramente, como precisamos, através de um arquivo csv contendo os dados: usuário, filme e nota, criar uma matriz de usuários pivot_table
do pacote pandas
. Essa função recebe como parâmetro o arquivo csv, e retorna uma matriz com os dados do arquivo.
Os autovetores são vetores especiais de uma matriz quadrada, e quando multiplicados por essa matriz eles resultam em um vetor que é uma multiplicação escalar do autovetor original. Por exemplo, se temos uma matriz
Com o entendimento desses conceitos, vimos tambem que podemos reduzir a dimensionalidade de uma matriz, mantendo a maior parte da informação, ao manter apenas os autovetores com autovalores maiores. Isso é feito usando a decomposição em valores singulares.
Para o projeto, usamos a decomposição SVD para reduzir a dimensionalidade da matriz de usuários
onde:
-
$A$ é uma matriz$m \times n$ , -
$U$ é uma matriz$m \times m$ , -
$\Sigma$ é uma matriz diagonal$m \times n$ , -
$V$ é uma matriz$n \times n$ .
A matriz
Nossa resolução para o desafio consiste em fazer uma "redução de ruído" em uma matriz com dados "estragados", com intuito de voltar a matriz para um estado mais próximo de sua forma original. Para isso, nós escolhemos uma posição aleatória da matriz que contenha uma nota válida, e atribuímos a ela um valor aleatório.
Para fazer o cálculo da decomposição SVD, usamos a função svd
do pacote scipy.linalg
. Essa função recebe como parâmetro a matriz k
, escolhemos quantos autovalores queremos manter, e então, através do método diagsvd
, da biblioteca scipy.linalg
, criamos uma matriz diagonal com os autovalores escolhidos.
Para fazer a recomendação de filmes, usamos a função dot
do pacote numpy
, que faz a multiplicação de matrizes. A função dot
recebe como parâmetro as matrizes
Tendo a matriz k
é incrementado em 1 dentro de um intervalor de 1 a 670. Para cada iteração, nós calculamos o erro, e salvamos em um arquivo csv. No final, nós plotamos um gráfico com o erro em função do parametro k
.
https://github.com/WeeeverAlex/Netlfix-Challenge
pip install -r requirements.txt
python demo.ipynb
O projeto possui as seguintes funcionalidades: