%matplotlib tk
import numpy as np
import scipy.sparse as sp
import matplotlib.pyplot as plt
import csv
Récupérez l'archive http://files.grouplens.org/datasets/movielens/ml-100k.zip, sauvegardez-la dans le répertoire /donnees de votre machine, et décompressez-la.
Le jeu de données contient 100,000 notes (entre 1 et 5) données par 943 utilisateurs sur 1682 films.
Nous utiliserons pour ce TP:
Les données contenues dans u.data pourront être lues avec la fonction np.loadtxt (http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html)
data =
Pour qu'elles soient exploitables, vous devez transformer ces données au format matrice creuse (coo matrix ou csr matrix).
voir:
X =
Pour lire les données contenues dans u.item, vous devez utiliser un csv.reader :
f = open("mes/donnees/ml-100k/u.item",'r')
reader = csv.reader(f, delimiter='|')
item_data=[]
for row in reader:
item_data += [row]
Stockez la liste des titres de films dans une liste et affichez le titre des dix premiers films de la liste.
titre =
print titre[:10]
def prod(x,y):
(n,p) = x.shape
if n ==1 :
return x.todense().dot(y.todense().T)
else:
return x.todense().T.dot(y.todense())
def sim_cos(x,y):
num = prod(x,y)
den1 = np.sqrt(prod(x,x))
den2 = np.sqrt(prod(y,y))
if den1 * den2 == 0: # div. par zero
return 0
else:
res = num / (den1 * den2)
return np.asscalar(res)
def sim_corr(x,y):
x = np.asarray(x.todense())[0]
y = np.asarray(y.todense())[0]
C = np.corrcoef([x,y])
return C[0,1]
Calculez (sous la forme d'un tableau bidimensionnel) la similarité cosinus entre les 5 premiers films de la liste et affichez-le.
Calculez de même le tableau de similarité de corrélation entre les mêmes films et comparez le au tableau précédent
Affichez maintenant la liste des dix films les plus similaires au film 'Citizen Kane (1941)', par ordre de similarité décroissante.
On cherche à prédire la note donnée par un utilisateur i à un film j. Pour celà, on utilise la méthode des K plus proches voisins.
Affichez tout d'abord la liste des films notés par l'utilisateur 678, avec les notes associées.
La méthode des K plus proche voisins permet de prédire les notes produites par l'utilisateur à partir des notes des utilisateurs dont le profil est le plus proche.
La similarité entre utilisateurs sera basée sur les vecteurs lignes de la matrice X.
Ecrivez une fonction calcule_voisins(i,K) qui retourne la liste des K utilisateurs ayant le profil le plus similaire de celui de l'utilisateur i.
Puis testez-la:
voisins = calcule_voisins(i,50)
print voisins
Ecrivez une fonction vote(voisins, j) qui, à partir de la liste des voisins, retourne la note la plus probable par vote majoritaire (chaque voisin vote pour sa note).
Testez cette fonction sur la liste des films de l'utilsateur 678. Affichez pour chaque film la note réelle et sa prédiction.
Calculez également l'erreur moyenne.
Si vous avez le temps, vous pouvez également essayer d'apprendre un regresseur linéaire, par exemple en utilisant un linear_model de la librairie sklearn.
Comparez avec la prédiction simpliste correspondant à la note moyenne de l'utilisateur i