Spark ALS: khuyến nghị cho người dùng mới


10

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:

Xbạn= =(YTCbạnY+λTôi)-1YTCbạnp(bạn)

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 ...Cbạn

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.

Câu trả lời:


9

Rất nhiều câu hỏi ở đây. Đầu tiên, đối với một người dùng thực sự mới không có dữ liệu, không có cách nào để sử dụng mô hình đề xuất. Nếu bạn thực sự không có thông tin về người dùng, điều duy nhất bạn có thể làm là cung cấp một số khuyến nghị mặc định.

Tất nhiên, một khi bạn có bất kỳ dữ liệu nào bạn có thể xây dựng lại mô hình để kết hợp người dùng, bạn có thể đưa ra các đề xuất. Bạn có thể làm điều đó trong Spark nhưng bạn đã biết điều đó. Điều này sẽ mất quá nhiều thời gian nếu bạn cần thêm thông tin về người dùng mới khi chạy. Kỹ thuật bạn muốn được gọi là "gập", được sử dụng để tìm ra vectơ người dùng mới (xấp xỉ) được cung cấp cho các mục mà người dùng tương tác với. Nó chỉ là một số đại số tuyến tính và không tuân theo phương trình bạn đưa ra.

Tôi đã đào một slide cũ có thể giúp:

ALS Fold-In

"Cu" không thực sự khác biệt. Tôi đã thêm một 'phần mở rộng' để xử lý trường hợp đầu vào tiêu cực, nhưng nó cũng tương tự đối với đầu vào tích cực.

Đây là một triển khai thực hiện, mặc dù tôi nghĩ rằng nó sẽ quá dày đặc để có nhiều giá trị:

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/

Việc tính toán vectơ người dùng mới ngụ ý bởi tương tác mục người dùng là đại số tuyến tính khá dễ dàng. Phần khó khăn mà tôi tìm thấy là quyết định cân nặng bao nhiêu.

Hy vọng đó là một cú hích đúng hướng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.