Câu hỏi
Làm cách nào để dự đoán xếp hạng cho người dùng mới trong mô hình ALS được đào tạo về Spark? (Mới = không thấy trong thời gian đào tạo)
Vấn đề
Tôi đang theo hướng dẫn chính thức của Spark ALS tại đây:
http: //ampcamp.ber siêu.edu / big-data-mini-c thuyết / movie-recendend-with-mllib.html
Tôi có thể xây dựng một người giới thiệu tốt với một MSE đàng hoàng nhưng tôi đang vật lộn với cách nhập dữ liệu mới vào mô hình. Hướng dẫn thay đổi xếp hạng của người dùng đầu tiên trước khi đào tạo, nhưng đây thực sự là một hack. Họ đưa ra gợi ý sau:
9.2. Các yếu tố ma trận tăng cường:
Trong hướng dẫn này, chúng tôi thêm xếp hạng của bạn vào tập huấn luyện. Cách tốt hơn để nhận các đề xuất cho bạn là đào tạo mô hình nhân tố ma trận trước và sau đó tăng mô hình bằng xếp hạng của bạn. Nếu điều này nghe có vẻ thú vị với bạn, bạn có thể xem triển khai MatrixFactorizationModel và xem cách cập nhật mô hình cho người dùng mới và phim mới.
Việc thực hiện không giúp tôi chút nào. Lý tưởng nhất, tôi đang tìm kiếm một cái gì đó như:
predictions = model.predictAllNew(newinput)
Nhưng không tồn tại phương pháp như vậy. Tôi có thể đi và sửa đổi RDD ban đầu, nhưng tôi nghĩ rằng điều đó sẽ yêu cầu tôi phải đào tạo lại mô hình, vì vậy đó cũng không phải là một giải pháp lý tưởng. Chắc chắn phải có một cách thanh lịch hơn?
Tôi đang ở đâu:
Tôi nghĩ rằng tôi cần tìm đại diện tiềm ẩn của vectơ mới. Theo bài báo gốc, chúng ta có thể tính toán như vậy:
Nhưng khi tôi tính toán bằng cách sử dụng các giá trị trong bài báo, nó không khớp với các giá trị từ mô hình. Tôi sửa lỗi alpha và tham số chính quy, nhưng tôi nghĩ hàm ý MLLIB có cách triển khai . Nó được định nghĩa ở đây (xem dòng 1304), nhưng không thành thạo ở Scala, điều này rất khó để đảo ngược kỹ sư đối với tôi ...
Nỗ lực hiện tại của tôi:
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
Nhưng điều này không phù hợp.