A questão
Como posso prever a classificação de um novo usuário em um modelo de ALS treinado no Spark? (Novo = não visto durante o tempo de treinamento)
O problema
Estou seguindo o tutorial oficial do Spark ALS aqui:
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
Eu sou capaz de construir um bom recomendador com um MSE decente, mas estou tendo dificuldades para inserir novos dados no modelo. O tutorial altera as classificações do primeiro usuário antes do treinamento, mas isso é realmente um hack. Eles dão a seguinte dica:
9.2 Fatores da matriz crescente:
Neste tutorial, adicionamos suas classificações ao conjunto de treinamento. Uma maneira melhor de obter as recomendações para você é treinar primeiro um modelo de fatoração de matriz e depois aumentar o modelo usando suas classificações. Se isso lhe parecer interessante, você pode dar uma olhada na implementação do MatrixFactorizationModel e ver como atualizar o modelo para novos usuários e novos filmes.
A implementação não me ajuda em nada. Idealmente, estou procurando algo como:
predictions = model.predictAllNew(newinput)
Mas esse método não existe. Eu poderia modificar o RDD original, mas acho que isso exigiria que eu treinasse novamente o modelo, para que também não fosse a solução ideal. Certamente deve haver uma maneira mais elegante?
Onde estou agora:
Eu acho que preciso encontrar a representação latente do novo vetor. De acordo com o artigo original , podemos calcular isso assim:
Minha tentativa atual:
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
Mas isso não corresponde.