相关疑难解决方法(0)

如何为ALS更新Spark MatrixFactorizationModel

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

我也有像这里的显式培训的问题:Apache Spark ALS协同过滤结果.它们没有意义 使用隐式训练(在显式和隐式数据上)给出了合理的结果,但是显式训练没有.

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

  1. 拥有所有用户评级
  2. 生成模型
  3. 获得用户推荐

我希望有这样的流程:

  1. 有收视率的基础
  2. 生成模型一次(可选保存并加载)
  3. 一个用户在10部随机电影上获得一些评分(不在模特中!)
  4. 使用模型和新用户评级获得推荐

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

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

machine-learning collaborative-filtering apache-spark apache-spark-mllib

15
推荐指数
2
解决办法
2806
查看次数

ALS 模型 - 如何生成 full_u * v^t * v?

我试图弄清楚 ALS 模型如何预测新用户在批处理更新之间的值。在我的搜索中,我遇到了这个stackoverflow answer。为方便读者,我复制了以下答案:

您可以使用经过训练的模型(无需更新)获取对新用户的预测:

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

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

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

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

上面引用的文字是一个很好的答案,但是,我很难理解如何以编程方式实现这个解决方案。例如,矩阵 u 和 v 可以通过以下方式获得:

# pyspark example

# ommitted for brevity ... loading movielens 1M ratings

model = ALS.train(ratings, rank, numIterations, lambdaParam)

matrix_u = model.userFeatures()

print(matrix_u.take(2)) # take a look at the dataset
Run Code Online (Sandbox Code Playgroud)

这将返回:

[
  (2, array('d', [0.26341307163238525, 0.1650490164756775, 0.118405282497406, -0.5976635217666626, -0.3913084864616394, -0.1379186064004898, …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-ml apache-spark-mllib

8
推荐指数
1
解决办法
2694
查看次数