La question
Comment prédire la note d'un nouvel utilisateur dans un modèle ALS formé à Spark? (Nouveau = pas vu pendant le temps de formation)
Le problème
Je suis le tutoriel officiel de Spark ALS ici:
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
Je suis en mesure de construire un bon recommandeur avec un MSE décent, mais je me bats avec la façon d'entrer de nouvelles données dans le modèle. Le tutoriel modifie les notes du premier utilisateur avant la formation, mais c'est vraiment un hack. Ils donnent l'indice suivant:
9.2. Augmenter les facteurs matriciels:
Dans ce didacticiel, nous ajoutons vos notes à l'ensemble de formation. Une meilleure façon d'obtenir les recommandations pour vous consiste d'abord à former un modèle de factorisation matricielle, puis à augmenter le modèle à l'aide de vos notes. Si cela vous semble intéressant, vous pouvez jeter un œil à la mise en œuvre de MatrixFactorizationModel et voir comment mettre à jour le modèle pour les nouveaux utilisateurs et les nouveaux films.
L'implémentation ne m'aide pas du tout. Idéalement, je recherche quelque chose comme:
predictions = model.predictAllNew(newinput)
Mais une telle méthode n'existe pas. Je pourrais aller modifier le RDD d'origine, mais je pense que cela me demanderait de recycler le modèle, ce ne serait donc pas une solution idéale non plus. Il doit sûrement y avoir une manière plus élégante?
Où je suis en ce moment:
Je pense que je dois trouver la représentation latente du nouveau vecteur. Selon l' article original, nous pouvons calculer cela comme suit:
Ma tentative actuelle:
V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y
Cui = alpha * np.abs(newinput)
Cui = (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)
lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term = np.dot(np.dot(Vt,Cui),V)+lambdaI
term = np.dot(np.linalg.inv(term),Vt)
term = np.dot(term,Cui)
term = np.dot(term,newinput)
latentinput = term
Mais cela ne correspond pas.