如何为ALS更新Spark MatrixFactorizationModel

时间:2015-05-28 14:22:14

标签: apache-spark machine-learning apache-spark-mllib collaborative-filtering

我为受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. 获取用户建议
  4. 我希望有这样的流程:

    1. 具有评级基础
    2. 生成模型一次(可选保存并加载)
    3. 获得一个用户对10部随机电影的评分(不在模特中!)
    4. 使用模型和新用户评分获得推荐
    5. 因此我必须更新我的模型,而不必完全重新计算它。有没有机会这样做?

      虽然第一种方式适用于批处理(例如在夜间批次中生成建议),但第二种方式对于几乎实时生成建议很有用。

2 个答案:

答案 0 :(得分:6)

编辑:以下对我有用,因为我有隐含的反馈评级,并且只对新用户的产品排名感兴趣。 更多详情here

您实际上可以使用经过培训的模型获得新用户的预测(无需更新):

要获得模型中用户的预测,可以使用其潜在表示(大小为f(因子数)的向量u),乘以产品潜在因子矩阵(由所有产品的潜在表示构成的矩阵) ,一堆大小为f)的向量,并为您提供每个产品的分数。对于新用户,问题在于您无法访问其潜在表示(您只能获得大小为M(不同产品数量)的完整表示,但您可以使用相似度函数来计算类似的潜在表示通过乘以产品矩阵的转置,为这个新用户提供表示。

即。如果你的用户潜在矩阵是你而你的产品潜在矩阵是v,对于模型中的用户i,你可以通过这样做获得分数:u_i * v 对于新用户,您没有潜在的表示,因此请使用完整的表示形式full_u并执行:full_u * v ^ t * v 这将近似新用户的潜在因素,并应提供合理的建议(如果模型已经为现有用户提供了合理的建议)

要回答培训问题,这可以让您为新用户计算预测,而无需对模型进行繁重的计算,现在您只需要进行一次。因此,您可以在晚上进行批处理,并且仍然可以在白天对新用户进行预测。

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

答案 1 :(得分:0)

好像你想做某种online learning。这就是您在接收数据时实际更新模型的概念。 Spark MLLib具有有限的流媒体机器学习选项。有一个streaming linear regression和一个streaming K-Means

许多机器学习问题在批处理解决方案中运行得很好,可能每隔几小时或几天对模型进行一次重新训练。可能有解决这个问题的策略。

一个选项可能是整体模型,您可以将ALS的结果与另一个模型结合起来,以帮助预测看不见的电影。

如果您希望看到很多以前看不见的电影,那么协同过滤可能无法实现您想要的效果。如果那些新电影根本不在模特中,模特就无法知道观看那些人喜欢的其他人。

一个更好的选择可能是采取不同的策略,并尝试某种潜在的语义分析电影和模型概念的电影(如流派,主题等...),这样的方式新的电影与各种属性并适合现有模型,并且评级会影响这些属性在一起交互的强度。