Recommandation par filtrage collaboratif

L'objectif est de mettre en pratique ce qui a été vu en cours concernant la factorisation de matrices dans le cadre des systèmes de notation de produits.

Le problème et les données

Le problème

On va travailler avec des données issues du système de recommandation de films MovieLens. Plusieurs jeux de données sont disponibles sur le site de GroupLens. Ces jeux de données diffèrent par leur taille et vous travaillerez avec le plus petit pour mettre au point vos programmes. Néanmoins, vos programmes doivent aussi fonctionner avec les deux autres jeux de données.

MovieLens est un site communautaire de recommandation de films. Les utilisateurs de ce site notent des films de 1 à 5. Ils peuvent également demander des suggestions de films étant donnés les notations qu'ils ont fournies.
Chaque utilisateur est décrit par quelques attributs :

Chaque film est décrit par :

On dispose alors d'une liste de notes sous la forme :

Dans le plus petit jeu de données, il y a 100.000 notes, provenant de 943 utilisateurs pour 1682 films. Les autres jeux de données en comptent respectivement 1 million et 10 millions.

L'objectif est de pouvoir sélectionner des films pour un utilisateur. Les recommandations peuvent concerner des films qui devraient lui plaire, mais aussi des films qui ne lui plairont probablement pas.
Pour cela, on va appliquer ce que l'on a vu en cours concernant la factorisation de matrices non négatives.

Factorisation de matrices

On va appliquer la méthode de factorisation de matrices non négatives vue en cours pour effectuer des recommentations.

L'algorithme vu en cours est le suivant : (on suppose que vous avez récupéré les deux fichiers u1.base et u1.test)

Deux points auxquels il faut prêter attention :

Une fois que cette première version fonctionne, il y a plein de petits trucs pour en améliorer ses performances. Par exemple :

Recommandation

Écrire une fonction qui recommande 5 films qu'il n'a pas notés à un utilisateur identifié par son numéro.