%pylab inline
import numpy as np
import scipy.sparse as sp
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:
M = np.loadtxt('/donnees/ml-100k/u.data', dtype='int32')
row = M[:,0] - 1
col = M[:,1] - 1
data = M[:,2]
X = sp.coo_matrix((data, (row , col))).toarray()
figure(figsize=(35,12)); imshow(X, aspect='auto')
(m,n) = X.shape
X_new = np.zeros((m,n))
for i in range(m):
indices = np.where(X[i,:]>0)
X_new[i,indices] = X[i,indices] - mean(X[i,indices])
figure(figsize=(35,12)); imshow(X_new, aspect='auto')
Pour lire les données contenues dans u.item, vous devez utiliser un csv.reader :
import csv
r = csv.reader(["unknown|Action|Adventure|Animation|Children's|Comedy|Crime|Documentary|Drama|Fantasy|Film-Noir|Horror|Musical|Mystery|Romance|Sci-Fi|Thriller|War|Western"], delimiter = '|')
for genre_header in r:
print genre_header
item_data = []
f = open("/donnees/ml-100k/u.item",'r')
reader = csv.reader(f, delimiter='|')
for row in reader:
item_data += [row]
titre = {}
genre = {}
for i in range(len(item_data)):
#print item_data[i][0]
titre[i] = item_data[i][1]
genre[i] = {}
for j in range(19):
if int(item_data[i][5+j]) == 1:
genre[i][genre_header[j]] = 1
Exo : affichez le titre et le genre des dix premiers films de la liste.
C = np.cov(X_new)
C.shape
Calcul des valeurs propres et des vecteurs propres
[L,V_acp] = np.linalg.eig(C)
Projection dans la nouvelle base
Y_acp = V_acp.T.dot(X_new)
Représentez les 100 premiers films de la base sur les deux ou trois premieres composantes en utilisant les codes couleurs suivants :
Conclusion?
On souhaite représenter les films de la base à l'aide d'un nombre réduit de composantes.
U_svd, s, V_svd = np.linalg.svd(X_new)
(m,n) = X_new.shape
S_svd = np.zeros((m,n))
S_svd[:m, :m] = np.diag(s)
Reconstruction
X_rec = U_svd.dot(S_svd.dot(V_svd))
P, Q
P = U_svd.dot(np.sqrt(S_svd))[:m,:m]
Q = np.sqrt(S_svd).dot(V_svd)
Reconstruisez le signal de départ à partir de P et Q
imshow(dot(P,Q))
Déterminez les cinq plus proches voisins de l'utilisateur 300 selon les valeurs de la matrice P. Les notes de cet utilisateur sont-elles prédictibles à partir des notes données par les voisins?