Іскровий ALS: рекомендований для нових користувачів


10

Питання

Як я можу передбачити рейтинг нового користувача в моделі ALS, що навчається в Spark? (Нове = не бачилося під час тренувань)

Проблема

Я переглядаю офіційний підручник Spark ALS тут:

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

Я в змозі створити хороший рекомендатор з гідним MSE, але я намагаюся ввести нові дані в модель. Підручник змінює рейтинги першого користувача перед навчанням, але це справді хак. Вони дають таку підказку:

9.2. Коефіцієнти матриці збільшення:

У цьому підручнику ми додаємо ваші оцінки до навчального набору. Кращий спосіб отримати рекомендації для вас - це спершу підготувати модель факторизації матриць, а потім доповнити модель за допомогою своїх оцінок. Якщо вам це здається цікавим, ви можете поглянути на реалізацію MatrixFactorizationModel і подивитися, як оновити модель для нових користувачів та нових фільмів.

Хоча реалізація мені зовсім не допомагає. В ідеалі я шукаю щось на зразок:

predictions = model.predictAllNew(newinput)

Але не існує такого методу. Я міг би змінити оригінальний RDD, але я думаю, що це вимагатиме від мене перевдосконалити модель, так що це не було б ідеальним рішенням. Напевно, повинен бути більш елегантний спосіб?

Де я зараз:

Я думаю, що мені потрібно знайти латентне зображення нового вектора. Згідно з оригінальним документом, ми можемо обчислити так:

Ху=(YТСуY+λЯ)-1YТСуp(у)

Су

Моя поточна спроба:

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

Але це не відповідає.

Відповіді:


9

Тут багато питань. По-перше, для справді нового користувача, який не має даних, немає можливості використовувати модель рекомендації. Якщо у вас буквально немає інформації про користувача, єдине, що ви можете зробити, це надати деякі рекомендації за замовчуванням.

Звичайно, щойно у вас є будь-які дані, і ви зможете відновити модель, щоб включити користувача, ви можете давати рекомендації. Це можна зробити в Spark, але ви це вже знаєте. Це займе занадто багато часу, якщо вам потрібно буде додати інформацію про нових користувачів під час виконання. Техніку, яку ви хочете, називають "складовою", яка використовується для з'ясування того, який новий вектор користувача (приблизно) з урахуванням елементів, з якими користувач взаємодіє. Це лише якась лінійна алгебра і випливає з рівняння, яке ви даєте.

Я викопав старий слайд, який може допомогти:

Складне введення ALS

"Cu" насправді не відрізняється. Я додав "розширення" для обробки випадку негативного введення, але це те саме, що і для позитивного введення.

Ось реалізація складної частини, хоча я думаю, що вона буде занадто щільною, щоб мати велику цінність:

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

Обчислити новий вектор користувача, що має на увазі взаємодію між користувачем і предметом, є досить простою лінійною алгеброю. Якась складна частина, яку я знайшла, - це вирішити, як її зважити.

Сподіваюся, що це поштовх у правильному напрямку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.