Pytanie
Jak przewidzieć ocenę dla nowego użytkownika w modelu ALS przeszkolonym w Spark? (Nowe = niewidoczne podczas treningu)
Problem
Tutaj śledzę oficjalny samouczek Spark ALS:
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
Jestem w stanie zbudować dobrego polecającego z przyzwoitym MSE, ale mam problem z wprowadzaniem nowych danych do modelu. Samouczek zmienia oceny pierwszego użytkownika przed szkoleniem, ale to naprawdę hack. Dają następującą wskazówkę:
9.2 Zwiększanie współczynników macierzy:
W tym samouczku dodajemy Twoje oceny do zestawu treningowego. Lepszym sposobem na uzyskanie rekomendacji jest najpierw szkolenie modelu faktoryzacji macierzy, a następnie ulepszenie modelu przy użyciu twoich ocen. Jeśli brzmi to interesująco, możesz rzucić okiem na implementację MatrixFactorizationModel i zobaczyć, jak zaktualizować model dla nowych użytkowników i nowych filmów.
Wdrożenie wcale mi nie pomaga. Idealnie szukam czegoś takiego:
predictions = model.predictAllNew(newinput)
Ale taka metoda nie istnieje. Mógłbym zmodyfikować oryginalny RDD, ale myślę, że wymagałoby to ponownego przeszkolenia modelu, więc nie byłoby to również idealne rozwiązanie. Z pewnością musi być bardziej elegancki sposób?
Gdzie jestem teraz:
Myślę, że muszę znaleźć utajoną reprezentację nowego wektora. Według oryginalnej pracy możemy to obliczyć w następujący sposób:
Moja obecna próba:
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
Ale to nie pasuje.