问题
如何在 Spark 训练的 ALS 模型中预测新用户的评分?(新 = 在训练期间未出现)
问题
我在这里关注官方 Spark ALS 教程:
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
我能够用一个不错的 MSE 建立一个好的推荐器,但我正在努力解决如何将新数据输入到模型中。该教程在训练之前更改了第一个用户的评分,但这确实是一个 hack。他们给出以下提示:
9.2. 增强矩阵因子:
在本教程中,我们将您的评分添加到训练集中。为您获得建议的更好方法是首先训练矩阵分解模型,然后使用您的评分来扩充模型。如果你觉得这听起来很有趣,你可以看看 MatrixFactorizationModel 的实现,看看如何为新用户和新电影更新模型。
但是,实施对我一点帮助都没有。理想情况下,我正在寻找类似的东西:
predictions = model.predictAllNew(newinput)
但不存在这样的方法。我可以去修改原始的 RDD,但我认为这需要我重新训练模型,所以这也不是一个理想的解决方案。肯定有更优雅的方式吗?
我现在在哪里:
我想我需要找到新向量的潜在表示。根据原始论文,我们可以这样计算:
但是当我使用论文中的值进行计算时,它与模型中的值不匹配。我修复了 alpha 和正则化参数,但我认为 MLLIB 实现有不同执行。它在这里定义(见第 1304 行),但不擅长 Scala,这对我来说很难逆向工程......
我目前的尝试:
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
但这不匹配。