Spark ALS:向新用户推荐


10

问题

如何在Spark训练的ALS模型中预测新用户的评分?(新=训练期间未见)

问题

我在这里关注官方的Spark ALS教程:

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

我能够用不错的MSE建立一个很好的推荐者,但是我在为模型输入新数据方面很挣扎。本教程在培训之前会更改第一位用户的评分,但这确实是一个技巧。他们给出以下提示:

9.2。增强矩阵因子:

在本教程中,我们将您的评分添加到训练集中。获得建议的更好方法是先训练矩阵分解模型,然后使用评分来扩充模型。如果您觉得这很有趣,则可以看看MatrixFactorizationModel的实现,并了解如何为新用户和新电影更新模型。

该实现对我完全没有帮助。理想情况下,我正在寻找类似的东西:

predictions = model.predictAllNew(newinput)

但是不存在这种方法。我可以去修改原始的RDD,但是我认为这需要我重新训练模型,因此也不是理想的解决方案。当然必须有一种更优雅的方式吗?

我现在的位置:

我想我需要找到新向量的潜在表示。根据原始论文,我们可以这样计算:

Xü=ÿŤCüÿ+λ一世-1个ÿŤCüpü

Cü

我目前的尝试:

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

但这不匹配。

Answers:


9

这里有很多问题。首先,对于没有数据的真正新用户,无法使用推荐器模型。如果您实际上没有用户信息,那么您唯一可以做的就是提供一些默认建议。

当然,一旦你有任何的数据,并且可以重建模型纳入用户,你可以提出建议。您可以在Spark中做到这一点,但您已经知道了。如果您需要在运行时添加有关新用户的信息,这将花费很长时间。您想要的技术称为“折入”,用于根据给定用户与之交互的项目来计算(近似)新的用户向量。它只是一些线性代数,确实遵循您给出的方程式。

我挖了一张旧幻灯片,可能会有所帮助:

ALS折入式

“铜”并没有真正的不同。我添加了“扩展名”来处理否定输入的情况,但对于肯定输入则相同。

这是折入式的实现,尽管我认为它将太密集而没有太大价值:

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

计算用户-项目交互所隐含的新用户向量是相当容易的线性代数。我发现的棘手部分是确定要加多少重量。

希望这是朝正确方向的推动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.