首页 文章

如何为ALS更新Spark MatrixFactorizationModel

提问于
浏览
14

我为受https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html启发的MovieLens DB构建了一个简单的推荐系统 .

我也有像这里的显式训练的问题:Apache Spark ALS collaborative filtering results. They don't make sense使用隐式训练(显式和隐式数据)给出了合理的结果,但显式训练没有 .

虽然现在这对我来说还不错,但我很好奇如何更新模型 . 虽然我目前的解决方案就像

  • 拥有所有用户评分

  • 生成模型

  • 获取用户建议

我希望有这样的流程:

  • 有一个评级基础

  • 生成模型一次(可选保存并加载)

  • 获得一个用户对10部随机电影的评分(不在模特中!)

  • 使用模型和新用户评级获得建议

因此,我必须更新我的模型,而不必完全重新计算它 . 有没有机会这样做?

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

2 回答

  • 0

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


    您实际上可以使用训练模型获得新用户的预测(不更新):

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

    即如果你的用户潜在矩阵是u而你的产品潜在矩阵是v,对于模型中的用户i,你可以通过这样做得到分数:u_i * v对于新用户,你没有潜在的表示,所以要充分利用表示full_u和do:full_u * v ^ t * v这将近似新用户的潜在因素,并应给出合理的建议(如果模型已经为现有用户提供了合理的建议)

    为了回答训练问题,这允许您为新用户计算预测,而无需对模型进行大量计算,而现在您只能进行一次 . 因此,您可以在晚上进行批处理,并且仍然可以在白天对新用户进行预测 .

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

  • 6

    看起来你想做某种事情online learning . 那个's the notion that you'实际上在接收数据时更新了模型 . Spark MLLib具有有限的流媒体机器学习选项 . 有streaming linear regressionstreaming K-Means .

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

    一个选项可以是一个集合模型,您可以将ALS的结果与另一个模型相结合,以帮助预测看不见的电影 .

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

    一个更好的选择可能是采取不同的策略,并尝试某种潜在的语义分析电影和模型概念的电影(如流派,主题等...),这样的新电影具有各种属性和适合进入现有模型,评级会影响这些属性在多大程度上相互作用 .

相关问题