En utilisant Python, je calcule la similarité des cosinus entre les éléments.Conversion du code de filtrage collaboratif python pour utiliser Map Reduce
données d'événement donné représentant un achat (utilisateur, article), j'ai une liste de tous les articles 'achetés' par mes utilisateurs.
Compte tenu de ces données d'entrée
(user,item)
X,1
X,2
Y,1
Y,2
Z,2
Z,3
je construis un dictionnaire python
{1: ['X','Y'], 2 : ['X','Y','Z'], 3 : ['Z']}
A partir de ce dictionnaire, je produis un acheté/pas acheté matrice, également un autre dictionnaire (ENB).
{1 : [1,1,0], 2 : [1,1,1], 3 : [0,0,1]}
De là, je suis le calcul de similitude entre (1,2) en calculant le cosinus entre (1,1,0) et (1,1,1), ce qui donne 0,816496
je suis faisant cela par:
items=[1,2,3]
for item in items:
for sub in items:
if sub >= item: #as to not calculate similarity on the inverse
sim = coSim(bnb[item], bnb[sub])
Je pense que l'approche de la force brute est de me tuer et il ne fonctionne que plus lent que les données devient plus grande. En utilisant mon ordinateur portable fidèle, ce calcul dure des heures lorsqu'il s'agit de 8500 utilisateurs et 3500 articles.
J'essaye de calculer la similarité pour tous les articles dans mon dict et cela prend plus de temps que je le voudrais. Je pense que c'est un bon candidat pour MapReduce mais j'ai du mal à "penser" en termes de paires clé/valeur.
Sinon, est-ce que le problème est lié à mon approche et n'est pas nécessairement un candidat pour Map Reduce?
Pouvez-vous relier ou expliquer un peu la carte Réduire? De même, n'utilisez pas 'sub' comme nom de variable. Il y a 'operator.sub()', qui vous mordra plus tard si jamais vous le doublez. –
qui n'était pas le vrai nom de la variable, j'étais juste pseudo-codage. En ce qui concerne Map Reduce, j'essaie de convertir les étapes de mon programme en un modèle compatible avec la carte. Un sur de la réduction de la carte peut être trouvé à http://labs.google.com/papers/mapreduce-osdi04-slides/index.html –