如何更新Spark ALS的MatrixFactorizationModel

15
我用https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html中所述的方法为MovieLens数据库创建了一个简单的推荐系统。
同时,我在显式训练方面遇到了问题,就像Apache Spark ALS collaborative filtering results. They don't make sense中所描述的那样。使用隐式训练(在显式和隐式数据上)可以给出合理的结果,但显式训练则不能。
目前这对我来说还可以接受,但我很好奇如何更新模型。虽然我的当前解决方案是:
  1. 拥有所有用户评分
  2. 生成模型
  3. 为用户获取推荐
但我希望流程变成:
  1. 创建一组基础评级
  2. 生成模型一次(可选项:保存和加载它)
  3. 由一个用户对10个随机电影进行评分(未包含在模型中!)
  4. 使用模型和新的用户评分获得推荐
因此,我必须更新我的模型,而不完全重新计算。有没有可能这样做?
虽然第一种方法适用于批处理(例如夜间批量生成推荐),但第二种方法适用于几乎实时生成推荐。

请参考类似的问题:https://dev59.com/oV4b5IYBdhLWcg3wvkA- - Chris Snow
另外,https://dev59.com/Q5zha4cB1Zd3GeqPK9R4?rq=1 - Chris Snow
2个回答

6

编辑:以下方法适用于我因为我有隐式反馈评分,并且只对新用户的产品排名感兴趣。

更多细节请参考这里

你可以使用训练好的模型(无需更新)来预测新用户的评分:

要得到模型中用户的预测评分,你需要使用其潜在表示(大小为f(因子数量)的向量u),将其乘以产品潜在因子矩阵(由所有产品的潜在表示组成的矩阵,一堆大小为f的向量),并为每个产品给出一个分数。对于新用户,问题在于您无法访问其潜在表示(您只有大小为M(不同产品数量)的完整表示),但您可以使用相似性函数通过将其与产品矩阵的转置相乘来计算此新用户的相似潜在表示。

例如,如果您的用户潜在矩阵是u,产品潜在矩阵是v,则对于模型中的用户i,您可以通过执行以下操作来获得分数:u_i * v。对于新用户,您没有潜在表示,因此取完整表示full_u并执行以下操作:full_u * v^t * v。这将近似新用户的潜在因子,并应该给出合理的推荐(如果模型已经为现有用户提供合理的推荐)。

回答培训问题,这使您可以计算新用户的预测,而无需进行模型的大量计算,您现在只需偶尔进行一次即可。因此,您晚上可以进行批处理,白天仍然可以为新用户进行预测。

注意:MLLIB允许您访问矩阵u和v


我基于这个链接添加了一篇新文章:https://dev59.com/w57ha4cB1Zd3GeqPdAMt - Chris Snow

1

看起来你想进行某种在线学习。这意味着在接收数据的同时更新模型。Spark MLLib的流机器学习选项有限。有流线性回归流K-Means

许多机器学习问题使用批处理解决方案就可以很好地解决,可能每隔几个小时或几天重新训练模型。可能有解决此问题的策略。

一种选择可能是集成模型,其中您将ALS的结果与另一个模型相结合,该模型有助于预测未见过的电影。

如果您预计会看到许多以前未见过的电影,则协作过滤可能不能满足您的要求。如果那些新电影根本不在模型中,则模型无法知道那些观看过它们的人喜欢什么。

更好的选择可能是采用不同的策略,尝试对电影进行某种潜在语义分析,并对电影的概念进行建模(如类型、主题等),这样新的具有不同属性的电影可以适应现有模型,并且评级会影响这些属性之间的相互作用强度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接